Submitted By: William Harrington (kb0iic at cross-lfs dot org) Date: 2013-06-07 Initial Package Version: 7.3 Origin: Upstream Upstream Status: Applied Description: Contains all upstream patches up to 7.3.1140. diff -Naur vim73.orig/.hg_archival.txt vim73/.hg_archival.txt --- vim73.orig/.hg_archival.txt 1970-01-01 00:00:00.000000000 +0000 +++ vim73/.hg_archival.txt 2013-06-07 17:07:05.315660159 +0000 @@ -0,0 +1,5 @@ +repo: 770908d1cb47c04be0aef5c173b17ab8be6b6476 +node: 6a602c36cb7c5b3af71fb242f8b9ac6fe3afd779 +branch: default +latesttag: v7-3-1140 +latesttagdistance: 1 diff -Naur vim73.orig/.hgignore vim73/.hgignore --- vim73.orig/.hgignore 1970-01-01 00:00:00.000000000 +0000 +++ vim73/.hgignore 2013-06-07 17:07:05.368993340 +0000 @@ -0,0 +1,56 @@ +syntax: glob + +# Unixen: object and executable files. +*.o +src/vim +src/xxd/xxd +src/auto/if_perl.c +src/tags + +# We do need src/auto/configure. +src/auto/config.aap +src/auto/config.cache +src/auto/config.h +src/auto/config.log +src/auto/config.mk +src/auto/config.status +src/auto/configure.aap +src/auto/osdef.h +src/auto/link.log +src/auto/link.sed +src/auto/pathdef.c + +# Windows +*.exe +*.idb +*.manifest +*.exp +*.obj +*.pdb +*.ilk +*.sln +*.suo +*.res +*.RES +src/if_perl.c +src/pathdef.c +src/Obj*/pathdef.c +gvimext.dll +gvimext.lib + +# All platforms +*.rej +*.orig +*.mo +*.swp +*~ +src/po/vim.pot + +# Generated by "make test" +src/po/*.ck +src/testdir/mbyte.vim +src/testdir/mzscheme.vim +src/testdir/lua.vim +src/testdir/small.vim +src/testdir/tiny.vim +src/testdir/test*.out diff -Naur vim73.orig/.hgtags vim73/.hgtags --- vim73.orig/.hgtags 1970-01-01 00:00:00.000000000 +0000 +++ vim73/.hgtags 2013-06-07 17:07:05.388993283 +0000 @@ -0,0 +1,2479 @@ +004eb98eb3c30714cb6a24ec3e810275080a8413 v7-1-117 +006e9c8a6a8ad354a5cb6adcce6ebfceddeb20ee v7-0079 +010397e1770eec8ff399cfc3bbd79f853849ffc1 v7-0160 +0137e7c3d31b09f1c1e494405f3f99f6423b74cd v7-0196 +0139403c8eb088d58773f7e76dc2a025719a8e8c v7-3-135 +01583c79d5f4d3f29d4c33dd10dd29efd349cad0 v7-0d03 +01762f635babb0fecb3a9f04549a54e86f67cf8b v7-1-047 +01a0da54773eb2af0215762629db5c6eed01ba06 v7-1-138 +021f9d0f60a1700989e2deeab78da32837c1041b v7-2-079 +028158b1362b55a23cc6d8d086976c4dfd6e094a v7-0090 +033e7b49356c11b2d9cc45dec6dc3d695d7ef95a v7-3-083 +0358abf2b5d4ab5981a5a1dd651ecf63d40ffbfb v7-1-315 +03714c67a82b8557cb8ee0789cbced75d804d949 v7-2-134 +039ce9407934bd97142aab06c5d1869d8e2ba3c7 v7-0-032 +03b3684919e3299ff560609c0c5f577822f64614 v7-0084 +03c191181749e422b375fbb8cd0763dede7d9beb v7-2-313 +03c4ceec6bec956646c07390aa09052cf5f0468f v7-0-054 +03d49a7c83196a406cbd12f4898fc988731af927 v7-3-010 +03ec0f2b9a403b1cbc494eac6c038076ece0b37c v7-1-242 +04265ffbda1f9b14729bc5d85069ff0711ce3744 v7-1-210 +044d5e9b1292f694e73ae929eeceaa9685fa0580 v7-2-194 +04613e770ec0bd536f04c0fb6d80b76e1af1d6e4 v7-2-189 +048f26eb43a348e49fc4f9deaca03779c2de595e v7-1-082 +04943f31135747da59cbed2b39fb109dd2796426 v7-0-165 +04fc2a0e98ed7af6ee11a2025d6a0c877114c039 v7-2-057 +057029bf347002408541ec73da1373ae64002a3f v7-2-338 +05952d133506353938f50f0b22b0097b6cdf0afd v7-2-095 +05b48b16b627b63ee0f6dda7d7f07704c3d2fe64 v7-1-198 +05c8ff7f128406d2d6052abbf5b92635d3cb0284 v7-2-162 +05dc93b9c61f63c1691849fe7407c9472a7f6288 v7-0208 +0606065af0a02f79b43b4a89383b04c21e2f0be3 v7-3-111 +062104a823df0f5a225b327b00a3766e41e4610f v7-2-201 +06234af3a8b7df68bfaf0efa87edfed2d743f6c7 v7-0106 +06317850ad3acd03765fc0f8002f17417773d906 v7-2-045 +066778e39c2ae6bbf23708d98e1a7a7e53a9a6d0 v7-1-232 +0670d0df210a891f82d38c38f1b3b256dd1a5f8d v7-2-017 +0691866e6cc92996f4fbc881e134248571ae7c82 v7-1-180 +06959e7212e521904f3b7d75bac5005b9f44bde3 v7-0-077 +06aa43dde5610dff598940ccde1dd25a617a1a52 v7-3-006 +06bc859d1a32de8763e310669d0c008b3945af1c v7-0049 +06e0f7482cef3412ecb4b0b62b65b1e7c4ed92b2 v7-1-052 +071166147fc55311bb86bc9367aca005c4a1447c v7-2-299 +0713c530729ba6d2bdc9fdb4fd400f46b16c37be v7-1-169 +073f98f45a447a137c2e2d74f936a9e26179ce1b v7-0-035 +077c15286de8e37250ed1337a448c740c86ee740 v7-2-293 +07d199fe02ed46fff935b2daa4efc979eacaab4c v7-0209 +07de57cbcb25d63bf515b67de654dd89004888fa v7-2-327 +08012a1ff8d4b4f5736a47440a907ec6e5e1610d v7-0137 +0836531167ab2f1cd48382b093c3080c3bc47786 v7-2-059 +0868e4e53fb2e9f9bd469fae0323a1df43be476b v7-1-029 +0887e8a13e5f33db2f832a52654a0d1fa82f322f v7-3-109 +09cc86b6665358a20d9faf54ce8eec45ca4fc5de v7-2-387 +09d0e83c29b805f127c6756231bb4adfb1b2974c v7-0-130 +09f00d57222b6d8de104660ea3f9c6bb42b9d31a v7-2-172 +09fcdfde9afca8990c086e60fe5e122cb258cadc v7-0-046 +0a1d45e2d8e30fc0aef25d5fd7505840d1e0e836 v7-2-258 +0a60be12e47e322c4dbae7b083321c60f599c0b8 v7-0125 +0a80dc6d78048478d4e7f0f99f573c947d5d95c0 v7-1-131 +0a908b65de1dbebbde1aacfd50aa41ef09e6865e v7-2b-012 +0a9371c70540d0d42c79a1d76e590fa2ccb978b3 v7-0220 +0b056c1350dd2ff28249130194d9a2be7b606a86 v7-0-193 +0b1b7560c456a32ad921e3985b90008ef1f82a91 v7-0174 +0b211ebefd4e6ee52ae81a75938b4ee61ca15770 v7-0-071 +0b42546f036bb3ff8023b6015a5acf032a2ae1f1 v7-2-076 +0b4a515b125474db496caa0be22a28e8bd99c88e v7-3-132 +0b796e045c429253e9ce8825ad05aad2474553bd v7-2b-000 +0c0a2b25d10aaaf556344d7404d12aba81632cf4 v7-0-015 +0c381fb7846cda92fbdb327bbfe4ab1f73a86d8d v7-0214 +0c39ff7a90a81c62f2718f71bf0a4d636a8ac69c v7-3-127 +0c4a465bd7419d51017354b70ead01c18b589e9d v7-2b-029 +0c61c201ba76d7235913010395e065991ac059b9 v7-1-196 +0c6c64edcbe0481659fdd91f6312296e7c1bb303 v7-2-052 +0c7d6d01e0582b54f34ab66852116d559c39550c v7-3-101 +0d0bf7598dcb63fdb5be9300f407e043102ab895 v7-1-256 +0d31f8a78ab35b256359b6ae53c80cecce59d44c v7-0-143 +0d6554dfc71e5e58866ef0118ed05007a4c59672 v7-0061 +0dbc46d14443418020e3868a08877a365ced11e1 v7-2b-028 +0de47f0d731e32af52784171986734b735ac626f v7-3-051 +0e3bd80a3f74a99241a4857685912dc8efeb9bdf v7-1-286 +0e3e208b4b901f22beecc85c5781170f3c4e5351 v7-0-104 +0e3e601e66cf233986924652f7801dc8d2568a84 v7-1-288 +0e45a0c50acaa31dd4052c57053bb86afd4e711e v7-2-154 +0e4631bf94411717193870a5ad7d62945d06cadc v7-2-377 +0e4c64dfc61141a68b83b5204a160b5c01986279 v7-2-125 +0e4fa55d20e025a70e3e6b82abc58333902c45db v7-2-040 +0e57be57fa49a0d2c0b7f17b7cb137b4260b79d6 v7-0-207 +0e5eb96dc18ce7986eadf32bb700e503da52ae47 v7-1-142 +0e6b369b9760459289b84a9c2e07478c063cd386 v7-1-126 +0e902b8f511f0442ee2b28314d6e085e3e00798e v7-0051 +0eef0f62181190700a01129a88f693503ae94947 v7-2a-006 +0ef5b70c3eaf694c9e9b85aed3f80af53e6fd9cf v7-0045 +0ef9cebc4f5d1c00554543918fea2a0b7539b922 v7-0031 +0f109c56b521834af0d9492b21d0ef1ead5b01ef v7-2-014 +0f3f3090491faea043fa144780d1287e011390ac v7-1-205 +0f552ca271c27681ed126261ce49e52ef144175e v7-2-393 +0f9f4761ad9cafbf1e72de338aa3fc59f1dd693d v7-0216 +1002128c68dbe2f69466b1b2cb354b00eec2980b v7-1-109 +103dea6545430092db1851d1b712a742af1a74f2 v7-3-017 +10a1b67c0885aabdac7c76a96169cd9e36414428 v7-1-068 +10ce04af8c5b26e55cd2157408883d9ed79b9a3d v7-3-021 +10d7ebdbe8a3a9787360b21a9836c6bae6a6a7a2 v7-0-169 +11155435487064d64efb296f7c2966baae8d27e3 v7-2-402 +111e109dad1301c7699d18e5689f1842f4b67e6c v7-0b01 +11472bbcdb6e2effe1c248d09b4d7089fa7a26d2 v7-2-183 +11a74d2cab9dbe41af2ed5d08b18fbdac14f6e43 v7-2-147 +11c004cc1a4df89b9246a96106db6c6f0260b7d8 v7-0-241 +11c6bda3b53abb2c98ed9221ba89880eeef7514f v7-2-268 +125e80798a85dbead9a91815cabd1d0aed63f455 v7-0021 +1287e2bbeb405c10201d4caa6b2dab284f84efbf v7-2-207 +12aba62fa7c6812ec46eb3be6759d82a4a651a93 v7-2-422 +12f9cd68b9c3aaf3659d9219551a5822cf798857 v7-1-257 +131dbd3d2a4bba5d1514c2842952ca7b77b6902e v7-2a-019 +1324b7b755f3b5570ce9aa7fb27c075c89a1d2df v7-1-322 +134c7695af324bd4118f52b9235aeff7e374a425 v7-2-121 +1378bc45ebe5754c0d3ec64d37810eaad3a544f3 v7-2-348 +144ad7f25f6741815c8297fe77965f93ee359c2a v7-0-118 +15130d4dfea14898029686b72536f54197a73062 v7-2-117 +15146eaa0e9c6dd6802cf70a2da3b220992eda1e v7-0-001 +15154710ed57eab29f7e4b848eafe63ea2dfdf85 v7-1-140 +151a805b2ddc219d4a968154a43daefbb2e41fe1 v7-1-081 +152883db0edf63f35e8459dcc5862ef3f4b48c9e v7-1-321 +152e526245217fedd07f0480e08ea59b0075a8b0 v7-1-001 +15674e198164c10b08e138f4c18b58e76306d9be v7-2-389 +158a68529622f90d0b0f1f5596f55cc5ce06c9ee v7-2-060 +159d87361e4b0d99c3863b3c82b7121a474cdf1f v7-1-168 +15e847397be75c6b0590505a9e201c793d070eee v7-2-205 +165c628aa9fc3cca34ccf63dc8ab953745d4e228 v7-0108 +169533a9699fa7d3fd67b57ad99d04076d060831 v7-0g02 +17526daaf79dbf2004c78311abdad05e6e3070dc v7-2b-021 +1780e6046802498a3c4d0ddc7b99f1bd9ac75f31 v7-0-157 +17a83c0532e83e9f4cd89f03dcbf206662d25b1f v7-1-062 +17b9587ff6d5beef34d98043ca5f3111e5d29e4d v7-0-202 +17b96d8dcc5c8356e10135f5735d6de2fa5da3e8 v7-2-038 +17c88d44ace9bc9e76485811ffa459b5c15a6bb7 v7-1-234 +18061514324fefb37ea7a7e7783985004ea0874d v7-3-084 +183c3187b20dbc6ecc74958e9ba141f0d4f72d23 v7-0-205 +184a6091124e80e1c9f66ed0908deab552ca369c v7-1-220 +184d2020d8f12823a2f2cb96335a68ac1bda3270 v7-1a-001 +18ee39301b822de39caf5fa023107ddf508b42e0 v7-2a +18f024844150562a9e56522edcad3fc1d5c257e4 v7-0086 +19106f131c872dc79bb409ffe8b5e35ebe885c1b v7-0188 +196d564759eb256f62e7fb7ec4561c1e2d533726 v7-2-072 +198a695ca8e7273641991bcf346085bbce70d740 v7-1b-001 +198ea7a9c633089ef2638513d05611a9d1b6e39c v7-1-182 +19ed3bfbe488a730858d0d26b433029b85e231cd v7-0-159 +19ef2bbf569cba64ae5125d5b1f3f205efc25e89 v7-1-263 +1a00e831244b1e509286ea35a586c6c43dcdaaaa v7-2-202 +1a040c25c44485c85e838a7530051f6d4f9793a2 v7-2-123 +1a0d346695fa3525a08a27174fbdf016afdbb9a9 v7-3-085 +1a44839049aefb0722d43a87d7ed1708c9c94b18 v7-0229 +1a511b7b69ebdf866088b9e765dc42543cd76d0a v7-0-212 +1a85f952cdfe4716be162e308fbccb0117489915 v7-0195 +1a8b518bb993e00f546c4cef8bae9b51f91fe0d7 v7-2-198 +1aba098d6abc680214b3b31c954abd53ddc772ef v7-0-039 +1b55bbf5c58077e54b83307bbe715e131c57b750 v7-1-219 +1b7cac059babfb3365c0a44c0537c7aa9b286a71 v7-0172 +1baac9d06c83400c474e6484dc20229187d27a64 v7-3-024 +1bb06e6512a2fc961eaf9a8e7a749247c408e7f6 v7-2-358 +1bc46149d9195d9134d526ef524242ede65c2457 v7-1-167 +1bdb13b8e947b85e612afec3a1b5e09c29c30551 v7-2-039 +1c00ea3641a8a1e58e70cd51ab831003bdb41d50 v7-3-005 +1c1cbdc42f75d8fa0ca5a799b5e843e9aa2c098c v7-0077 +1c4ec9ed71caf24dbec13f6d3d4adbb48bce9436 v7-3-056 +1c586ee8dd452d305bebf633d5b8c78ba1ab170d v7-0183 +1c597397f0061fd2c750c65c961a31f70dd6747f v7-1-269 +1c64bf25bbcd49a83cc08dd60a6c3e5785266790 v7-2-247 +1c7a66d820e4dc9b0a9f696ed6e7a59cd9a20e19 v7-2-360 +1c85355293f92cd8bb41eaf6ce8a8be1d77302f1 v7-2-062 +1ccc1ace9e5b6c1223ba191ce20729a49f13970e v7-3-050 +1cdd2661f34c2aa93ae2f0317194d29d3a43f5be v7-0d01 +1d0ef79659afec337c26655216a1debbd1c74497 v7-0-002 +1d12208efb3732d6f520b05a47283208f12e3856 v7-0-209 +1d4c67f8470981d280aaf1d2a25877a00ec5d240 v7-1-084 +1d6d99daf4dcba733e5517045f70e53c185aa895 v7-1-165 +1d7f46148bf4ec36a42e959cece1f9f6199a87a7 v7-2b-006 +1da25369227bead09cf603ebfa93ebe1d206c871 v7-2-345 +1dd4e0ccd822156b87516f9cd5a6a004d0d85a11 v7-1-278 +1ddec6983d9ebdb4f7a748cc171199cc8ad3d1e0 v7-2-036 +1de53700b1d9f26a420a319d9c44ba0c43950035 v7-0-127 +1df41c98fc2e9a230ab9d05be84f4c91e4078619 v7-0-239 +1dfe9032bd92ef7ab7bf0baf0f0c1f61da68bce6 v7-0-131 +1e25b58fbf7babbbe054e118617a49790f532fd4 v7-2-024 +1e52efdc900cab1dd64f6a987bbe5117fa1f9748 v7-2-270 +1ee00a062acbd04360de8b754e834f7ef6025328 v7-2-246 +1f099ff4f6fb2b0731bb38e279d0c692ee05df8d v7-1-129 +1f3902f3eb5c20e7872c42cdee9c91e2b25d3f47 v7-0038 +1f3b1021f002ac9703c1de0e80703b8067546a41 v7-0e05 +1f53050b38688e127c4ea67251ab2730002541bd v7-2-294 +1f90fab89ce32126849aa28d2918bae96603f3bd v7-2-069 +1f929f3ca8066b3170c7a58c414837d47bef707e v7-0c03 +1f93fbcb4e0cf1dcd8682242f40aa5f2906c42ac v7-1-201 +1f9e2c8e642a29d93b9c32062c785f4c38883e0c v7-1-034 +1fbbe04a950f9ed82b53ddf67d8e034224fc98ad v7-2-286 +1fc8d918d9fc076304ef0dbaad897e8e5b6ba4ab v7-2-093 +200b706675a56daad05f8b0d60991825c45b6e2d v7-1-183 +20308f30826db09e99d531214eaaf03ea8b13d15 v7-0-162 +205a26fab11655d086ce185525193d16f37d60b5 v7-1-203 +20b2e52ca96255a8d99ed9504e90a960266c4d21 v7-2-009 +20b4b6a2a212584f182a2d69a37512bf9094d85e v7-1-279 +20b52d44daafbd65b01db735c4d5597ccb9e386d v7-1-130 +20c18291deb21dcc69b6ceb3c11c309a92396fb4 v7-2-302 +20d9fc2f13a4132d6344fb6457040b02720774cf v7-2-403 +215d6b2a1816a5eaf5f5d2cb7cb1b22d24adbdab v7-1-159 +217c9aa4c3ba6ea559ec5675871d6d89313363e8 v7-2-114 +21b11491a33fee3cd77dcfcc2448382f060543f2 v7-1-156 +21c3634c211345ea79e90c4927513e7dc1381617 v7-0134 +21ce954cbdcac9dea2aa826ff40adc2fb2184600 v7-0-201 +220a9309067dfc6e7e8301b392c3499054666396 v7-1-266 +2244be18d9e9ce602a12e7529614c25ca8cef1ee v7-0162 +22886f3d882d231a528dcc012c23e54180c8248c v7-1-040 +232a4740aa0ed615c52b289a111b51171e74a78f v7-0-005 +2392a6da4aa430f896451d97da8c49ed3fcdb9cb v7-0186 +23aeaff961412f06544babde36a80a6c22be0fd9 v7-1-307 +23d23246742e7d301d09f0cb03533226b64043b4 v7-0-219 +23d366df193868572eacd04e1a32bc2283a30e56 v7-2-335 +23f82b5d2814be7ca4dee000226bd67dc6cd02cf v7-0c10 +24100651daa9d7140d33f298c987c9d42bd919bf v7-2-411 +2430fc9a18d1270a5ad7b5f7acac3e19aa8908fb v7-1-306 +2448f4c8afc65a91130fa0237c253e6698481c64 v7-0-055 +24b7b3cc4eec4387713a615519489fa5a34b253d v7-1-251 +24eb7921b8f004c8c462297cf53afad8f5578243 v7-2-367 +251307ebe1dbacd972e35e923f7360d12733f2b7 v7-1-049 +25154b22dc967b158645be9cb87017f548ee5446 v7-0-198 +2548cf0a5f625110a5cd42ee5566c2709c2c34f0 v7-0-011 +25bc02d83cf438d5794ce106edad2959e2f89454 v7-1-292 +25dd5036f2b0b5e68492c49f15eaa228aa957f69 v7-0092 +2651e7d07cd631af64818f5d3cf5dbb199fa6f64 v7-0-140 +266f9d9f5109421afcbc8169896b484ff7a19a8d v7-3-061 +26876d0f15e9294aa4fcbfc43260a5f2a703e313 v7-2-256 +26b0b2f606d2953068951dca673d963b7c5cccb7 v7-1-122 +26cbd39f22513d82cc43d2b1badefcea8db1c546 v7-1-103 +26d879bcab3aa016ccaf77cfd3a9aa5085d4776e v7-1-284 +26fb122355d4d6b04850f7608f1d82da8dbc51c7 v7-3-107 +26ff011aec2dbc96736396430403d572d4f111d5 v7-0-172 +27060fe297d0ce872dfa3bc20416f7189b9fbc59 v7-2-273 +2750661e93d556868d97f49fae32a1f470bca107 v7-1-253 +27621abffed24f1e2849ea616f91f0a99747608f v7-3-099 +276244befa5b2a34893ba581818df14cd7e4504e v7-1-189 +2775dcd056031e0a7314da9a9e0b2cebbb089525 v7-2-426 +27782797c331b8800c12ad17c5d05adab5e92edb v7-1-107 +2787b8483e6498f536e66ac134a073246ab6f5e4 v7-0-125 +279380a812add1307a2a20c444f2334b7a45106d v7-2-412 +27d8fe1c096407ddca428c52f62d002dfed7879f v7-2-090 +2832243e801ec537589809059f65efb3b8a57f93 v7-2-399 +28398206597f975583c9f8f212d336fc9f67953f v7-3-089 +28558ab31051fc1870ac690c0b576ca9365021f5 v7-1-202 +28641f0ed9deb579934416e6161260d4d218f394 v7-2-211 +288fb648badba86a0bdce6dbcecb55eb386263ab v7-2-128 +289b19a6f2edb5b46df57195d5fae41dfe963290 v7-0103 +28d0c20ad8a09dd63fa34768eac4be3cf96ed239 v7-2-051 +28e9eb0f2d849e7e32d70b4e1f06dad812288578 v7-2-077 +2928a6b338c3f434723520a12fa378895d4b24cf v7-2-187 +2930fd8e7d9f1514448261365b787501dbd9a0b7 v7-0171 +293621502c4daa122ae601398d854857bb732a83 v7-0010 +2951f28a9bd3b08c5be9bc9b3745f062b95635b8 v7-1-192 +2981ad79c362bff0c21d3ff0d68be57213bca837 v7-0-025 +29bf49bad20d3b1ad35af5cf21d91c4aa486d4a5 v7-0-068 +29c09fa57168acd665a85ed5a210b48b60d0b5e2 v7-1-211 +2a11407a5a8f4efccc04dfde8a61e40ec5eb9fc5 v7-2-066 +2a256978a64649b75d424eec6e703f99f7f28636 v7-1-003 +2a8bf2ba504f422d53dac30da8b58d76e54b4428 v7-3-003 +2a9d26c95a2a9b2f1a279e04de22ee4c7298552c v7-3-077 +2ab007070fc86d20596dfbded70d0f986c084304 v7-1-113 +2ae2dd2591fae798e4212e9b2c47281eca0c8483 v7-1-055 +2b273c71a14b7d0e64b6ae9bdcf60ef7e4d45aa8 v7-2-415 +2b475ed86e6491b20046d5c34fec8ea86988dade v7-3-074 +2b4debdc8d2c73d1fc37b750010e3a4098b035af v7-0035 +2b913f7eb9d2b411f9ef2c0fa44f313b7382bd89 v7-0039 +2bd29808d1f640f027ab7a4a4f2b5b6a0e6c8e38 v7-2-429 +2bd96108392ec08b6c384893939968d94bab4dbb v7-2-351 +2bebfa810a66caed9562541776d92f73a71de7f1 v7-0-091 +2bfc2b7033147de9689cf2d651bd8ef36fdac68b v7-0078 +2c1ffe8953ee85cf04d4db5c03ab711c1c6c015a v7-0080 +2c4ca49319a689ad9caa4429cd90bceda4e210a3 v7-1-271 +2c5e70e2858fa46c7b80b022f217103b8c90e9e9 v7-3-016 +2c885fab04e31a34d91e4375d2d0397cadb818ce v7-0e06 +2cdbc91795ca0d15343fe954ae2af71f830f9656 v7-3-007 +2cdccc96d730501ce4e509e7efe4f8fd3f2b2e29 v7-1-150 +2ced59eaf1e5c67060fe124902407a8bf77a1a78 v7-0-233 +2d0f22897a4d1f71600540e64a5cbf80a178e46a v7-0-173 +2d9eebf2c48f0bd3b51e8ba085b97da871cd4184 v7-3-126 +2df7e2d753061b54b9120ae4b34d4bf050cf17f5 v7-1-246 +2e1e9b708941e1cfc2c0540196719f78e1ab18f5 v7-0-023 +2e42153b37f171ed28293fa12e4f538070bf8619 v7-2-021 +2e915ea7110f0dc0507a733e4330ec6cc91e53ff v7-2-266 +2f016b638c0ca912d89f352f6b9b83231cf9e83b v7-1-312 +2f57d93bdbf64461c4eaeaacdba26548a2abb9cf v7-3-030 +2f6e519726f19c2f6cb58e9cd75e827eaafa0ab3 v7-2-346 +2f70b8f1f1e32dca34db07fedf9cbb56ff97007f v7-1-076 +2f9308b31181f36bf605ee060fa763a28deacb03 v7-2b-030 +2fa8cb05b861d49dec0501a2531eec39e1d0a688 v7-0218 +2fb204616c9b4e4df95f1560899d02e5bb739678 v7-0-079 +2fcd444c4bd37f916da718bf5bbe9535d2667331 v7-0057 +300fac7c5a2bafb002ee97d52da19bae8a344d51 v7-0059 +302a6aa7aca2ee9cf24958c2277a90fcfc01c939 v7-1-061 +30534c76776ab088a4142f9e15faa23d86efe020 v7-2-078 +306fc545fe2cd5d77953811fccec0d5c4bf7744e v7-0-066 +3112fcc8923830fd9060c76d1ec9c75c59487d59 v7-2-371 +31208ed42de95ba5738675cb78bd0f66c34ed785 v7-0-065 +313ec58cdc49a69c4386a4aa18fb9bcd01155feb v7-0-206 +316dad0565b8943c978c8c58b212f3c4469b1cf7 v7-0-103 +31757405c0c5408f9c83dba9d83ea74b2bd680d5 v7-3-134 +31bff9be0a7730f36e7de4792fec0688f2fc7076 v7-0g04 +31df87b80e562b6a83b97e2610f539afc94bc440 v7-2-278 +32c1b275ba6419fc014ffba3d2e55eca1ef06d4c v7-0-196 +32e19278c1ad1be6f92fc6cbcefb7e23ddf928cb v7-0-105 +32f48534fa0fa9b8e6833850fcbd77cd002ce8e0 v7-1-187 +3328b87305efcc6a8db6923c31cbf78a05983eff v7-1-077 +3372616fe1f1def653875bedaa8c059c399197ac v7-1-144 +3376d79d40f2d2c8e09cf8a3c07e15fc2424ecb3 v7-0-148 +33792c36e3aadc7f313785705f39d7ea6e214319 v7-1-018 +339999b511a0d529f09219a5d61b810fc75261ef v7-0148 +33a2652c13268ca53bb9ce0cfb7232655864c373 v7-0-231 +33d28f1c4d1dad3d4ce7f768c57820a8203c3e51 v7-2-006 +342cf2a9f5cce4f70e6a974253b20c8e309de7ef v7-1-145 +342d2b3a072a6cbc3cff898a663c4889317b32a9 v7-0-208 +3479f9aacaf57d583abb468cfe393eead386f15a v7-2b-008 +34f62bcce014d9c0b275002a1001cd1582ffa121 v7-3-123 +351bf13db8071317d7add1e55a50ae284ff53a4f v7-2-334 +354ea37841d13e0d9bb5ae995a09fb28beaa0d13 v7-0-022 +35abb70264158760c724bd0290c6c441afec4fa0 v7-2-033 +35cef95a6b7646d045b97bd4a54bb90000b5a753 v7-0168 +35edf814f2230c2bfdf403073fdcf89094c8216a v7-3-100 +35effbd07a25d1df122e795165d26ceb65510c3a v7-2-421 +35f3b20de2dd2c821675c61a11f4b227d31e9cdd v7-1-102 +36071a92cb764412276e067fed099164b0170436 v7-0167 +36275e20d997b91a357433debf8fbac0885768a0 v7-1-051 +3686831cf3da094c66ca4d2ab2c671d3d2e2d497 v7-0166 +3709cf52b9b56befb1c7a98e5f58cf39d16cf953 v7-0119 +371201c6b4c1538b593b5dc72f36c79a1f2644de v7-1-327 +378e33d47ab09cbb564a2aa6e975659a7f742a67 v7-2-250 +3796d11fde3c141d30cc3446038c20bf280c4b5f v7-1-267 +37d62d968182826522e378b31b76cf0a8c7a3cb7 v7-3-058 +389c8abd59258ba5ebc164dc7158a025bfa893a2 v7-0048 +38d7bf77e55068a5157faac7d871f2f3a66cbfad v7-0226 +38de872507e1c6440c9252a7bad077ae8c1bd488 v7-1-280 +396a9b65abe6a8fd08a6c232b443d541717cad0e v7-1-121 +39aaf0cc59e83148991c7482fa82d2bc29129d3a v7-0-150 +39d115408c71e1bf72439d5a92d98c8e551a5750 v7-0-186 +39ebe9e88854b766c569529a96dac3b67aba0e65 v7-0165 +3a6ba07b3b9fa89e94e002d44f57f5378eb59f08 v7-1-302 +3a779b47f235a62d799147b25445b01866f7c0dd v7-0223 +3acbcd0d3fd3d81ce94a40af4510fcc2e7870a82 v7-1-317 +3adc6dd2d122c76a211d88769227e447e4f8f821 v7-3-136 +3ae106044109e65b5bce1ea8938e0658729349ed v7-1-008 +3af28ecf9e56315a8617b2c58da078b6df989f2c v7-2-122 +3af484dca921e30a0bb1e4975a4fb214c3911f94 v7-2-150 +3b1d692e5a2c3053fa066d202ffc0b51779d2c71 v7-0040 +3b226f4693dc8dd1fb8886221335c39a64bb1fa9 v7-1-207 +3b241fd8d7c09d7a93694a0abcdc283dcd6b4675 v7-2-441 +3b48421dbde112f3a6dae67a651a9f114d85c874 v7-1-301 +3b705e71c7b07ba1309d08a8b370ae8ad3fc17cd v7-0124 +3ba373b54370d830e3fda93eee83e3f0b1ea2a0b v7-0008 +3bfd2e1e2609c8470c5b4f75184b66e5a4d8faef v7-1-053 +3c17132458a1538d3f1d6ab00544df8069bd983d v7-1-208 +3c17f4d2196f2f280de13a417652529c417548ff v7-0-028 +3c251a30c8cc44946e5871a7073d88ce195874cd v7-1-325 +3c6417b7e6efed4cb13673383489efb47399a902 v7-2b-027 +3c838658fc357dc48e457bdbc1f5a63ae5a73d19 v7-2-257 +3cd88bdcd97d7d0a3e2f5a00a6627f00970ce5b9 v7-0-045 +3cdf2a653e005387c4deeceb7281d62fffd34687 v7-2-391 +3d698caa5dfc7b11c8a6ada5f57e75c7a6a117dc v7-1-064 +3d842a9e2baefc023d9e4f163ea138b9e29931e8 v7-0-051 +3dc6072e0a25f24ad5d888af77d858036a9185f1 v7-0-083 +3dd986bfef63bd08894294a0828a1bca737320e1 v7-2-181 +3dfff6a80088c921b391d493c6c1231e4e64a656 v7-2-217 +3e0f9984e98e8f020260ff015cc994ccc34059a9 v7-1-111 +3e7d17e425b0f58513002797b3310e722757893f v7-0044 +3ea3dcbf2cd6e5ddb9d827c60ce999b2e4a5e755 v7-3-108 +3eb34a777f49f7f656b32c8db829fd0b153abe23 v7-2-220 +3ee6db0a746e990164e288fed6344e519a5bd1d2 v7-0083 +3ee896333e3eebba8a5e10e04649f1bd20e98770 v7-1-290 +3f1b2e6496debe5ee3068d1916ea15926d5a0f99 v7-2-252 +3f44e9abe4ec65f797cbd12f1d46bd08eb48c2ef v7-0015 +3f661e42f262e7839e2f04c50a447c53f6c4214c v7-2-228 +3f8cf4c668c30ec99289b5683f4fd36a1df602fa v7-0-115 +3fc0f57ecb91686b33630dcac973ab9d7db31c6e v7-0001 +3ffdc64af1e53617586ad0cf14e039cb6f1cad34 v7-0120 +404aac550f357223e7bab3656343827f641d9f74 v7-0017 +40a0699b6c62f93e58ae233fcdfd395bbc1bc80f v7-0046 +40a8e388692b53d36104e9c9b6ed351c01707308 v7-2-241 +40aa7ae37901ce256da18bcc84dc5ee21f83829a v7-1-149 +40f2a904bffbbe8fb600089d1b04f1115a2a4a71 v7-1-115 +4102fb4ea78127b1a95b2df3274a55d9bfba68c2 v7-0002 +410fa1a31baff929c7876be744142723c1573c75 v7-0023 +417c04135ca2ec03b6357404b62761ca9453cdba v7-3-137 +417c4d78a09c07162879dfb79e25e672e6e9218d v7-1-043 +41ab6b381572fcef699480ffb759d3c4543f0dd0 v7-0-128 +41d8447a84570ca22fe07277a2f8e9db694f66f0 v7-2-236 +41f9fd58cf132788bde73ab1954cb987521e3bd2 v7-0019 +421a77b136c2bec5d2056a799e2fa8021178beda v7-2-002 +4238b697bfff46433c49d60cc20b43761ab3c128 v7-1-097 +4256f76f72668271d9d986cc3736eb188b4400a4 v7-0-080 +4269a0673478b966f8d0e08b5681ea0cf2acd68d v7-2-432 +42ac369bd824634488b569ec5516fc435b700be8 v7-2-070 +42cafbf4b6e81160c26fc99148eb333aab5d2f96 v7-3-110 +430793c2a2315e1d0ed2de460071eb83a4f9c97f v7-2-319 +430f555d7d152cfa5b7dc43b8b8b0dfa0d520520 v7-2-195 +431ebc9412a816440aaed887a3d318deb08c6407 v7-2-418 +43243f7ce351aecf1f41932a9d02d6723fe49e34 v7-3-128 +4353593fc2c07753d40f71998688985cf96689d3 v7-1-244 +437fb19625c9e24e2157563cf0a55aeb432b2990 v7-1-275 +439f44b874a731461a187dc720edc0c663ab47b2 v7-2-291 +43a60ac87145f10d827e08b02c8241b359697740 v7-2-263 +43bf0bcf2110ffd8d42f0ea9b1469b1024def86c v7-0115 +43d337097e4ceffd268685809aa1e8e0f2a2dbec v7-2-223 +441f938ea9e90e07a05e55fef17ab22d2607f5f3 v7-0192 +4483ee552619492639c69f4345d6554b7bcbef2b v7-2-355 +44c01fae1181944162c94bfba919ac9867ceec40 v7-2-160 +44fe912b5a1b3961c7bdfbd2a8277d38eeed1e77 v7-2-145 +451bed7e9572b45d2bc98bb5c6680e7bdf4a3fc3 v7-2-321 +4541e06d4fb9dd8b69a7ab43653c72022f95151f v7-1-323 +4549e0e7fbb661089184c7b0ba1888cb6564ef2c v7-3-076 +454d71a434176e2d1ce0c2a7d47bfe2583a5069c v7-1-037 +456ae41254c975189c55a6ad28b1255936c847fb v7-2-159 +4577899b8ff1548f3f03e6516715087c9aa15e6e v7-2c-003 +45898756e0598f357776ae5aa05d717a7017e0cc v7-1-105 +4589d1792c036e15d1f9e72c0252fb243aa6d5e4 v7-2-094 +45ba31f9ba0cad526601d1d15d4e05180967133f v7-1-127 +45bae37de0373ed58d6f4ed8721d594ae322782d v7-1-031 +45d9e2f80fe18c663346a2e88409bf2476e874cd v7-2-061 +45fe7cf4a89e3963ed9c0d6a34600dcff8de3f9f v7-0-176 +463e25d28b334622df784faea456a98ddbc0b5ce v7-1 +464da5b48d277d1052e3c211000717947fa13da6 v7-3-130 +469c42f90fda78344dd4b33e7c0dd0860b777939 v7-1-030 +46d39f2eff86c940486c2da466283d7526b98c9e v7-0027 +476336a5ae9588c4a13721b5ec1cd792fa44ea2c v7-2-404 +4772a5e3f9fa652baa1cb6d5295d60daeef6ef0b v7-0138 +47a0dcad7216bfe602a2ee241df60bfc41c04979 v7-3-120 +4842e7421b5207294cc90f7e2d2d18c24e65753c v7-2b-024 +4845822f6a6c21860e0a1b4627996d745d455da2 v7-1-213 +484987f8e04c44e19e1ef2f3f6864b4c6fe61f1c v7-2-118 +4869457735a9133c39202f797a6694301c41abc5 v7-2-290 +48775ea99f249b75872e9f0268c5bda8cb8af8da v7-0-007 +48b22e2eb1ed7782c4dfb90051b64d6614fc6d3b v7-1-185 +48c9c2bf59afb140dfae3f4b7182ca410e72cb25 v7-0060 +49b5a7f186aae9fdd9b633037e8da484c61c55bf v7-1-002 +4a317df1696281eaee0e54b5c1636186290863a3 v7-1-298 +4a4287c09953fff6a65f7324c5f223f7359c46f2 v7-2-390 +4a4b16c67c62174b3b66848a32f4e5554b9cf6c0 v7-0-183 +4a6554fb0483f5cab10876ff0d9a0e92a9787119 v7-0-161 +4a7320e53f32e1f6d60c498d870e6c4b8c7acc35 v7-0126 +4a79d6d376f0897e3a899ccb104a324a94bb846c v7-0c02 +4aa4510d548c9fff9d8317977e3801a68fe2aaba v7-2-341 +4ac0c84d1c5038d0f6171c68d9c58ef0fefd4226 v7-3-079 +4ac1dce8dd5e8d8e97e3e7b921f3ada9db2fe2de v7-0012 +4b8583e82cb8875d14ff928db281aea8145d0b0d v7-0201 +4b9fef49d7ff02cf781d26d5b85a0a03c8784fd8 v7-0095 +4bac29d27e2f4c2779ecb72a5e78cd4a65cb455e v7-0 +4bac7ed34007ad41b7870888c739c1b4a129cfc3 v7-2-368 +4bc81d4dc6be1c45e41f1b083ad7fc07c58d840c v7-0-142 +4be6da0fa3d9978434273d3abc021d7e68455864 v7-2-400 +4c02214d1465ac2b014a9a1096927ad04eb710e8 v7-2-200 +4c41f0da2a2e35b42334d091130440d1b1479e7b v7-2-324 +4c70a10ce2bb6d83a4cbf3e3baab19d1752f2230 v7-1-042 +4c7cf05f60b5885e1a5caadb787cc6e290d7ee34 v7-2-110 +4c8008ab94d8da38529991004a56e65547faed15 v7-2-431 +4c8b90b7a94a123db784dea518f3c9a3bdfe85c4 v7-0-221 +4ca6669af2cdc06f39d77bfef82663e5bbdedd56 v7-2-046 +4ce0a7e4c6b3a305419590c746d2a11040fb2b92 v7-1-036 +4d53c2a2af94cf7a657d85e27f891b2d53b698c3 v7-0054 +4dccbe792a5e00c40a6e5b4f9e74d20b5aed2c50 v7-1-057 +4dd75cfd946f31e81eaa4b03ec81ef141c562137 v7-1-071 +4e22214f84640bdfbad591ec2da5eef9bc328dc5 v7-2-409 +4e581f1b08dac0b7f9345bd51b03a5fdbdd49ddc v7-1-281 +4ec11bb387a559fb6168fdae70e7d0ad78e15c3a v7-2-372 +4ec4c53046b5be6700810b9b92996a0cfb4ed52a v7-0-021 +4ee809acd1ab9c2fadee72e0fae32de57040447b v7-1-124 +4f1130893a1c135b1200f6857bd0ebfb143350e1 v7-1-320 +4f1b94b51e99370161ceb5a923573772ca068582 v7-0b02 +4f3857aa17853ab6c36005520ae723af92f50b9e v7-2-264 +4fb859cd9ba955957ad712ea390e87cffec6a540 v7-0-072 +4fe8e1a7758ea8170eaa4b1abf11cc9682437cbe v7-0102 +501b107b335af7ffcffea060c38f4b34dafe4101 v7-2-012 +5027d3220e2adb2f2f54e85f469a7b4302a010da v7-1-308 +5044d9d784ed2958022fd3446910567a4b84dacc v7-0-154 +509230ed2036945be2d9db7e1ecded3c59518c2d v7-0g05 +5098908178cdede4656e3f96f2df2847573e6ed9 v7-2-050 +50a93218720458be104f03ce1be00bcc8b898eb9 v7-0-228 +50e0337c25cae29dd3e63b333d4bfb68cc9b3740 v7-1-239 +50f5ac5b90dedfc7f88a67d7a435014e07c298ca v7-1-094 +5117153003bdb002aa3e68d3b90a98a973d38078 v7-0e +513866ffe6af0bcc09e7275c0e9130170de66acb v7-0200 +513d037fad505a5169add3116ae459bd1adac381 v7-0154 +5232b9862f238a2a109f15527825e5cac1668a04 v7-2-000 +5232b9862f238a2a109f15527825e5cac1668a04 v7-2-080 +529c6a431ff5d5612bfba4424c023dcf073c2cc1 v7-0-056 +52c87a746f4ab8397933a53388389aba6a16bdd3 v7-0181 +52d17d53b555c45b0b9f4ddaf3551bc8ad5623ce v7-0d05 +52e76e2b5b65eae81c4ea93d290194763d7edcd7 v7-0140 +53175322ef40dd7f50dc4153e6e6fb530a4b2b29 v7-0070 +5332dd13733cd57e814b7e21cb577f6ad0c15408 v7-0094 +537cb92935b690665a72f2b31dead8d9b322dcb1 v7-0-223 +538cd3220874d9a98abc7219e7be6666e49f853b v7-3-011 +539d9b8f418aeeeac3d0da1932e1cdbe709456a1 v7-1-265 +53b2bedccfdf5ab8cbff6c3fb1f6f83ac7112b85 v7-1-091 +53b47a10825a20cd7684046146393a641d89972f v7-2-163 +53d475dff0e363bfeb31d6d171337cb19c309098 v7-2-374 +53fd0a213cff86b7185c5391cef34c1265f8b8f5 v7-0-237 +54a6b47d473e64d7ae5212f00b8b125c721d2c41 v7-1-160 +54d5eb36689f1a409d13cd6ff9b06d68a30b0d48 v7-2-092 +553c97222cc0d0adb7beecd6f73be1c512f2f37c v7-2b-005 +55e117ed68724567167ed25bfb5a320585f1bb5c v7-1-075 +563bd9a63fdcb08d55b6f6087cc8ededd31b891d v7-2-010 +56609cdae088c4d5b38ac94a95a07f1520b56fcc v7-0-059 +56695f1182f01d75843d0433484c94c1eade71de v7-0-238 +56b638f2029e728f1fb20382a7184a8e4ebdce9f v7-3-018 +56ecdb792c3353d9fc587a515fa4991e69363dd5 v7-3-036 +56fb4ab9f62f19b9812d483aa76f8b53104db26e v7-1-225 +575dacb554d8b134356fae0135383d5e2231113f v7-0096 +58059676e24a6fbbc686faf84c612cfa8c25485d v7-0-134 +5858c00d0f2c47b395e3c63cc809ee667f8c02a4 v7-0-122 +5898cc36322e7f1dc371e89dfb5e2ffc3c6c6e3e v7-1-309 +58a14bafc1f08b9712732a26a44c2a93e34e6ae2 v7-1-209 +58cad056e60844274b103ff3fdb56d7a6749b121 v7-2a-00 +58f47e17ba1565ec9c538c7f216cb9ea66e58a63 v7-3-122 +594f25e4a8065bcb865784556adf556004bddb24 v7-0144 +5950b03fc906f434d5a1b899bcee8ff839b05a34 v7-2-020 +59edc8429da0ca92da8913823f56b219e3a99051 v7-2-065 +59fd8376545beba122700d5a481793f29ff0a69e v7-0058 +5a1d8468d1fad7189c8c781149f034dbb4208b39 v7-0-224 +5a1d8468d1fad7189c8c781149f034dbb4208b39 v7-0-225 +5a1fe35a6eafb1c994955a34d8152996d53838e3 v7-3-092 +5a7384b9ca6691ee880dd4e01dddcba5dcac4f6d v7-2-031 +5a7843c57316c63d1118b6a5c2f42d330e57183b v7-0e02 +5a84b6388a5589d6f3b53a1aa6f8fcc369989a0e v7-2-369 +5a97d0c03b593699d6e0bb2ea49073dca03153f8 v7-2-397 +5abd3e3c0085de46b37ac9bcee90be8160dccafe v7-2-363 +5b101ff9d4c43c566e7adfb0a7c0978d2150d741 v7-0203 +5b154df6fcd89b4d24d34da63626cc01d9b5c0c2 v7-3-033 +5b43a3a9454ad69432d5cc82b70d59ec6c92a45a v7-2-003 +5ba8e25f7fc159a684a965ea9e6626f62b76997c v7-1-188 +5bbc2d6658adb0dd3c67dd80c59f3a7ade3ba3d6 v7-2a-013 +5bedef935ce38062e866c72aec633d38d95dfbf2 v7-2-357 +5c3844ad7d5677953eac88ec4ee317b298812bce v7-2a-017 +5c4b2fc4f067cd04bed4fd0a13bdec7d26036d26 v7-3-049 +5c6a3e894d43ed024662462cf5c6f77feb743132 v7-2-288 +5c6fa259c9236cfacc66dfeade89414479b5aa58 v7-2-328 +5d1ca05fa8ffd87bf59d26121e6cff5f91e9afd4 v7-2-199 +5d25cdc3c3f31d4893f646d5e7b94435ef59aa5e v7-2b-003 +5d2f6d04c82f900b01c18a7bcf2287a42cf09ffb v7-2-253 +5d5a41a95347bf4a1382babc697a1f940a83e43c v7-0-227 +5d5cad78a8380735abb8ca0e7d3ffb11e9eb98e6 v7-2-300 +5d84650b569c7800de8012d91660441bda95e5c0 v7-2-108 +5df74a812b7b20bd7e33634453c645be0eb8a2c4 v7-3-012 +5e0c164fc1c25fdfcef07fc03c6634216e6ac066 v7-2-277 +5e168526af25c0a59c55dd009e10a63d2f156114 v7-0-033 +5e225f973b5d22208869bfbf151c5fd03b5a3451 v7-2-089 +5e75d07bfe75fc81e0dac043b6bc0ba417736b17 v7-1-293 +5ea1f7516c2cb92422abed07129357a0d5a6a787 v7-2-165 +5eb1ac6f92ad40da9bbb585f5ff8fe003e85122c v7-1b +5ed9395c1864269b18ffad462291eb37c92792f0 v7-2-235 +5ef53a1677ee9c831d7a18ee44d1041f182a82b2 v7-1-099 +5f0c7aae4da272c73cfc625f35dc050897b6afe7 v7-1-330 +5f33b64a6694dbc2c167b86c56488ddeeb7f46c5 v7-0107 +5fafc42c22d246e4dcef5c09d70b757e0d374b2c v7-2-053 +5fbc411a611de301397bf4f8edf494fe07bcf6f8 v7-3-042 +5fd44cf99b6ddccdadcf70ff8351999e4bf5dc38 v7-2-398 +605f5c2f77bace46037afea6841f7876af85a4b4 v7-2-182 +607cff4bc0cbd7ddf84007a20bf3e6bb01e70694 v7-0088 +60d21d224d251c448ef76b1b9df087497c06adf4 v7-1-038 +613517f0b72a1600d58abeb8c44df9b3de1ac997 v7-2-284 +61709607f5e26dc1d4cf420a25292ccc857d3575 v7-1-228 +619b90abfdc95e3b1d0981a8995b942c6a7c3c29 v7-2-032 +61b50044616bc626b27630b3c9f03322db0ec609 v7-1-090 +61d080cb268e21cc2275da3a0ff2b2081d97ff51 v7-2-086 +61e5d40135d0d90f5d1689c469958bb7a37e074f v7-0-139 +62716fd61fe94fb9e7f39294dfa9dba4aa06fbf8 v7-1-204 +630eca9496e07d9a778fe87d087832816a01a850 v7-2a-010 +631143ac4a01c32e465380ba2ab7f82949f20d75 v7-0007 +63157185aea525b39b1238df3ffbf4ec0fea10b1 v7-2-442 +63369d73b551cb0b72202c29dfdf59aa6049a333 v7-2-161 +63613d8d7e4dff96ba2f34be50fa4b002f56cff6 v7-2-354 +63bf37c1e7a2c323b368df6e926b026139ec3144 v7-2-401 +6412b0befebc17db58a1e8acbef86d3a3e4f742c v7-2a-007 +649d340f34d3ccb1c96efa9522a65803575d901c v7-2-067 +64be6e0b070a5f5f58eddedc8b57dc0356642cd5 v7-0-004 +64dd70f176c92013bc7efd0f3c50083fe4ca0972 v7-1-021 +64e2b75e16158d89c4a600bb97a62a4616632884 v7-0-141 +64ed4359d9570e345dc109b51138c36ac8769614 v7-1-221 +6510d834609f78327cf78465d6849601bfe39108 v7-2-380 +652d074e0264f453cbf76df0ce041b5032504085 v7-0-048 +656853d9c014add434086291b7af40ad828f126a v7-0-111 +656b4c052203990d56ca731d2e3ca39ebd9bd775 v7-2-029 +656ca7102064d711eed5cc678b4a5cf03b5d9c05 v7-2-026 +656e652c6579a812d9f48a0e5e4d8ee47ebc1a35 v7-3-068 +65c332f15dbf3376ed5aeea423e8f1584a65ff29 v7-2-083 +65e0c2e3a3521c9782728f307ced58a5740d87ac v7-0-166 +65fa3b16f040f5320bad34c324f230099bfd8f0c v7-0222 +6605dca2960f5c597f981c60cd3009e98b173883 v7-2-178 +66080ac5dab745208cfd8f385faea24ed68be68c v7-0130 +66263e241ce35e11faf9b33ef6e2d509e1ada4eb v7-0176 +6632670ff6fc2bd4dbe01001086874b9f75b0929 v7-0-053 +66475621f0bfacb601f38c15625c15c2a478e672 v7-0147 +6675076019ae7e7444c526b342c91ae2ef6cfaac v7-0d +66b1822ba176a2f7d7e2878b2907af6d86e5b5c8 v7-2-326 +66ddf49935fb8979def275bcf7c56acdfac7ef6d v7-1-015 +66e40876590bca973973b6aae208a14cb428c266 v7-1-007 +680834cb19eb2dfdc88aded4bfb36518ca4caa60 v7-2-022 +684ea86baabb6ead7b673d20de6f4b5b27a3335d v7-2-101 +68f00510705229a9b8653612b806dbbcccd5aebf v7-2a-001 +694e8715dce6af134be79c99e97f90786088078f v7-1-316 +6974b167d75eabdf70005f666e3dd0e82e47be4e v7-1-056 +697dec8ec5e723ae32e12229d3ca111fe7f4ba92 v7-0-037 +69bcc0c891d706d3383f013e9e5f8876b6c76d4f v7-1-158 +69e8006af73433fa27ecf32b695919bd665be1c6 v7-0212 +6a2e4860134bf0e4b5edf382627809dc6cec309c v7-3-091 +6a80537ac7aa6d4c9011edf4db84a6aea85d2911 v7-3-041 +6a85219723b98ddd686d1a80c481a545bcb535d8 v7-3-027 +6aea606c9e911f768a5e6c9626581721f460f756 v7-2-068 +6b5d641bcdd45e53c24e0b4e0b6085a696e336a8 v7-2-395 +6b89fd4ffcc698278ecc582280c79916a425498b v7-0-008 +6ba0265d1f1b70b8a4a2b3337b18ded763f58f09 v7-2-295 +6bb1fa855dc91259d295a1beeb4144aa51b3cab6 v7-0e03 +6c05b5e5c1be4ee9b8f96334b7fba7afa832524e v7-3-032 +6c3c2e464a9628bcbfe21317b8fd90ae27076735 v7-2-392 +6c4da3e24371945408401d6330a930d44cb5d716 v7-0-232 +6c62b9b939bd8f3df4ec59b2c2d72bbbecc723d8 v7-0093 +6c7719f94811d10db3f86578e5286e5da2fd8514 v7-2-170 +6cc8a093e4a9b14df444effaef7274d2318d00d1 v7-3-115 +6d421b3c485b2da5a04529c6b71041031d41b80c v7-1-046 +6d80dbca8501a4152908713778ce03e0f45b93f3 v7-3-118 +6d95d8976b00540c053d11fff36e20556d125152 v7-1-200 +6ddd55ac6ce50b94713303278888da04d21f489f v7-2-249 +6df4e719ce4eb637d6db90febd0d1eb48bf8e96a v7-1-112 +6e03ee418b50de776b583358fe2ba20bbaf043ad v7-0-137 +6e9c10c63e25ce9212c5d629c9fdb60b67e6658a v7-2-216 +6ed4a82fcfc6f1c354906dfaa5e13a192b3246a9 v7-2-175 +6edf4a4f6cac62dd123f7d1017a7624c9f48e71c v7-0110 +6ee9d7fa5df6d00c892f7e93a63435de5c50e083 v7-3-057 +6f12c4eae4f69d1379427e8b0cee82769f75c35d v7-2-153 +6f4740f72d3d2018bfb19d4c8d8064e3682fd883 v7-3-090 +6f8b578776ab0204bf16f669383aefb0661610f0 v7-0131 +6fdbaf2bba0459270702479d6c4cd04f4f6bc034 v7-1-098 +7002404b17b15ea37887cb1dd5b5b95883cdd27f v7-3-054 +7015ddf8105575fcf48eac35b14c61a24fc38d7f v7-2b-018 +7033303ea0c065c16d5fc31d485c949f7949c10b v7-0089 +70661384379a0dd305576f64554608a396b0821f v7-2-056 +70a5e723eea2c648aa82f7c8f28a2a5dd5429132 v7-2-213 +70c67b1bb1f1aeddc1dea55438e11ae6f9ca3d14 v7-2-329 +710b52d02c4a0649d5b20c38e3394a2e248be9f5 v7-1-237 +710da9abc3c1191eec6633477eea663fada04939 v7-2-317 +71219f47ccd9551fc7d090e73afb83cc395232d8 v7-3-025 +717e759932cb94af9ee8dc9e93f33b67f292e8c1 v7-1-217 +71bd485d8fa572ac15207c5c1059b2ad0ae685fc v7-1-166 +71db8539b8c487eef0df17f2069d96fea1911cf1 v7-1-268 +71eaeb69efe49baf0f63c6e9cebde1aade638ccf v7-2-007 +7209e03df1005fc037c029799b068f545b60433d v7-2-075 +720a59d79bcd3d606bb9837492295d0c52835500 v7-2-168 +721ebb602db0fd2a5a9cded8e0830800d734469a v7-0-135 +727ab557c58a3257743a8b7589d91e21975b54ea v7-0-102 +7281a86ae640e65e5eff6d6b565be20032f736b3 v7-1-016 +72ef7987368de4715599707a85f74a8e6d029c9c v7-2-139 +730697e82c43a8bc8b5975bea39fd180fb62a4be v7-2-091 +7317e0e2775877fa0b817e20d29de9eba1a4f95d v7-2-254 +732c7ae5743ec2d22423a8bb631e2d3c5fb8e549 v7-0180 +73354c21f1e40dc792e5829152992e76f7a607ee v7-0066 +734d5bdae499eb2fa3f818e843efd9727e7f69f3 v7-2-041 +7387540b6e52e3faad6c78182de9d1354ac9e6b4 v7-1-297 +73995e7c06e668b3eafc366b3c959d32f6bc00e7 v7-1-174 +73c0eeeee0b789738812c1cf821de3f86e1fee53 v7-0-174 +73c5752b957d49da8312ef87383a7368c78df74c v7-1-295 +73d947c20291fd857fba24ddf4725b9b831188eb v7-3-038 +73dd10c18ec4eb2cc0857417fb8cc20f63dd42e1 v7-3-060 +73f10d8124f48510e0ad1468ee9e29c010009621 v7-0136 +7472c565592a373abca2ea571e229b4bcbfd7b15 v7-0117 +74e9d19831c2357d7b998f484ebc609dbc08c5e4 v7-0081 +7557b6ea0fb14ba4e97f5a8a04438db30cf902bb v7-0030 +758822790b43d2fc184878c3a50a12d71dda794e v7-3-031 +75a69023117c516ca184ed479727f105af12cc39 v7-2-221 +75a89c7c204e0f478f480598cc3f2a8c45dee8b3 v7-3-059 +75ab683fdb50e83cb9037454f5dd8d602e08e4c1 v7-1-233 +75b3f9cc19da44ef65c962deb7a6049c305f49d4 v7-2-283 +75c88515e0db5fd6f88a05634d9abd22795aacbd v7-1-214 +75dbeedddaa9b0e0784c4d23d71de713a533c5b4 v7-2b-016 +75f5889a5d8e8272fd17a104ef148776f9133aa8 v7-1-260 +763272b18e4ffe717ebb58827315badc09824e86 v7-3-098 +76406c9cbbaa1ab6a8f6ca7f079c3ba8cf06e2ca v7-1-176 +7644c80ca87b75a7dd85a7b4089e74bf5c503f3c v7-0-089 +766918de9e3a76816ebdee3b90cdb1f9f76bca6a v7-3-004 +76985a406456362dbdb4e7e4bef67656b84de965 v7-1-240 +76a42a81f68505f7b99af53a919e3cc7895096b6 v7-1-087 +76c2b2dd25c9c6945489a1c636f7e375ef1f40d0 v7-1-033 +77310929a1f94745e3d49f0cf1a6908785d3cfb0 v7-1-151 +777d5460622d4a9aac084695524d0c85b39f4174 v7-0-164 +7781fcd2b74f26a37da0d1186a1c44d904a8f11f v7-2-011 +77f3dd990b12aa963aa0a63f0db50f6443f3f41d v7-3-119 +77f8a648d2e6c765329ee6544bd8716835bda3bb v7-0-062 +78b9d5dce950b348235ee667f8573c6592920088 v7-2-420 +78e032bb32605c1437e30f7ec3215ad4c0772dd5 v7-2-303 +799c1db62b42a7c9d504c45ed313910c2e3d169b v7-1-164 +79a23c19108a8b1eb9d1b97d5844fabee6525e23 v7-1-079 +79b395ba0ea5e2bc7d27ace528d84d47aa1f5a66 v7-2-311 +79b8d69a4588b93516410e519bb9459242f46d81 v7-2-340 +79bba9e6af2b6588349ac2b3e9fb722d6ecbdc85 v7-1-224 +79d111ea8ef64e7bab0a5e27b7d5903f10e45a43 v7-2-425 +7a4ad3fb109d42f37f82664390f128dc9b7e44bd v7-2-188 +7aee5e68548a7cd13c74e67439f8c3b8ae6327be v7-2-417 +7b0e89b77216baf928145ce14741650806004c31 v7-2-365 +7b258a166daa98eb01237988ec954895a2e6ff0e v7-2-018 +7b44c70ee8ab87d5265ebec758a6f5ea9d5cfa75 v7-3-104 +7b875bfb39b871d5d40525d579e30358bab6be1a v7-2-434 +7bc38b35f1e87c1749f157ef91b6cab86bfd9561 v7-0-026 +7bcd81b96e2abb28ffb000145c917bd05e88e5c5 v7-2-267 +7c28790fa8b4054bdde6d358a9132581de76df62 v7-0-009 +7c2e6ba1d702579761d7ddc4020797bbc97805e3 v7-3-008 +7c3302e07dd7cf0d746776234ed4e9cb376d3611 v7-2-023 +7c46737918cb0adc9a51849b75b1c03da7bd77f3 v7-3-117 +7caa503b63a9b193f3b9e016a0a466ff8065f2f0 v7-2-225 +7d121c69f540272878af6fafdf658443360a698b v7-2-383 +7d127d580b6d2d86853fc0a322323cdee2eca343 v7-1-318 +7d2641e6af75b3cfb4dc29e7c88812dee6c003ae v7-2-261 +7d29124f77f5e794008c746c69a0f79da0cd966a v7-0-133 +7df2d171ef1c1284e10a4c53fb079d02e6d7b028 v7-0-163 +7e0c8a18c915a4c7dccf01be813488e27d03fdc5 v7-2-275 +7e5284f58094dd557b1502e1536c78846a59049c v7-1-134 +7e6d264ec0a270beb9692df71fedb210c1896640 v7-0141 +7e7da11555d27f62984297f3e1debc8242baf995 v7-1-080 +7f01e52cc97aca6eff92948b67876e800eb67fc3 v7-0-171 +7f2d3b3c15a2ffbd259c2ee99966124c2c2087ee v7-0122 +7f788cd2741586586a34b41627a1c978fa465666 v7-0020 +7fd70926e2e1c299ecd9dff6ddfb51ef71f7f08b v7-0055 +7fe13e0f5dce15cd16dd61c898e63899a9aff561 v7-0175 +7ff9f75f9c59f7b600ada6ac4b3234398df5f38f v7-2-245 +801d5544828215bf644cbc6ababfc66beec6cb2d v7-1-195 +802898d3afd12da41c305c495b121e41ed880659 v7-2-214 +80b9076e9e177bbcb455eef9928283077ed1c861 v7-1-310 +80e5b1da667656a146cad7a749ac9fd2afb659bb v7-2-231 +81059e8b657d911c9876f557975f34624988624f v7-2b-015 +811f29447aea27adaf1f54879ddf0fbd05a1e094 v7-1-270 +813a407a63af8773c585b0baae4d22296503ac03 v7-2-271 +8173ec1e9f1f746657dd598b6e876b11c99e1049 v7-0034 +819d952a0a5cc810c52b34e8df400f83eb3353ce v7-2-142 +81cf1b6e0a2d59192534f884135108f788a20b91 v7-0-147 +81fe2ccc1207699c377b42f1d8ca426a70177afd v7-0179 +823e9ddf23f77858f1b866fadf3e4ec5ae5d55b8 v7-2-141 +826f00fef9e338c7afebef68658716bb0aab62f4 v7-1-096 +8272535dee77ded630f57073b428e89673f1ee45 v7-2-035 +82885ffcad10aaf6d11170dc45d2721ee222c37c v7-2-310 +82add1e7c154fbbd5926df49fd4afe768e6007db v7-1-013 +82b2594be40863fef91c163200db2f56b2e4e52b v7-0-155 +82ca8ff21fd7181e16dcc58863d0d251b9228374 v7-0-175 +82f866f19e91a19ae44e7dbe5eb8747e98acfd85 v7-2-269 +8389197c91f3ecaaf28b776e69b9336eb08828d3 v7-2-133 +83a006f81bac04bf9b975347bf8d6bddc7996eb6 v7-0199 +83a126db2895ba22f2fff13b488f028ff83bec28 v7-2-027 +83eda510dbc07b4fe4db5b5f324680f60c307fff v7-0-222 +843bfffb04c739ec456e5c5f612c6d025f2a6188 v7-1-058 +8464d084fa7475830cdc53529cd20f7334c81232 v7-3-095 +8531f7ee366297c58506f9a3130f45c350ce1fe5 v7-0-218 +8562c6804861cd26020e1a004edb1c1b218af9f2 v7-2-388 +85a99ba3eb5ab45127c996c4e7b4dea2e7a76c54 v7-2-233 +85ad197907065fd92f29bf3dcc190779a20aba46 v7-2-396 +85da0376313011aa957a9132df2686c9aba079d0 v7-2-333 +86079b930b3e8735933c9349e44184761bbf56b0 v7-1-010 +862863033fddf5f0bb2f18988b79bbe0d289ba45 v7-0158 +86289e90a4bbb818e9cf8bae6e57f7b91b9671cc v7-0-123 +862d920800b1a8a5ebca3e7db5dbe431982f7d0d v7-3-103 +8647018a15f3e4e89c706b6290ab0151565f394a v7-0-178 +869c92bcfb697875d5580fdf3a13eacd5648c5f3 v7-0085 +86ce35c9750f60054f48c1bfb80507345b862d8f v7-0231 +86d71ae0c85a546d4a00b53481b540a4ade2c9bd v7-0042 +871231399cf547112a50a9f93497d40d01b66d51 v7-1-118 +87401adbf5fcbc6fb8edf329290c445528266bc5 v7-1-067 +87a777aea8993a49e61394e7a84847e91b014090 v7-1-005 +87ac4be389523f44914899c37180d22b60757ffa v7-0128 +87b6a6a065ab60f6ca4ed094c2afafe16e0b590e v7-2-171 +87b9f21264a79be4ecfd14f69da0577f9d41f260 v7-1-247 +88095f75d63b5a486f603cf28801df0118ed1218 v7-3-015 +880ece6b24762edd52b414aa1f005478707a3179 v7-1-101 +882b2fa49a2a888a8231f3cf2428b91439decb93 v7-0-014 +888c0645d64f3a844b22525387981f17317d8502 v7-1-069 +88c0c6c9eadab09b029312433f246f65e216a1f0 v7-1-184 +88c68e59d39cee12c580f1df72a5759e58574978 v7-1-088 +89189f7aaad9c28435aa5cbd4db359ae54d0769e v7-2-312 +89300f5e013c7d217d5f891113a57705cdeb017c v7-2-414 +8978513bb5e31d3f20c941e5141d228ca95a6f58 v7-2-100 +89d1e8ed6c1d6d9a672880fc73df97486b2d5966 v7-2-227 +89dc68c0ab6fd676ade26cca39e16b81896a5069 v7-2-386 +8a0a8f10b43e02d44ff26d608cd80fb61ce4773d v7-2-356 +8a2092b558c2fc11605dded24c4c5a817ca92ac9 v7-2-443 +8a22a90c964a168cf3d93f5ff8d5c531a4327ea6 v7-1-229 +8a5a95f7ef2a7dfeb585d0392489fb57ea4c5af9 v7-0185 +8a6982d59d8ef4afa5c178d772bd2943665f0146 v7-0224 +8a6c67218fccfc536fdf829075e99549fb8247dd v7-1-173 +8aa3cd045aefc5d324d820f2239ca1f533e9632f v7-2-379 +8aa94f8080bdeb8908de30bbcf62945dabba1aa3 v7-3-022 +8abc0abf8cbd09abaab555fbbaedbbc231d42b41 v7-1-248 +8ac6392acb0a87a779340f949e280bafcc49f55b v7-1-136 +8ae24f338cab86cb35fd495ddc3cbe2101ae1558 v7-0217 +8ae4de2d02af315b1c0abc2230c3ccd5a31f1013 v7-2-384 +8b2e9257cc116bf30b755aeb37a742ac83f5da42 v7-1-152 +8b84fe17e147219e6ff181f6bd7e809e5116588c v7-0159 +8bebcabccc2c430f05c5d85f8532adccb18a6136 v7-0e01 +8c229eb52e347be77c76c1c2c96f717cbfdba4c5 v7-0099 +8c25f10d49e7186c9785a0f01612166f20a29298 v7-0028 +8c60f65311fa6358488f671adc226950c18a993d v7-0052 +8c8d07318d8d0b1bcfbd395ae7aeec6813725b33 v7-0-086 +8c9396275bfaf3ba6c759c26fef07c0b687a8abb v7-1-277 +8ca3c9ad0bee0c265345decd180d971197e36194 v7-2-366 +8cd72985156286e77ac5d271a13cfb569b29ed76 v7-0g +8d09c1eed8a57bb2df53fb1f1747137e5a3489f5 v7-1-074 +8d1db3e3ac5f3f33dcf5f68ea132502082e787db v7-2-262 +8d2b705a5a51d2a6756f16dee861dae4ea97101a v7-0113 +8d34af900baedf0db9a3e57bbf48eeee75068e06 v7-0072 +8d74df00f7daa4e79bf7fc56164369781408e1be v7-1-262 +8d8dc7e07999acbfd89d0b646d72fab69e06bef0 v7-1-230 +8dc36a64ae8b36d124bc0767ccadba3daea943ec v7-1-294 +8dd456c1e283bf8c85e9ff38994fdfc6dd009ff5 v7-0c13 +8e2d14a3e7d2860527d39f0b662beade84db9d23 v7-2-352 +8e42199f51218e2a14a946ee50c1e8d8ef38205c v7-1-054 +8e5830943bff21c0a2aa18399d18c8269ed9d3f7 v7-0e04 +8eec9649b7a2ea1a441723ce7a4e8637c294ffbb v7-0064 +8ef9da918a98e7f8fecb4d88914e4691a8da88b8 v7-2-413 +8f72e3512b437d2390860bf9fb6605b778cb0346 v7-2-381 +8fa8d7964cf116fa98895d029808a0d5e1cf201b v7-0073 +8fafff87aedbcc1a7c71e29a9369056e5c08e84e v7-0-075 +8fd2e00c44ae10bd9e8a8f5c12db47378314457a v7-0-112 +8fdc1210333357780019fa8dbabc34f07d545775 v7-3-035 +8ff7fd162d3cf15129e377401e49f8210d62aee6 v7-0016 +903088c7a7c61b7f30d35c8a184d90b7af4a44e6 v7-0193 +9032e466829601e6c56046813d0a9a00946a1d10 v7-0189 +903fcd726d9058a0b0c14a85cadf31aae3ad27a2 v7-2-359 +906b37d2f9c3a85fc9c67a29005ad1538e60efcc v7-0056 +907cf09fbb32d7b189d3372f3c4f1220f198a9d1 v7-2-385 +9090f866cd57a7febdb2e0679bf0a5e86951e314 v7-0197 +90ee46d7f4927c095141dd4afa92400f2fe4c697 v7-0164 +912b18745defca4b03d5738fc7ae6c76d701f2f7 v7-1-143 +91e7d4a7b3b0e20b6f5bf9468ad17625e745d640 v7-0178 +91fff9db214e21eeaacd20da86b22629ba6d92cf v7-2-297 +920a993902e8332e3fd539a54997278364fdbcf3 v7-0062 +92168cfd558c53f1fb0d8014559f16be0a795171 v7-2-167fix +9230c45fdde65ac15a42c39d851c68b248fd6836 v7-2-226 +92809ecb9a476994296e51001486b3934561fc87 v7-2-292 +92f3089a7b10dc9e8f5f3c69ab1e490d52ad2f0a v7-0-082 +932fe018ad166a9f8e4b6b0ae91d562cab7c37db v7-0-168 +932ff0c0f57bb90d48470b70cc728058e0c56e3e v7-2-173 +932ff0c0f57bb90d48470b70cc728058e0c56e3e v7-2-176 +9364d114ed8d089f3a42c910442957d33e5480cc v7-0204 +9368159253f847f95c6c1f39a894e26fa3c954e8 v7-2b-007 +93ffa40b532038ad22824047b15c6edec3b6af5a v7-1-155 +94164a5b0626984b565ae6421c64bfd6d993e162 v7-0-043 +94694351f592a56f8a379510eb6992ed0dbee821 v7-3-029 +946f0cbdd535d6fb8915ccc87b837edb15287663 v7-0074 +94f44da44d2e0874a562918005789418793bb507 v7-2-339 +951641b8784de5175cadf9fdbc361db2b6b45060 v7-3-102 +954947a70580c6c5d94bd110f974bdf103dd6fd0 v7-2-166 +95723058b8ff365843508cfa47a3bc2ecb1b0cf8 v7-0-229 +9577a28005e10fab0a0cada6c41b96c9a3e1bfe9 v7-2-446 +95b507e6c9e75d5b4c114a63a98b4bc36c643eea v7-0-145 +95b659982b7c17ff93304a37f43be8dc508e20dd v7-2-375 +95dac6af3b3a8f50af24432b7e355ea44ec69f95 v7-0232 +95dd473d2d28a088822c73309c3dee597c96facd v7-2-044 +96276cc11d8e68ee320e0f61e20406dcb7a0b995 v7-2-240 +96445585f1d9d1abbc74d9c24efbf0408b2cbb12 v7-2-151 +9656552c468d29773423dcd62a323aceee0b6c55 v7-1-072 +96580558098272cca6f93085d79aa7164c7abf41 v7-0-215 +966289a3dd7ea565980bb03abc9b52d88378f96c v7-2-316 +97a73b6f28925dea4310c00225cc6210af00468a v7-2-113 +98a2a6e6b966668c810986b6ddd4820bc09db426 v7-2-353 +98a88a884610aa911950623d7cce8d067feda66c v7-0230 +98cc757f7e3dbff20ade108b82582d7a7d88ed33 v7-2-376 +98cdf5c477ec3c3ce8851a517ca3021aeda6573a v7-2-298 +98d1c149be76b44332bdb72e986bfc8b0f9f21d3 v7-0-160 +98ef5b0fe07610170bd68aac5ba6e739410c913c v7-0-029 +9913ff5706164031d5f847bc0980cc61eeed3974 v7-2-119 +992d5c69d5e917b03abcee24d2fbed8348e21c23 v7-0-132 +9947133ce85b86df83b86f476c09c0454c47a310 v7-1-078 +994ea4e6f0238f12a5516eb75f7a6d7ce86362e6 v7-0-094 +995536cad50e5c08be60c2d82c7b32a63db1e434 v7-1-218 +99a9e42e5688aeecaeaa4642d17be0ca54ab5945 v7-1-095 +99b225e0dbc1989ecae75200aaf0e5329e6bedac v7-2-430 +99ccc8932b6c450cbcdcf86de05dbd5129a370fe v7-0-180 +9a10e4d195b342292cb8ce0d368afafac146abf9 v7-0076 +9a3b65713280ebf8750989758b4b2d42f757ca9b v7-0-216 +9ab23f1e137fd5b0e35c1604ffb95979713f83e4 v7-0c12 +9adbd26f7fee884be78276fb400ee77d333cf335 v7-0-116 +9aec644c45dcc33b3f3571ba0035e7f85430eef6 v7-0-121 +9b78bb3794ba4dba44ab3eab9ab2984797e839d6 v7-2-350 +9b7d8fd5dc68074119d5a609210fc1ba924e9d7a v7-1-148 +9bc164a2c8143f6019d0b13a2aee4be89da3a9fe v7-2-204 +9be44c669f4c67406132ede84d1d2951eac7d63c v7-1-172 +9be87deaeb527ef18daf09d6c75b21d1d7a65d78 v7-0009 +9c510840e896fc3776ec7694fe90e18808036fad v7-2-439 +9c5a9e4356f8ef42ea2c177568b63bfbb1779bb0 v7-2a-003 +9c970d8681f46de0b13ff16d67c2327a19f33626 v7-1-226 +9cbe94fd5c8f1ca388ccd2be94f17caa33ef093d v7-2-314 +9d6a886aceb23fcaf8f64f9cf1ebf3f83d14b2da v7-2-242 +9d74e2f433c0370cb458c83d12b05f72226df489 v7-2c-001 +9dbb57025f2542dad344102c571c06da6b840b34 v7-1-139 +9dc77520c6d3ee0c3e689bc3e6d635cde80909ff v7-0-013 +9dd62cb57ed5845c9c2294b6002a29702ef043fb v7-1-319 +9e0174515abb6667a9e74e6fefc74ad50d7821d2 v7-1-291 +9e084588b706867fae28f93f67d163635a79ae51 v7-0-188 +9e1cefec84dde22d62c1bd2dd0ceb4e072470981 v7-2c-002 +9e265d9089fd4afcc03a4ac7c1ccbd754c8ef6f5 v7-2-436 +9e359e5759f628fd0ff90172d533636440b464e6 v7-0177 +9e554211caf55e33249908747d9259ac77f10b72 v7-2-301 +9edb5759494281d90ae0f312b2ac32c30f51ca50 v7-2-260 +9edc96495747bd354e68dfd76b6ca525d39e715c v7-2-206 +9f184758f277b816c95fd946cd2d63578d296578 v7-0-010 +9f279ebda75194c26ba5c917f68a7102348215b6 v7-0f01 +9f345c48220b7a503fde0367df20e576fd46b04a v7-0c +9f8fd6a14cfc84953deae7d00287a1949c0f0eff v7-2-004 +9fb5bb1ea79b5ba402e51051d79a3476ffce3c35 v7-1-044 +9fbb40a1228a4d8a5f26d1dff8e2ab4e3bd870fe v7-1-282 +a03f7551baccc60bedef5ef6a9f92ccdfe69a9a3 v7-3-081 +a041f68d05909431f0a525eace55307214c33d43 v7-3-114 +a0451524244d6387ea49cfda296f6550a2a9aebd v7-0082 +a07007166d518f51749cc9e145afeb023638a415 v7-0-044 +a0a98a0f12816722b1792141edb3625dd72eb5bb v7-1-326 +a0b03b7e9168b7f7fd61b1563ffdd6d09ca54260 v7-3-028 +a0c01df852e1d183c879ee114b35b2b5b0d06746 v7-1-300 +a0c70314350fde9e0948e598fe57dddc6192468e v7-2a-012 +a1059cda45f226497278c53752d5c07d21cda09d v7-0142 +a112fdce9ebd6d538c70602550e94f29a2fc60fc v7-0-200 +a11e2070c964de1cfb9fdf3ce339ec75b7a983cd v7-0-203 +a135270b75498b76b5bacbd1e381059283c5e383 v7-1-206 +a13e4b242735dd0b3285b7f36fccda195ba1d5f5 v7-0-243 +a14db0b78c590d4bb8e1a190b80fbf3dfff89560 v7-3-121 +a157c4786b79ae94758574d5ecb4a8f4959de5e6 v7-0-073 +a16af0072ea82b2dcd265d050b349850cf8f28b6 v7-2-410 +a1c1f001b99dd591d9082db95de70e2bf8f9e8de v7-0-129 +a1c5a6cb26756450d2b7065999de140c2fb6ca74 v7-0112 +a209672376fd537735f6ab55ce926cb80fa56ca0 v7-0f +a2271decbce54d46f62e7cc9a0c4e3ea3ae9080d v7-3-065 +a27c581d2618b9bab1c7105fba966af40e23d57a v7-2-016 +a285f0cd8a462ff5cb17053fd457646f9d33573d v7-2b-022 +a2b128f7d705ef08ae91a8616cbaf40883827cdc v7-0c11 +a33e606ceea66c946219da3899de9566fb0cad35 v7-1-024 +a3552c04f4e193d981013fa4c077e49d729abb6f v7-2-251 +a36d21d4a87596abd8775c322fced6a539385ab3 v7-0-204 +a3a4be6bdcdd0f43aea2aa09288e8f515a2c2f05 v7-2-308 +a420bba0d851093bb949070895a9dcf4c25e6c4f v7-0184 +a4365075d05c40606c2ace3340e9484a6b045f32 v7-1-093 +a509e3ba61f6e541dc8772a0f9de0c38999fd610 v7-0100 +a53e7d3fd741c68a30085fd9b22d260aec93396b v7-3-086 +a565175274f6efd9d4f725dcdee1b6e049258d3c v7-0-184 +a58806285f2086c1591272962d0b5709a63a74fd v7-2-152 +a5b3a7fb6a5a0f1857b8d0eec380aa7a0f780729 v7-1-154 +a5beb9fb4da85dfc21dbb68af0fd6aec616dd1dc v7-0-024 +a5e1d6526ac7c92fcad2ae100b1d43ae238067b0 v7-2-103 +a5fcf36ef5129596fc281d76369077ad01323b3f v7-0127 +a5fd859f69f1b5c70de7d0439150f2c681d0d915 v7-1-020 +a66a49322b6bc2a82c6cc3e8092db7d502f64c4b v7-1-073 +a66c405786754105eaa63f3264c94ce134bd275f v7-2-105 +a6776e2c9f014491c7476c3a12b2b7f108e1b6f2 v7-1-222 +a686fd6c8beb2c41110e0a65f6a403f0ccaef83d v7-0065 +a711f7a6852db37b1687044ce8a96b6f48e9855b v7-0067 +a73a117542b8b5ec22eb3c61e45ad888d3d76b51 v7-1-171 +a75120dc3e2691218f3144bbc24369283d74eb53 v7-2-190 +a7c4842a0be340d06de659940f9396f969bdae77 v7-2-212 +a81bc802c17ce7002b08d2e327136e3ac4d11d5a v7-0011 +a83f48a17efb871266ffbcb3b6c9cd5a62408410 v7-1-274 +a8752f2805d69f51f1f6370eee8c7e2c89c57db4 v7-2-037 +a881e15f44d8b5888733fc98c39984c2fe6316ef v7-2b-011 +a8aae2e1d2ae6c22551400d451e4ecaccceffcd9 v7-2-049 +a8bcc7553263bb7a12eec8813270ed34242dcdfd v7-0-190 +a8caf7dd853dd5f5ea2bbc671467ab2f78989f44 v7-0205 +a954a30e407394f51218ead2a7d832e022fd2378 v7-2-115 +a9e353f7fcc48a2b603ead42451ea8e89ee7b9d0 v7-1-285 +a9e90b3356b62da552b62eb62b8dff78438f2dc8 v7-0036 +a9f561ffbc53a7097873cce7e8a8e1615ac0c38a v7-2-243 +a9f814054152b658c1b90aadf0f75428e1130cd3 v7-2-074 +a9ffa7c7db7757ae7c1ba0e7d3b990bafaefb558 v7-0-097 +aa6caa23a4b834360b82d3d078d1d17f33d673b7 v7-0152 +aa7c51f81f46cc5379386ac622a5ba44aae1c4dc v7-1-227 +aab202d244b6bb286a62508a432222d26d5d215e v7-2-394 +abff2f6a3ad7790f86e055519dcb851a06fe78c0 v7-0-036 +ac0458d9b9dde727d1bf11e9e9221edc20b623a3 v7-3-026 +ac04f392ba48436bc1b90d3d8b8d384fef4f8135 v7-3-073 +ac33b7c03fac7bf435346233114939fec2e187e6 v7-0018 +ac6d15d91466b34e4ff31765d1d1e1733f02ffc9 v7-2a-014 +acc572c5660c90020f42c9f31c1d2c776c5dce47 v7-2-097 +acfe86afd651f1abcfb6eb38ad0101e61a27c65f v7-0135 +ad8f5bdc727441118cf45678b031d04d1a77aae0 v7-2-001 +ada3271481ceab448c69588c5cf837c2dbc91987 v7-2-289 +adf6a9dcadeda32a2a339069336ebed7fe6d53da v7-0-038 +ae2251be41f935706f7e634a832ff5ff8a91d023 v7-2-185 +ae22c450546cfc001c90ca17999318e053838c30 v7-2-433 +ae7e29b64923da886325215a1a5b20bd60e4cbc0 v7-1-194 +aeac63ad9430d81a0dfdc21080f1f05cdc633baf v7-2-048 +af7afd2bb4c235544fc9da6b34898ea93d477d77 v7-0-078 +af98ef7f5a39aadfe18dd44df9afeedbb0665778 v7-0-003 +afad99b3612ca54f3668c232e8d3ef235d74c9a2 v7-1-028 +afb64d9f5b8ee1eb6e787e1d34ef8b80f15d4749 v7-2-013 +afb740b5dfabffdc759d3428254c944bd4badeab v7-2-191 +afbe4a4c884ceacc349264075afe26e93bc75f07 v7-2-208 +afc60a6339a68f659addfbbb849e249964c9107c v7-0104 +afcf9db31561c7fe2b62b346aca751bf7bb31bc3 v7-2-336 +b00bc2bf23eb62a1883318c6565d3fe0d1b4e30e v7-1-119 +b00d5f429a4b2f0a23710200cdf2a672ed9d5501 v7-0-108 +b04bb35fcd4b7edeeb8e175955a2909a86dad118 v7-0-240 +b0605f2f9786c14e943a0ab440c16b444f2a9cac v7-3-113 +b090b216a832197c70f60ead52026a53ecb0cdd8 v7-1-009 +b0dabd584b8f89ac32af9758c221e948016e2b0e v7-1-175 +b0f8f28a67c23c9e9b6b8087b373d6fb2add726a v7-1-197 +b1706a94f9f9638cc0ecb624dd7519cc9beb6ca1 v7-2-405 +b1b09b68d7069755425a2c1849f517f3f9e760d9 v7-2-279 +b1e87b7f5db64eb40fafb0e9bcbb0c39fa2bac63 v7-0133 +b209c3f94ab7ca3ff559d255c395fa013fee31a3 v7-2-073 +b254cfdd740542f5778d787845134db3c7584335 v7-3-071 +b2789846ed3978ec3dd9a91b6e1ef2f4d054431b v7-3-069 +b2a7d143abe2f572e713acda4a67ebce76511bc8 v7-3-072 +b2cfe84c96ccbf87a7c765442f0e32c62fa112a9 v7-3-044 +b2dcb84570675cbdb4fea2d017bcd093b3f34be3 v7-0-070 +b2e037ed7e33b48a1feb69174850acc393254864 v7-2b-020 +b2f4319efde1edbabcd900a63db8998bfc117152 v7-2-084 +b31702c473ae10db32dcedae94af25228d6c920c v7-0-049 +b34d985598f68b97fe1bdf1d34bf689ea1b8355d v7-2-130 +b4791bb4fbff451efa3ffdabd4e26a668eda2283 v7-1-108 +b4b1b5324380cad36827cc211a2f92fb165d9777 v7-1-026 +b4d11ddb7303ebc28f6a40fea28f003287e77352 v7-0-187 +b4d92472f168c90d60359f6a592d6461686c2db9 v7-1-085 +b515624f6d7dc7597b0b01c5cb03076e4daf3347 v7-0-234 +b54d2f702d41f4fbb8bb3d33e52faf94568b2170 v7-2-127 +b57babddb32b2df9f04b636154a26c51f78d73a2 v7-2-281 +b57f2617965fd682c6284a706a999b58f00bdc3c v7-3-014 +b5ad00887b816469ab8f7733643380a690c1322f v7-2-111 +b5c1cb6f8d565b4fa5b714660e8a0d7f8d8f7a5e v7-2-174 +b60a569eb708bc6563cc1104335cf56bb38ea901 v7-2b-010 +b61422c4dc7a81d340e33e0ddb8ce8cf0f94aec4 v7-2-025 +b62965091b8d258aaa26871ccf80ff9b4037168e v7-1-254 +b63792dadc23ed5ff4e0e9e8c7acc24d9c61e779 v7-1-120 +b63fe7400eb30f9c7b98199a21ed0bdc583aef62 v7-1-135 +b6627f01c67dd0bcdc2f24d56d0a9342cb5dacda v7-0-151 +b6632d553df3c8d25e419d62cbbbd1d8aa5d2489 v7-0182 +b686fb4898d1fd8579e5bf61f36c2a08fee85a20 v7-1-025 +b6ffc2045211c67d42d806af38dae64626aba605 v7-2b-026 +b76637e5ace1cd75c1894c44e132ea1e4fdc1a9f v7-1-289 +b77f790d53f6b57604b1ad5113da4ab08b4ca918 v7-0-236 +b7c22e34316251f32fa1034d11a3eba1829c2b92 v7-2-043 +b7c89e3e19f703c0ebccecc10ee044367a65ea20 v7-2a-011 +b803b277688037509ad1b6d30466721396d8967f v7-3-062 +b8744d1982d1fe26fc41d62b6e84fd315dd6c941 v7-2-407 +b88f0420148e5e65c2f71f47ed2324fd83b3bd2b v7-2-155 +b8ab4ba6b11018e468362bbadf077654f9cb4be3 v7-2-304 +b8c880d61acb8d5e08ae0cb558ece76d96d12341 v7-0-185 +b8ebbfa519b990d6b892dcf943576761e714c2c3 v7-1-050 +b8ed23ef6ff15604ead321f758ecc624a9d35c2c v7-0-042 +b9202c4cf847ac1898b4af225494197671111785 v7-2-124 +b93a3fc3897b3e16e96b80e35dbd72aabf9cf37d v7-3-078 +b9897545378516c8afe3140b7172d838f33e5b29 v7-2b-009 +b99303b1483f26763f0c4b6c9d244763ad32d476 v7-2-309 +b9975513fe244047a60acc818edd8de94935cc28 v7-0169 +ba2ac6b5bfb9679edffd08edef9cd0db1237ea12 v7-2-259 +ba32a005373a78e0b07972880704e2183f578f86 v7-0-136 +ba51f75bd4b514d5c4d48e57c6018c955434b936 v7-0221 +ba9375e24d4937d863ab87d28e6b7c1ed42b3960 v7-0-050 +baa5f81197c865fd8847f6af95fb1d48cea6aa65 v7-3-043 +babbc735b80efd1ef23f35dcc77c5f5cc9e68fea start +bac7c3fce15019af25562f5c19b099c55487a6e7 v7-1-133 +bacdeee78827acbae22a7626a93318ee1919c883 v7-1-014 +bae8347a9ae1131d95a7af1d751fa47df5d3baec v7-2a-015 +bb3661a2eccc165bd5d2a87a8d4696f89431a459 v7-3-116 +bb4797166e4c610516eaa16865682ab14411ecb5 v7-2-064 +bb7a0b90100aae1f77748f6f38aec95520825c3e v7-1-023 +bbf0ba46e51d5a4e58b872b840c5dc3e1ca44234 v7-2-116 +bc3f88ca060d25cad633a20548ca38cc529fa0ca v7-3-045 +bc68103ea3f6a13d26598bfc1958a57eae377a92 v7-0-040 +bc7ec0f1f7f35c3b58b3e32bd2ba1b87501b17d9 v7-0170 +bc95c6c4bac13d4a0f8a4bd6ec10f495d3fa5eea v7-0191 +bca50c9e1374c176a63f9baf0ed7fcb34ea16967 v7-1-147 +bce687811199a7866c7728b09f00406ac1294745 v7-2-287 +bce7c73fd56da29730fff999a1fa4b0edea3285c v7-1-157 +bd7e26d05a3fc8e010566ad8f8aea9c31ddf55c8 v7-0-034 +bd94e22dd3db36f07fd31b2e282f25ccc7335f58 v7-1-163 +bdbaeab157e6f88d82056df6b927acb5b342ae01 v7-1-272 +bdbdec22a225553f5d78db019e13cdfe92b9cb5b v7-0161 +bdcfe793d49fa832470953794583b4bb74ab9fb6 v7-1-104 +bddda5d8caa1c6bf174c5e202d3b08a51dbd54a7 v7-2-210 +bde3b38593f9d07da76cdf37ea574fc9d80aa43e v7-0-052 +bdfbf8ef447a4fabef09ee9d28eedcf0e6b99e57 v7-1-249 +be0f21f63d2c9651429a6ec9e97b8e6e9d0d102a v7-0091 +be1d64f82db26bf7892605332aea6126d6343e47 v7-2-325 +be8e2719caa6c7194ce4713206da6f1f8db694ca v7-0-138 +be9fbf8b0cdb6a42c07a8be94e9fba866cff00c8 v7-0-146 +bec979a53f47ff6866d390eff6c4ddd4d5ce8a8b v7-2-307 +bf5ba8a0cdee590c0841391f9a8b65c456ed06bb v7-0129 +bf63a31b77017d78197bc0155c0ec59e31559df3 v7-0-210 +bf7803d0f5b9d0a9cb16636b9490d723623c57e8 v7-0-019 +bf9579ab26e59cda4bdebcd934c43b6fbded60ce v7-3-019 +bfade53bcafb7b6d297f23ce3ba9e6a72dcb7949 v7-3-087 +bfd69bfb41491b83ac7a4b948c649eaec251c54d v7-3-046 +bfd8935d62009b625c37dc373404b67d0019d7f1 v7-0087 +bffbbb566d6b1004cfe26df89e102c465bed4312 v7-0-192 +c00efaa0af249c086557487d172edd6a1cfc0706 v7-3-053 +c050d5bbe79b6a0bd83fb5dc0c13c350492c7c4a v7-2-063 +c06c658691e20f22ae95d4cf117057c7d0736308 v7-0-087 +c0bb3c1dd44695b4eda074afd1a7394d2b7e4552 v7-1-132 +c11845a465ae63ea7f9942484988dd4e441c891f v7-2-370 +c12f39141bbc7c031b51352896a78324ad27398c v7-0053 +c1709e3f8536100dc87defb9f788f895b4e73578 v7-2-140 +c17a42da3920c34a75c17fe8696d2f04bf683f24 v7-2-428 +c17ba3fb433e7cddfdbf2244b777550970493b0a v7-1-106 +c19f6b8d0393dd28a2673da19e8acef59d371f65 v7-1-304 +c1b61096e3d0e4383db1ef01a5dc2f3ebd5eb0fc v7-0-074 +c1f67ce5740adaa7e1e164d706f204252711d5df v7-2-382 +c21975c58b4497d08a2fa30601723537ab1f03ec v7-0123 +c22ded254d0591df640c3ee0ea3dd0a490fa2396 v7-2-071 +c2cae213194d26214a9132c1ec7cddbdafd18175 v7-0e07 +c3242ae88ef1d4cb6eea51fdf96670cae48fc64a v7-2-081 +c3242ae88ef1d4cb6eea51fdf96670cae48fc64a v7-2-082 +c37ed44f014fdcb211ba3decf81d1f3ec94a210b v7-0-153 +c38cdd201cec8e9a774b7256a5eadf2d7194aa0e v7-1-059 +c3b5d3fe94046702944964c32eea7522ecf92c4c v7-3-020 +c3ba2dcc4cf4b96ddd1e3df9beacd1e11abe7868 v7-0-214 +c3bd0a84e11ad1caf53402dbebc39ea8b01fc832 v7-0-167 +c3e225bc213a1a91a278fdcb3c5fc003ae886f02 v7-2a-009 +c3f63ed316b621743f44a5ab6b9a5438b88feded v7-0227 +c44058ba78bc108e98fc15a14756716c3d3241fb v7-1-141 +c474f5691c0c6461414e65601a97e817e976099a v7-2-164 +c4d200412ae9b66732f2c9be98273802a0acdb95 v7-0121 +c4d5f3d8ad71c4d30397ca0101a89925f1666df8 v7-2-099 +c50c82c5e230a9ef1cb570be0a57d3dc9e295993 v7-0069 +c50ed526966abc52d825a36d5114bebc21f850b2 v7-0-220 +c51a4f9936751df0e9bbdc454727bced532da3c5 v7-2-255 +c524f99c79251a7b614776a5d064ba40c8d4d5cc v7-0022 +c544a3507e839f3ad4db6e1d7dd7474ed0167b96 v7-1-066 +c5871806d7e6c121c80030dde025a96c0ddec820 v7-0-057 +c58b9479e304ff055b0404d9d73a51da4e9bf7e5 v7-2-315 +c5a806b29372c033c3b616083c86159a8719635c v7-2-306 +c5b05f6de1adf8bf800da0bcdfa04a262e0e8329 v7-0047 +c5cafb21c45b5e1e16c006056dd5b8f5ad91145d v7-0-096 +c5d5e0f3403f65e77307d1bcb5d71acc73cbc90a v7-0-120 +c5e1b4b9016ff900a005057fd1a055c70b812414 v7-2-047 +c60d231453cfd59c8b313a894027cecc0a4315ec v7-2-424 +c6296b0ad9eae4122e31dd3b4f363e073f388a38 v7-0151 +c649cc22da98e2eee72352917030fc6068883317 v7-1-060 +c669f3280f595ba6133a94d8ceb3ed3ef6c2a4ad v7-1-324 +c6b06a4a8f928b1868a3d48d95293730262a041e v7-2b-023 +c6fe65c000d27b9ddb0cbdffe43cf188b7a51f2e v7-3-037 +c7537662746d8bae8bcdf8502a23a573a54d3855 v7-2-186 +c7654c4db8fd57c397bdfd3b3142632a4e761f32 v7-1-153 +c773cb978acfd216004c871e883d2b31cd4cc0bf v7-0116 +c78d973dce9e0456b96725f55b853ecbe4ebda96 v7-0211 +c7905d03c72e74540d91b1ebf3fc9cfffc2ba699 v7-1-273 +c7c53db66b5521d2deed3b889fbfb13030868942 v7-2b-019 +c82bb7ade452d18a121a6b0b8ff654dfad30532a v7-1-137 +c845dcf7fafa91d8cb370f690c16748758b20332 v7-1-110 +c8568bc2db390972c94374a031bbd195c4403ffd v7-1-311 +c87ce0b2ee2a14d3daf3902bdd4163a002ec7a22 v7-1-190 +c87f38b71d27d9e420e5947d4e99eba9e3eb2e19 v7-1-070 +c89903e16772bebee28ec935f7459c8c83bdf05e v7-1-223 +c8b6b7e1005daebc2d72c578d70b455f42b5bd16 v7-0150 +c8b87fa14d277702b7ca6b9ba18470c3d64ad83f v7-2-179 +c8c47cc9dab1eb6976b9c214c58e65beb3a45e97 v7-2b-025 +c8cae82dee305d003f809d91025ed21582785597 v7-0-061 +c8f343a465a271cec752fce3efdf5fa8476d3c96 v7-2-180 +c94bbf85eb160aa9eabe33b13b267c1446019eaa v7-0-213 +c9b7b1e711d194070184c9c198fbe8126701d1ee v7-0-235 +c9ddc2338f41c43a30044dbdca1775b919f80707 v7-0-058 +ca4883686f934bb338dfe3a2fd7d6d3995c3e0e2 v7-0-088 +ca501ab2fdb3a4477a6b8e469c1a4d8f1859d92a v7-1-170 +ca5b52e99385825f0083c4b122ebfb50c2653039 v7-1-255 +ca82de29ac1903bb1295c04da5624cf295b6447c v7-0g01 +caa550fe445725dea9531b9fe9f0d0f88961baf7 v7-0-191 +cab25717c6a69a7d9ebd010153fd9be9529fb49a v7-1b-002 +cb49fa8c71963b7b69529dfc2abd00b791119fd6 v7-0-126 +cb6487d683f2260fc0b47b5e95f78a297360b1fa v7-1-216 +cb7043482eca744ad9ba1eb11f08cc2906b6bd3c v7-0-149 +cb94c42c0e1a1e00f643be8a96939e42c3afff81 v7-2-445 +cba9c4003cb554f909fdb6426b8870bef24b3edf v7-2-085 +cbc9c335ddb17f9b0e9d281e1c5d97a20ed4fd94 v7-0-119 +cbe70f2e756d80015f6f0057e13a882ee7567276 v7-1-259 +cc03a79fdbb9315956fc22887483a15b414278ea v7-0-197 +cc4fe241baa3596ae9cd27ce65ad25077bfb2e71 v7-1-236 +ccbd8177e1f439fc23ef56be942ab0253d5dcc26 v7-2-132 +ccc9eda1cfcf918fbd1933bca9db01e246d5ef12 v7-2-138 +cd3689efd90a5934dcf2e4e232d97939737414c3 v7-0173 +cd3f52531f6c8f16e89e97f335f974fa25f4b498 v7-3-124 +cd6175cc27d9c8b4d4f4dadc7c38f6c490f3fa62 v7-1-235 +cd7eb2a18060734504ff974065d6a7adfc903b34 v7-1-041 +cd9471bd8e9eb1d2c59d00a7d18dc07dd97fcea6 v7-0-047 +cda8f3aceb85c72c94498120fa171939b83cc8a3 v7-2-120 +cdd82acd75b449784a574058387449096667e56f v7-1-125 +cdf37c8f46163497e0d7fabf9655be37b692fd1a v7-2-008 +cdfc3897c8950aa84c84c1a05158afd32ba71d06 v7-2-222 +ce2181d14aa08a59250267dbec36bba362eeb908 v7-0139 +ce6bc4bf2b87f2303bf47fe64ebdd470711973d0 v7-2-244 +ceaf71b15d813665b3b02036a619bc967db90d8f v7-1-177 +cec8b867838bc2a5b5f5bb0146010060639fea90 v7-0-114 +cf080795d202ac2ef02d282f4aec111b2ec126b7 v7-2-135 +cf0979c30cafc4fbe239ebb9de3c427a265207a3 v7-2-144 +cf4d73a8924e715fb5fc7db94af9a7e67d7643dc v7-0-095 +cf83dacfa25fb1fd8d4929ff2abe871c72ad94a8 v7-0105 +cf8f86128f4c428af72c116cc53d92ad7c1e40e9 v7-2-435 +cfcc1421f5e431d3984c3e9ef3f360ceafaef76f v7-2-146 +cfccbe492612c69ee77d6cca4adb690794e5feac v7-2-126 +d065616e083680035f38a54409e857ebc2202db3 v7-1-146 +d06a461924a3f92575d81c2d1c0c3a74cd0a2929 v7-2-322 +d0cf8c843186301d546870c2661cfa3e8526b3e4 v7-1-100 +d166fe2bfe7438b1539cdedf1810dc91a1cae01e v7-2a-005 +d20d37ef86c8844da2c9c45b2d9fc8b6a2dc3f78 v7-3-129 +d225695aa7945c27e1eed207e3e683b16824ea87 v7-2-282 +d23a400b718419e039eaf4f8ce23517144d41faa v7-2-019 +d2612392202f9b87c122b7233b0bbc67c9edc004 v7-1-004 +d2796c60ca6f11e05cbe080114a3cfc6006488c7 v7-0032 +d2a4f08396fe8c01ebca988db5eb95b7c3f9db8b v7-0f05 +d3571ca62cd6a9138b0aaa4673b09dec78e540e1 v7-2-323 +d38420e2fafe99d58b915213b73f8d1b8c7848d5 v7-1a +d3bbb5dd3913b6425ffebd18b232fcc2d1907046 v7-0f02 +d3cff90680f3f985c21e34e03607a5808ed4dcbe v7-0-144 +d433f43849ba1dd0006dbc4d794cda3502fc24af v7-2-332 +d4b1aca2e3a97415460ba21ec81eba2218cc0be1 v7-1-128 +d4bc24e6a28144ebb16f143efb72ffdd98bbe0fc v7-0-156 +d4ea645c77489da3d5f0f0f48a14bb63793e1505 v7-0041 +d4f3db33d782da9d33b2715fbd14f5acac280ce0 v7-0037 +d51bf80e8fc9b1048c93bd26e308af7c250ef629 v7-1-045 +d5681bd2661b3e75b506a7d6ffe8bd053e04608b v7-3-013 +d5867fd6b2b72d8095795f4db9aea88035e49e5c v7-2-330 +d5892839ed90bb1a8f9f1b3ce88bcc205e7617cc v7-0156 +d5ec1b42ceb06062f03d828acca852a4ccfbc7a4 v7-0111 +d607b48414b79e7cacccb66391683b23cf1b2cbb v7-0-099 +d608343d25e6ce4b1e6435720c48762501b0fc7e v7-2-197 +d66394147eea6cd5b304fd2b78e5dde46fbb1b02 v7-2-136 +d6a69271cb9a787af6b3a05b01275c9694a144c0 v7-0194 +d6d6ca94371317962df5d92c9b879f7602d3e234 v7-0098 +d6f0d3db1c641e451f9cb0d0697f1b18939d6cf7 v7-2-087 +d75027183cf4b44b2a92333e57b9bc3fe2b2f5dd v7-0-230 +d763e7d7e938d8dd3887b7279b44e3a857285d38 v7-0-189 +d766b2ba2fc6d5b6211cd10d90236dfa8479d617 v7-2b-002 +d7860ee7eb7ef5c27d45c4569107376d3cbdbdef v7-0207 +d7ce3adb8dda9d7acf8aef39cda0b936ce3f3d15 v7-2-362 +d7e33248b9c80fb5c1af5880d6c6a4eb507de990 v7-0206 +d87865573d809129e6d25071cffe8ab451ea2db2 v7-0-041 +d88bdbabfbc6539ce6cb149a3e8b025740a7f351 v7-2-109 +d8983769c9ddbffc13ab427a5e44693070d7788a v7-2-361 +d8af28dbfb80aa6c6248000b011bc9df6f8f337a v7-0-152 +d8b9701a3b7bb58e3f7f2c72145a0dfa33501f31 v7-2-193 +d8dbf7d55c5e9ac3e345eb1b2b86986be3582fdd v7-0-018 +d8e7b6762aaaa48f6bb72b1c51d535119e79c379 v7-2-096 +d8f905020502b0f35d810f27b4d5d28689bb7764 v7-0b +d9030055c432b20797f883c956f094416e00c622 v7-0033 +d92358c7d6216ff56093067384eb7d96ae47696d v7-2-238 +d92ac5a199fe88f1630678f81e0b47d5f3f1a921 v7-2-196 +d92bab35a16720d2b4e3a2b836fd68df0ee00aca v7-2-234 +d94c322508140c4cc0d36364d994f475aa84f8d0 v7-3-075 +d95676480093879730aed5ba678e3e8305977a4e v7-0-067 +d97518d6b3257b4ab48aace82f9197bd099ff758 v7-0063 +d976f4da2a4d56ed9b59c61f6971ec0cb18c84db v7-1-264 +d982226b7aaaff40647eaa5ad05e01538e90065b v7-3-023 +d9cc61139d12c315d790d79890402ef957be00ff v7-0146 +da0991871b02a5ba7bce7d3c1180d01d50d7646e v7-1-017 +da1d62fe5379f77a2a165e40bf4bcad0466c60cb v7-1-063 +da9142bd190a5ee0e45536ae4c2913be5bdb02b6 v7-0149 +daa1e34570ff649af9d7b64a447cc6d2c0b60e38 v7-0-093 +dabcabce3f9d67ee2cd22246ea16769513982910 v7-2-419 +dac5006b4443f99681d2068d0af065bec10d7a99 v7-1-162 +dae4cd29a0b7d899201c2e6a10f0441e7173bcfd v7-2-347 +db3ca1048f7f800fec81696d29ff8a7a3027a64d v7-2-320 +db44f7b81373a02990aa6030b85024478b7d82bf v7-0f03 +db83098657947521e0e797662c135516a4a300ea v7-1-123 +dbd226be80b18c494f4438045d34b65530dcc198 v7-1-027 +dbef8434a2ea19482b3ba72b428c57dafaad29a4 v7-1-329 +dbf53ece2e23fd6e8652c531ce7976f54ae85635 v7-0029 +dc8197342755fda6ca4d6619dac228406867a7ce v7-0d04 +dc81a4fc63185c72c940e8ade45b5e1534523351 v7-2-143 +dc8a5699253b833ec796460f9ac877d02ab7b165 v7-2-406 +dc8ee74574f80c7eabc90ff7a3973f882993cab5 v7-2-444 +dc948c8dfd1550972011e38d59b9a8ade5a000c4 v7-1-019 +dd9db57ee7ce46bdc86cd787fb58907f20c0a973 v7-0118 +ddafd2ba3a863054041f2f71248f0ea91fc3b1d2 v7-0-117 +dde812fb22478c1fbd34d935ec466b2cd9869da4 v7-2-437 +ddfb6f3f3b2be6e5397db2601f392c45f4a05b84 v7-0-012 +de0e7ca61893d31a4a5ad8e129691650e31477c9 v7-2-427 +de8224965034eaf748c4205cc2a61e097b4aef90 v7-0-063 +decce137e7beaa2edbfb4783d1cac714c7d84d14 v7-0-098 +df6967461cef05aa96ff708863d380e9d15f3bb7 v7-1-065 +df6b12c84b2359415cd987c016f5de135c680100 v7-3-047 +df7ceb64b0c65cc5ea525f7df25ecdbba80b0208 v7-2-137 +dfcff6590aba6d93a69b414759b164c255fda08f v7-1-238 +dfd5dcc73daa3934ff1f47d6d53207de2f9034ed v7-3-067 +dfdaac31aa5df021b444bc2ba64307709d863c63 v7-2-230 +dfdaac31aa5df021b444bc2ba64307709d863c63 v7-2-232 +e038754d419a3ab5ec25d014513bf8773cb9459c v7-2-408 +e03cb9499b83f972c2bdef503b1faa15481da81e v7-2-015 +e06e177de52ae555685a6126213dff168048fcc6 v7-1-305 +e0e0d1ae601197ad22eaad3b721407a2d0cd6294 v7-2-318 +e1070b3b03e9b1490157dce8db81b026460aea35 v7-0-081 +e10d3c07344929c21377722bd3c66d3c54ef582e v7-2-423 +e12f574898a9b21e39af38cd57e50ca87ccdea81 v7-2-272 +e1336150cfcf7e64f66563629accb1cc84fea036 v7-1-089 +e14d0a530351fe26450893977197e81e9e9ae5f2 v7-0-177 +e180933b876a74ded043348c0cff4fb209d4d92c v7-0219 +e19ecdb13f34ca1ccb3dd3c382a08423c385e847 v7-3-080 +e1c7d0ea5dacf4184cf49c3d05d6ce77d944a367 v7-2a-002 +e1d77e652cb7f9e84072f16b3ac6dcbb73a1fd81 v7-2a-018 +e1efa991c2b6992bf361cb432895749fc6b1109e v7-0-106 +e212d1a40ca9638a4b306013d54417dfcbe9d8ab v7-1-243 +e2680bc6a18024d68ce8100e21d4d307dd647aec v7-1-011 +e2d7622d70894e506f9c722bc8ce145521d098b7 v7-2-106 +e2f5c1597829256cfd784681163c232bf907f1c9 v7-1-092 +e319a4fe6e32e0297f1be2c1a8c763f7f7b26cd7 v7-2-378 +e351146e7974acd49f2e9aab749f31670b2c6044 v7-1-116 +e44523d45bf5e276817b7f1f8987f2a8ed3132b7 v7-3-125 +e44efb3af0d58fc58a392e58c604bee91bc52e2e v7-0-060 +e4fa26ce87694c7d810796d41d0f03981e500d1d v7-0187 +e5145ff9c9b0dd7b29154c2ffd220988737c99f7 v7-2-285 +e5602d92da8ccb4822917b2df3e6099344bb4ed4 v7-2-177 +e625dad74346d76132cbcf6ddf98b95d2c8fbfe5 v7-0-113 +e6372ac3ebe536aee65848e52e58fc817697b98e v7-3-063 +e641c7a27c470de82019d313a158a9894e0befc1 v7-1-181 +e649c78407e600ab28819574efd7d2d67f066171 v7-0202 +e65e50609469f1c5d98ab7396803fb697a78bc17 v7-2-219 +e68d8541494dc36b5778d9eda2814014201b0335 v7-0228 +e697bd3c3876c27addb414ae170d741aa1eb1917 v7-0075 +e6a8d55a1626baa2e38837b0e7a4a6bc65783623 v7-1-178 +e6aed39f12648124b0b4e23c669cab6ceda2ea1e v7-0-158 +e6bd96f2d7b81a8963c9c8dcfd9e2b3f08a9f0e4 v7-0-017 +e6d25347de2cc7f7632cb0cbe5adef45d9712aca v7-0-182 +e70aad5761b59933a1f69a8756457fdb3a9aad40 v7-0-069 +e70c0d863e0cb2b26f16acd17ead7ed267faef53 v7-1-022 +e72e30c69d582a55cf3c4836aa274a006a457fe3 v7-1-261 +e73f2978bd4061868337a25ff09c3c84b54dd2da v7-0f04 +e753954c86e2ce32648d9b12c3c135c22748f75f v7-2-237 +e7633eb32cfd9cd631a73f4d412272506261b427 v7-2-098 +e76a088056dd38e02a99daec0741aad6f32a24f8 v7-0-242 +e77e3c11f5076d6eae8a67bd2f531f72d33eed7e v7-2-331 +e7904492cb75b7a69964c331945b261cd4232a7f v7-0071 +e7f6ca5594cf9c6a3902458e0635bec7a7c40d87 v7-2-149 +e8450dbf6f031f2727798a7d955e83dda7ba0288 v7-1-086 +e856f9cc2aee46628ecb83351489d4f41d66c6c6 v7-3-064 +e88950f0d4f699846875e45dd3887cbdf92bc3b9 v7-0-084 +e905716f6a3aaba3c0ba1d18093d4f4f09550524 v7-0-090 +e943e5502fc9cc439294de385dc564226b7311a1 v7-0050 +e9624acb93a750d835c361c08bf3e78f587f6510 v7-2-028 +e965cf54d887eb9bc20b6668d83541992cc4e8a7 v7-2-157 +e97a97d6a0eb98b21bd068283f192e0a2f2b1a89 v7-2a-004 +e980e93d2ac2c7838acfd45fbf2de06939c929bf v7-1-186 +e9c9f37be3066d64d7d87d1b314b2913d0d751f6 v7-2-416 +e9d018b58830d50906a81e1b1ddbb3e2bdd9126a v7-2-107 +e9ddb2181f063b67b3075844b4aa7359db5750be v7-0155 +e9e3355861ba8785dba619e2358a239a9443a580 v7-2-342 +ea15087a42cd21520e628faa3c53385246c04743 v7-0-085 +ea1a2950ed16f441f66ba319615d47f1ac67402c v7-1-191 +ea399ac2c1b963b068beed88bfaff7620d345333 v7-3-138 +ea9f418ed072f45fc1cb04e455379e3db1c0f182 v7-1-215 +eac2556d46208785a173d44b4efff339a7e2fab8 v7-2-215 +eaecfa88c2469471804768932f823f5b264dd0b9 v7-2-148 +eb0504d00480ca6a7758bfa35d64a09b3d389fca v7-1-250 +eb1ce51c1cb0dc7825570f7cf30b0e2c3e9749c1 v7-2-129 +eb27e3e2df706466ccf9bd00e407d2d3419a81e7 v7-2-265 +eb4ee2010aae8f4361054eb367a7b13dcfd738c2 v7-0-107 +eb531146be0ec6cce1187568cc841718df44a296 v7-0114 +eb57516376d4b43889fe43594048f183af15c31e v7-1-032 +eb6fc577c96c2b5e322ca3760fa4e9c043ba5a8c v7-2a-008 +eb800128bd894e9b2c661627d2a302344162987c v7-0-092 +eb9cbad50fa34fad2b422758d6d814059aa89f94 v7-1-313 +ebe059f69b9e46ada2c6e02b3979e31d1b11c906 v7-1-296 +ec5ed41eea2f1d83df5a2507ab2f469fadbbfbfa v7-2b-001 +ec7a570696ac0e50147e2419d8b269ccfb75f25e v7-0-199 +ecc637a844592d48cec38bd795a17ecf6e0253ec v7-1-114 +ecee28dd16d25024fe584cfb8cd0923f1184398f v7-0213 +ed44c1c436d3d61a94062c7a781b77dabeb8ebbe v7-0-100 +ed7fefbef738386c39248b501556bdea80d0f8b4 v7-1-276 +edb3bc186e97a3392b3aac634526a4f4f84f4011 v7-0-020 +ee41e031dfe14ebe50c289158213f05eca869bb1 v7-1-179 +ee50cd1a303271c6be6cf6121f50c0abb8772dbb v7-3-088 +ee9d2d24ea9bd0a7d500f1c37cbea802d8d1d88c v7-1-231 +eef96cfdbbbebe5aa61b420d3eea31c3c5b6d719 v7-1-314 +ef0fe6201b843f699b3ed7483e52eb3348ae5b11 v7-0-006 +ef2890033e88391e92eba7d1ade8a43e9e200abc v7-2-337 +ef3a3ec8940cb0c55d35d2e5fe924a09d6815f2c v7-3-070 +ef6b11bee7d06a843474888d0bbd67d14dd2065d v7-0-181 +ef7fdb3c6927725abb07731a46ab78404ad4c7e8 v7-3-105 +ef886129f0c0be912c7b6c21e695bd9980d31210 v7-2-088 +efd0ce477ae789445312ebb08a0f78b835dd6f5b v7-0-194 +f012c4ed8c38499ed2901d139f4409e2edfe51da v7-0132 +f016c3708ae32436ab545762a1bfb8ebd31af975 v7-3-106 +f018c759e4ed5e1a851c1353c118883efab6a155 v7-2-274 +f04e890524be4a82ade7526f62a967390d3f1cf1 v7-0153 +f08390485cd365abce88ade8987e56bd267cf3e4 v7-0210 +f099adbff8871627d897979b432d74ad1623369e v7-0-031 +f0b3b9ac2147350b1d1fd762cfda0b3073b0bca3 v7-1-161 +f0c598082dff6f0332c9af602b5b4996bce01ff7 v7-2-104 +f0cfff4dcc2f7cad78ce86aae0f4cbd3371ce46d v7-1-283 +f0d6b2bb1093eb12925cea635cd58de0594c422a v7-1-245 +f10fe14748e260eb0d8bfe375cadbbaa0e5ceeca v7-2-055 +f12d38ee49de595d11efb50674bccfe0417c7063 v7-1-006 +f138491673309c018ffede08cd4858c3bf318dba v7-2-169 +f13a0227fb8844e591b6526e4393c8f93dadda29 v7-2-305 +f14cbd913415ac4d6a9968dce20a20291f8c0d05 v7-0097 +f14f7aab518707c29a8ffb75a4e8217de58dda91 v7-1-212 +f1d1214744679d401e17e9ba97ecbb6255696ed0 v7-1-287 +f1d2a58883b96144abcd5b44dbdd190a67b3eb79 v7-0024 +f1d46f94824128251d1212cfaef0b1bfea4dc71b v7-0163 +f234c87ac7e9807004cdc559cf68aa5e04850f5e v7-2-248 +f26d0c74a329cceeed80a7985f5efb5662064283 v7-1-039 +f2927225367a3ac3fbe86d6d03ebb7a526072ed9 v7-3-039 +f299f0bf32d76986d5596d279bc0733cebe1942b v7-0-211 +f2d46e4a859d0f12f12fbf332c40a717dd07df14 v7-0068 +f30c8ac7741c82503bf897fcebc68f199e5b0998 v7-0225 +f339305875fa7cd21cb4d42619f5b9789a027eb2 v7-2-229 +f3669fbc9a31512a0b81fe7f647b935243a76520 v7-0-109 +f38283ce871c19cb82b1c4d364fbc3a242c057bd v7-3-131 +f38b7359dafd1f168a15698412d266c17a16520e v7-2-102 +f398e0cc5b7a032f327aa2f33b71c3bb6a22d46b v7-2-349 +f3abb6aec8c83ada21d56b8be4ffc6be55ce39ba v7-1-048 +f3d3545d6bf6405662476b40e019044b880d8f81 v7-2-058 +f3d7fa7dcf634b669a7d7859bcc39796300346e0 v7-1-035 +f40f1a8520ffaa57ae73a720c179780025aacd64 v7-0c01 +f41b6108e46b7cb3794b2a3680f2ce91b402fb21 v7-2a-016 +f41fa84cd738b945ab34271a92f44e0d1445dda2 v7-0g03 +f455396f3c3fb524ff1082cfe2cd7731f67877b0 v7-0043 +f49d72bf9c5c425dfb8bb94c6bac975716e3023c v7-0-124 +f4a775df722b13250c2b9e6f1154c31ffd9b211f v7-0145 +f4c7b5da017adf78554a240587384823e58ba80c v7-1-012 +f4f8014d516e9b9620311aa2bb7a5a2d5749f451 v7-2c-000 +f529edb9bab3de35ca7451e4d45cc90e9f7aaf81 v7-0025 +f54dab7cebabe6aa275dd6a379b42a15c365af0a v7-2-280 +f55897d6921d622ac2649e4c94ddb38d121c2832 v7-0026 +f5bd6753cdc40733c903090cef1cff033942dcf7 v7-2-440 +f607f15ab091b6a51b0546db6a6d42adfa599c3d v7-0143 +f628d19361d9812a1266baec9f76d60c798f92d5 v7-0-195 +f637471a3607a43bab09a2b61913201a5100e636 v7-2-192 +f66abfa335bb76d20f2a375f148fb7705bfde287 v7-0-170 +f6c72dd1962a46aec26c7caac6f1c3789321e91f v7-0-030 +f713fc55bf7b9a5cbb9ae3628547a78f4e44bcc9 v7-0109 +f765f9c139de3555cd181bd4fa8de50d4aaf41c8 v7-2-158 +f798c90439866d3d29eb0fa460d51e4de26f27d8 v7-2-224 +f79bb032002565143e3392cca0540216e7f93e28 v7-1-241 +f815aad6c05549bfa36f193dc57b1f03d646bb79 v7-2-343 +f84061aa57e4498f15155a4a30da40ea07be84e0 v7-2-030 +f85fe1a05c2ae4c03994c9ea2eb87da590bb3214 v7-3-133 +f88008797313e07112b8c4e549dc2217747fed98 v7-0-101 +f892bda292a89e7592ccee5fc0e296659066d7c5 v7-0198 +f896a7dfd47d15f11ac663f132fa2c5aba91c829 v7-3-052 +f8f35d8208e6c242026dcedd8300b82f415fc59b v7-0-179 +f921368d43c3f0b9b32f52f881e7e58242489bb4 v7-3-093 +f927ca2cedb40441abcd9cf5e18cbde2863761b4 v7-0-226 +f92bb184582321910573561c941167ca46b9850f v7-0101 +f9366d458bd09b73aa46cb202c7c6329e608bf0e v7-0-217 +f959cda54600f8d014cf3a3c69285c598985d828 v7-0-027 +f987220caa57c4d13b64fcfd24cb4bc6a156bb00 v7-3-094 +f9bd6784f393aa771d497611b75a8623c20a8269 v7-3-009 +f9c55e12835e88f072c46b20ac9dac25a46ca839 v7-2-218 +f9eaf0a9872df3ef8610d3fae404231447954d5e v7-0157 +f9f6e35c9f00ee6ee518069ff2bf0f93b635b8af v7-2-005 +fa07532e69c6eec9a6860ef1362f1d8187b8244a v7-1-193 +fa5dee44df3fd23f96090d225dc11dbc4de7bf20 v7-3-034 +fa7e62dd58d779149c96570bc8943f1a1b035e3b v7-2-364 +fa9ee618000f51e5da6c951f24c9bab78f2bb428 v7-0-110 +fae6fb779a6be78f2609dac4fddb8da508735dc9 v7-3-048 +faf4b09c396e8572e84eab84eeb60ea0f3785529 v7-3-097 +fb1222c880fc037f9b76580423c5a57c74acba28 v7-2-344 +fb60c9f35517660092b161abc1e4aa17a7d0ac05 v7-3-040 +fbecb12e37f5b1523aa8e6ecc07ea6c07ed65270 v7-2-131 +fc0c566b91075643f259863d171bb253703698bf v7-0-064 +fc2ee817dc9861774c31bbe768cddcaca4690e4e v7-1-328 +fc42d9cc7ad054a21ac8bab2584732ebb191e5a6 v7-1-258 +fc89a4f98a8b2e51dcdd380a7eede9dbc5cd1282 v7-2-184 +fc8bf5d4051a1c13085db00c902092215ac9852b v7-2b-017 +fcb916bed51a5ae096a9f5f5f697a909b2062040 v7-3-055 +fcea35e2a41fdc928cb92784a4405b4fd220f560 v7-3-112 +fcf44bf1218f63d94e1807c05f470a4eb87e61a3 v7-2-209 +fd1b3406fd1cbe1e7250c95f7b30604d7e46b2d1 v7-0d02 +fd24e02210c9c05b4035ebc717f25ad64d20470a v7-2-276 +fd3346e3ccc02a11f0c2fa9c2c7351b3cead3941 v7-3-082 +fd68db1a72b5f05cc5e586ffe89a10ec6930005d v7-1-199 +fd8864aeb52aa72333573d62f0a9913b0d3e8c8d v7-2-373 +fddea6c03deefda18c971466e0688d196a62fd6c v7-2b-004 +fde086181841aa124af8a38b5c0bba132de3ea94 v7-3-002 +fe26299d6f7015c324bef3829e9ecdf7d08526df v7-2-239 +fe3ec5ea62f76a623c95a2a4bcc0d396c83488bf v7-1-303 +fe4ebbec775a55ba5d9bec6070d8d87dc28138f9 v7-2b-014 +fe52f9888eaaafda72e6f37610327206383ff6a6 v7-2-034 +fe7db192c7cc7ef3d8cdc6bbd8680833338fd7fe v7-1-299 +fea3207b800d97b802892d8edabd1d688817249a v7-3-096 +feb9b421585385b226b4adb98e10f33972068846 v7-2-042 +febddd8d11b0f8f48e3d3297628fcbfd9f427b19 v7-2-112 +fef4bd7afb263aa411f12ff13dd1d12c88ad992e v7-2-438 +ff3a304b4ac2f672e8cc3c60795f0c79c5b191b1 v7-3-066 +ff5a4a71a761f859af81821d340ac609d9309083 v7-2-156 +ff77f541d69df4e538f7db4879eb194378c04458 v7-1-252 +ff9ecf14efe3e2373f2b28fc3e32db4fe19e5ee1 v7-2-203 +ffa17de19445569ea573550eef332323d83e70bd v7-0-016 +fff7028d50c8a44a6285ab23b451d975764b8bd5 v7-2-296 +62e8d93241cd15962f895da4788f21b514238b14 v7-3-142 +632f43801ddb568f872599499fdcfd9522f8c13f v7-3-143 +322a5c8d392bd47ceebd24cd21dacf70409fcc91 v7-3-144 +329a9676040c3182f78e2014322125f8839b5cb6 v7-3-145 +2bd574a2ef1c0ad487a0673a5867b09cd332d176 v7-3-146 +55fe8407514f5387ad872a338d77f64a2ad4b5f5 v7-3-147 +d67916de812ad684718c02e3ff93455ce577be81 v7-3-148 +7f937a04cdbafd7d179b200f75e988408f8caf3c v7-3-149 +6146c9859f6558d618e950fe702c11e41ca21105 v7-3-150 +f169a51f7eadf9a07ed95161143e6209387a4f34 v7-3-151 +0f7f66682a5563c76ab47e9976fd590d9423a013 v7-3-152 +d0cae598360945a425859bf8acf22923c29501f4 v7-3-153 +d72d709f0e18c309069e42d3d7865d68db9e89d7 v7-3-154 +5747cd65d62b613d5060254849ed4bc1e1e5d714 v7-3-155 +7fb8cdb9cb25e1409abe45bba959f5f27608d713 v7-3-156 +9a98d8562637d4c90439125a14224a3403d8bee3 v7-3-157 +b5f774f159274af375455f32d628881c027417d1 v7-3-158 +415c55534d901aa4617bf584462faf0c7198e07e v7-3-159 +c5e47b752f07a95534bbfa83f031a58af67054cb v7-3-160 +25672ad7f377341ff1de9a0773d8cfcad1d37883 v7-3-161 +18ad854f5dcd0ba1700c73b03677dbc88b9844c3 v7-3-162 +e8f012b00187c5a957def85bb3c6f0430f20fed5 v7-3-163 +cdefcbb70e8cdc1f7185f1023d3a4660d30a074b v7-3-164 +e92a4b9b4484d1c07d930719ab1370fcaf94d3c5 v7-3-165 +5ddb68c2a845ad7941d1ae7533a81c12b106dffc v7-3-166 +0a0d7961b4fe83151b03d98ee904ea7038f64123 v7-3-167 +930b171ce3fc9dbca3f9da6bf883faa725593c67 v7-3-168 +5f45bacf31efef21f9b60543504d1832ded3e098 v7-3-169 +64c3402df964791a7b8c925905423f83af83e930 v7-3-170 +1bd8af13fb434e4c99bb756052556f4d56cde200 v7-3-171 +ee48b3da9d53a487f3636df34cace6400d13f32c v7-3-172 +133d089f247eb7156a6e8c49e0526f41cc082c3c v7-3-173 +820f12659c50890dbda80e7280086ae1176d1378 v7-3-174 +537e0102c0f9cc2c0656c298ed1534ef30176eb8 v7-3-175 +94f42ae4e4e66483fb6cc7305c61820b004c6182 v7-3-176 +66f2d62271fe77d4acdda5808bd0d3a45be3149c v7-3-177 +ac639ca9f58f7c71551c19090473395d81a021b6 v7-3-178 +11e62fb6f8154537f92be5f278c31e737247f781 v7-3-179 +ed47d18b39c6a672ad4f0caa2f2c3ee897e784a7 v7-3-180 +5381eb5b1eb9c39797c435ad904bfcb71f1efb01 v7-3-181 +21346361ce6c7e9afca2e475ceb62f6244197919 v7-3-182 +e4403440e192d082af7dc8fe3e1a12d24f0e259c v7-3-183 +b941cc96926a26b62d59f759a021ddb5b51823ed v7-3-184 +9c8dffc62a41a143230f76376f9a3abf46ff3536 v7-3-185 +3d1a3aa0240c7a9acdf3feb77b664798e3703463 v7-3-186 +8bd38abda3149cce7043da86e6093dbebecf63df v7-3-187 +f2e1c3a90a3bda6ce8977187b365745efd4e5c35 v7-3-188 +71e1da07e1414740d1d0eed47a346cb3292a9e2e v7-3-189 +30b7cde2194064040cb7d7e6485a5712b2fc9b40 v7-3-190 +107b03fdf1ad831e2697c22a04bd3eeaca08c291 v7-3-191 +8470ac4679c17b69aefb06989c6e8a267761988a v7-3-192 +e1c5f69de95b99112fae28c23ce6427ca251e50f v7-3-193 +664c1adcb909aca654c4fe9200364cc741068803 v7-3-194 +8dbea5adc937ecddf8ca336856cd487e1b118b1a v7-3-195 +d641f141f9376b3ecf2146e5d68c38bf0227c970 v7-3-196 +45c536fe48db330c4ee8f1056befe702d9d19cfe v7-3-197 +b0190e93e601f9061a797689a1eb95a86805f769 v7-3-198 +c76efe33a3c1db5767cfa4f4bb433466cba6e351 v7-3-199 +41b17dd070295783af37698b1229a7052ab0549c v7-3-200 +78859ef2982bbc75dcfbc551e3d8a0ec5c9126eb v7-3-201 +f80e67bd627114cf7f16098ec4ed7d878816a46b v7-3-202 +ce1dce2af2a34aec196b7fbe29cf8c653b6ec6de v7-3-203 +e6ce47f06836721108394f0b921af076606cf715 v7-3-204 +8d8bd6307b1aa51fe2f592ce45d32abf0f6666d8 v7-3-205 +46544d3ae7ecb245a2646ae5005a3d67ca380f88 v7-3-206 +d1445b72ddb7d8b4a44393756b00d21c81212db1 v7-3-207 +205adc87d579512482c27f309c73d5fe8f612ff3 v7-3-208 +82cd9f1e8d6b21ef4d59f27b39f041d5cddec19d v7-3-209 +eeb1ac4f66d1d69c0c75f1028655a81890cf65c2 v7-3-210 +c7d942260772003e21039f9891775b479311b40e v7-3-211 +6bbdb9c7a425b0bd90d5823eba9475b850a409fd v7-3-212 +493897f8bf9057aa0fee4c18d269558d32053cc7 v7-3-213 +d84a564f28c9e64c3c2a1689af0e0851bc7e5027 v7-3-214 +b7523ef31e23f1a40cc3950b6ec75b39ad7f762d v7-3-215 +eb6c704607025d89a0a5d3fd2769a694ac47e0af v7-3-216 +15705b520c298738588a9a3b8d724c6d86d4cb8c v7-3-217 +cf89a1d3a0ddd21fe6b734fd72346468b808836f v7-3-218 +acda456c788ae1b0b45b8c67a93edcccde594819 v7-3-219 +fe9c7da98b5e2f92e4212e948e98f2d44bf06320 v7-3-220 +fd4224d9ee09801ed1ad9341a72c4683e291bb76 v7-3-221 +c3b4b1c89d8ed62a2624bf9404fc79f60223bd81 v7-3-222 +4e21fd3cfc3084db66f65aef132cb6c5e076cb96 v7-3-223 +69e0783ed0ef40f72ebeba41f8c98c9992f368c7 v7-3-224 +c249d9aa60f759286f54781829c1e3da8680c4a7 v7-3-225 +8477b2cc2b81603408b3fb1a84cd65afb2aadc65 v7-3-226 +b65a26a2aa095c739e90edb7b980154476529d35 v7-3-227 +c6df8554b39d009ed146baa48c0cfb351aa8379a v7-3-228 +07647a0545c9f0fad4e1e84062e0572a07d94659 v7-3-229 +70c8f54e7efbd7b59bbe6764d0fbfa1f1602273f v7-3-230 +455a4c85d04d04c732367f915d82c5b3c9a65b50 v7-3-231 +b67d3a44262a97e7b3ae212fcffb36926b5f53f4 v7-3-232 +69b90e43b728ec28939b0a536de32f818b7ee756 v7-3-233 +7653420fdc454be197d59e420a1672909fac7b82 v7-3-234 +441d364773dc53264b5f26042f8fc6f8b77c8044 v7-3-235 +c1733ef5b6e87dde521d0d85a1e5e62259854ac1 v7-3-236 +e3bb93df6c34da672244bce5695c1426da139614 v7-3-237 +f2c108f44f415c7cfe92862e791a01cc542ac378 v7-3-238 +0bef86c5c985218a9448fa16d935b913e67af8d5 v7-3-239 +bf283e37792b4b557a2b9081e4fdb0e10acb9655 v7-3-240 +0a650db0265381b540df8ca6bd716c4b2d47dfc9 v7-3-241 +3d96ddbeb3b0003de29b736f63b76675909f133c v7-3-242 +512ddd87f1a817749c8362bd043682a7bbd87014 v7-3-243 +be6b6509636242cd7e6fab9a4b8772e97fc9a0db v7-3-244 +52512eddb876f64399e98d12643233a87c9f2823 v7-3-245 +3f1a4ed36d1b520a1ad5aa6cbf50d68bc8b9c7a5 v7-3-246 +7fe2c092913e84e6717782da1f1a220069eebbe7 v7-3-247 +57a7998e0fa8854a7a8c3946df1d4c9b1ee220e5 v7-3-248 +9f71f5a526aff4f1e0eefe1068d9534aee427afa v7-3-249 +f909f4f0f38c71594266b3595d31ce04d4ebe3ec v7-3-250 +fe6ad3fd85322b394824a5c495a78061a747b074 v7-3-251 +0b4289bcf8364854dd5f94c42d0252504103e5b9 v7-3-252 +c21429d7768cd4b834a086dd47881d01bca74e8c v7-3-253 +1eb805225de7750c03af7b0f7ac2f5dd18d032be v7-3-254 +aa998de9f9592426c17396b60c5db9170a234024 v7-3-255 +c296c225736e4489706c62c95752a0c4788be1d3 v7-3-256 +1fad9c73d77a0030586704cccab1b1a7aba8b58b v7-3-257 +bdc3335bd72eea207b28fcf8af90a73c855c8847 v7-3-258 +59130cd78dfc73bd04f22d201b8f7c0772d98e79 v7-3-259 +cb4682b959098e486977eb4b5969c9eb07d2798e v7-3-260 +410d42e3d4da09284394456186143d595e9b2efc v7-3-261 +847733973bfdd716bfafc364a4102e76f88e7fe8 v7-3-262 +a56259157c935b4e78e9f5f4dfb1436e3461eefb v7-3-263 +aa40bddeea9a44c6c6b4ffa32c1ef373df437a16 v7-3-264 +eff686fb8de66a26367f5e6430d34729f1a0e336 v7-3-265 +25be7c9dda549e4cfa1eb57937dc2b38b3d1e997 v7-3-266 +ad404f2a4bfa5374e97f29335f41b7ef34cd6bfa v7-3-267 +ee17ee712512451a54046d6bcd3ddb9f70cb5cdf v7-3-268 +7f4f5ca70dbde4e31c2de494b982bfb9bd71ed75 v7-3-269 +b9182da84c7eeda221e5219ef4361cca201b3b41 v7-3-270 +32a52f06f33b9e2d4817330099b410c1fcf64db2 v7-3-271 +02f5abca10aee570d5a9cf00928ffaa663daba66 v7-3-272 +7d4e5e31d8c10c767cdf774a2b13aedd2f95f096 v7-3-273 +1bb6776fa8c445e0b3f9dd2ed14fdf2a56f5873e v7-3-274 +125c7bf52271461dfbf46cc33317eadc67aaf742 v7-3-275 +37a54a85413eae68932233e64a0ab88c99c9d811 v7-3-276 +e5b17a5f651696ad4c523a21822692115d371250 v7-3-277 +6622f28b7e87a93de6f1520945d1c5d2a1fc0dab v7-3-278 +342b176089678e86cde3e1afac4aaaa1e5153f99 v7-3-279 +58bba69b3371d9ff02b27fe24f044e229c8aa99a v7-3-280 +45ead8a0bedeade57c320d72e9f710a703e61cf0 v7-3-281 +92167bb91c95410a0550ff8c94370307bb7d9d80 v7-3-282 +47b6d37b60122f45eb147106b8da1322c1cdbc60 v7-3-283 +27d43855b72312500e6fc2122e167a579a1f35f2 v7-3-284 +6018c815e1205e7db9328fe6ed91b26b514465f3 v7-3-285 +3f822e54765c54a1112a953e3c37bb60185fd51c v7-3-286 +07bc2ccfe5559035e785f22851365b3a31dec67e v7-3-287 +e4f3fa1a474e677dce486ea07ee31270f92b2b4a v7-3-288 +44ffd0a8abcdba441216514cb711649eb1169876 v7-3-289 +df33dba4e553f8fa27ba467042f16315c613a00d v7-3-290 +e8ee4b4ebf41abb199ea9a9e9cc38f9b0c2f7192 v7-3-291 +b6af1c5dd22f08db2b9e52ae763f193ba82965ad v7-3-292 +6cd0d6413a2e03687aca8138b2843f1f2aac5b84 v7-3-293 +dbd73fe939cf772a8b07c19230e5ee60aa0cfcc7 v7-3-294 +0d8494c051131b6470fe8af67646e235bc63fcf7 v7-3-295 +c19c15a9e9bf2914b25748c0544936e84a5c77c0 v7-3-296 +22550986c713ce5f37f069f0c8f99a54dc4a421b v7-3-297 +43b1d031e3028248abcbd5099841d3aafda7f68d v7-3-298 +eb4972982bfea006ead5b461f319744d5ecd58f5 v7-3-299 +2665b456ee59652c7b590dff0fa522ce337e0f16 v7-3-300 +4a70971530899e32058207cae683a69e7b8f85dc v7-3-301 +61b2f26623104f75850b1568bf61663597fe7fb0 v7-3-302 +d832d642f520d426f111b35102450617922547d3 v7-3-303 +b3a523ced6bd1173e4c17611559c173094830d43 v7-3-304 +0e06c025f66ffdfea20c8b73a995d23448b8dbfb v7-3-305 +0787bb5f387b79842d5c9353ae3541a992d1b9f1 v7-3-306 +880b7dd69331d1fefaf2d8735b118b39d546280c v7-3-307 +61c5e1527bd857e724f8396c89d0687126390675 v7-3-308 +6eae1b42c6684f3fcdb4d6cdbfb7dc1942d9b364 v7-3-309 +51ce22ba89d11505e18aa585fbd7dcbb22097f9a v7-3-310 +2cbde6bcc6238f41506f87bf31ff7d90f632345a v7-3-311 +0ed06069aaf32dbb2aa3827b23280b0028954ce7 v7-3-312 +dc60200a16b21c3e4157708bb825ea61b9e5bdc1 v7-3-313 +6ab1b45cc95ed56105b2130dc9938bb8344ff903 v7-3-314 +3ecf9e91d88acdb5eaaf93cc15a18914b60e0eb3 v7-3-315 +33c140e4664d102c34ec3ec5a17318f75cf475d7 v7-3-316 +92a181a1cec3fec52cde1b3d71f628a3a2dc53c6 v7-3-317 +d68f20a86a3ec75d927955be5d31983b6c37eb1d v7-3-318 +dc7f2f9759208aa07bf136deca661fd080a1ee68 v7-3-319 +738ea87c196431c452bd499c5a9849597ac938de v7-3-320 +fc0804089b2945bfe683f9bc9ee0238b8c64a46e v7-3-321 +38a7fd9043474dfb464c338ffd7f393361f5a6c1 v7-3-322 +3bdb646fc8a46ee5a5fe474dccdce098680d24d6 v7-3-323 +f04619f1fc1663f4ab05798c410e4fa35a9dd863 v7-3-324 +8aca621c00910556d4f52bd650d6841d6059d6ec v7-3-325 +d3758064ff9946d23aeccc9d2340686766647b84 v7-3-326 +9028c70adafd109ab294102f74dfb5005a20bbfb v7-3-327 +5b53cea62e5d1be2a1a36ce685c15f99bb8a41ba v7-3-328 +ec901ddc84d5c66c5d0c1dcca093584598487f9f v7-3-329 +abb03be99d661455fd3790cd25355459448fa432 v7-3-330 +4b8c614c1c914ce5d712368a75dbfea9b7e44e17 v7-3-331 +0ecfe54a273f6bc440684aca4ebe5926a2dfc6e2 v7-3-332 +992b24149a9ee0d6f417e40a7462891a9f62ec6a v7-3-333 +fdc72363229865cc6fd2da9db66f1d6e683b87c0 v7-3-334 +dc3f90a73fb375092ea9d870ae48ff31b31a56ab v7-3-335 +52526aec4afb220a1271e9a645194c42d3b2a538 v7-3-336 +176bfa951339a0a36366cbc8def41ae75f5034e0 v7-3-337 +7919a3d7333b99cece7d1a2657c89c18de78bf82 v7-3-338 +b5a2b4c0c1cac1758990ea449bc1c552522f39a9 v7-3-339 +49b08c9b9f5b72d930a1c02f00aa4128dc58532d v7-3-340 +6963603ec6dc2b47da9a7e951b2d0b3e024535eb v7-3-341 +314d9368069ec0458631ca150c202e7f724ad6d3 v7-3-342 +98a05814f1b466c87611b810eeafe8e7d9c581b6 v7-3-343 +7ba2f171cdaca18571b5e73dece426411c4f124a v7-3-344 +35f098371af699aa7e614a6397a068119b54cabf v7-3-345 +af76a61a7f79ccd3bcf64e15c73f2a3ea0eb77da v7-3-346 +72528c5eb87ea315a7c1a48f7734d1717c28820f v7-3-347 +4d4a328f199e4020457b4bf8f077622966bb3563 v7-3-348 +075acc2dccaa621998ccb1d671a987090367d485 v7-3-349 +07956eab189c0c776b79bc42235833d234480559 v7-3-350 +ff69efc4bc55d83b5f2bb68aeede1d921e8f1036 v7-3-351 +ca65249eb34bc62e82d54f74e14271be7f7f8a44 v7-3-352 +12bb368fef2c8c5478f0f8905aac381a56a75fe0 v7-3-353 +6672b1645306ceab4348caaffec40990dc319b98 v7-3-354 +d2f70593afeb432611cdb0ea2a0600c2869a20e0 v7-3-355 +c349a670716ab5e5f01b8121f3b7f07560ce0b8a v7-3-356 +e618700297e83c0d51efbb77a849ce5f0b19b507 v7-3-357 +97a52300ef2b496b6c8e2487973f134d9e0afba8 v7-3-358 +b7f0f23bf90603f83854fd1aece09fcc64876a29 v7-3-359 +28480c9006e6e6936aae05de1f3ca3eaf4d2f267 v7-3-360 +e42252611e74c1df2063955d6086f59fb3e3247d v7-3-361 +074ddc768feadcb3164973c7f7be8bf78dbdd56e v7-3-362 +c025592d7b1dd658955b9a6d2d159c04e83c31e0 v7-3-363 +b0bbaf1020f08fa6dbeb059e251127e27fab9ecc v7-3-364 +54ef99c39139cad53db24bcdc18470394d76b40f v7-3-365 +436b42f3cba1896b65ad32e791d131a7c3978738 v7-3-366 +972bd3fca5562b8752ae18313e8cb3e6fac207c5 v7-3-367 +4e9c5338f44c24d511a989b5ea50850a2b9110b6 v7-3-368 +0df9718c45b68c0aaa40934bb54b3217b0c24495 v7-3-369 +3801e4811b0ecd56667fe89172ed37a84047307d v7-3-370 +e757e1127d210632cc920d9a0d2d2a3b89be7ffe v7-3-371 +6ff80dd02b51e9bd6d3c1b0167b81e295b0b4881 v7-3-372 +a1d2f741d45c8731450db862e89eb4a650796fe9 v7-3-373 +0a9d7cf90f94945578b83883e2ade369ecfbfc6d v7-3-374 +767bb493e7d31273edc45f4cb6602784f639f516 v7-3-375 +1d7434010de186b02fd6a5c8eef3e28108a4a251 v7-3-376 +cd145cc2f2c918b9fd77dc177f69805c77e31e41 v7-3-377 +a7517e84d9b8191092ff849e520558d61be01f71 v7-3-378 +0f193ef0f4298ed632b5e9dc88c7efefe093728b v7-3-379 +534b3ef1cf1440a9e22c2efc7f2673017024f124 v7-3-380 +6cc788692b2e8e043a3d7fff4e1efa2601ad39c7 v7-3-381 +2260435283f2ba0ac8d0b35e216b297605ef81db v7-3-382 +f8d2ef4512f8d78c00a7aff24fb8f99aced6f2d6 v7-3-383 +e958eeffa0a7d0ed2021f2f4b61ed9e5daf3d9a5 v7-3-384 +910eb66c97684b3c0511789e7655dce2c7ba254a v7-3-385 +1cedbee50ca65fc96eca2d360ddf886b3e7ad74f v7-3-386 +ac16c62282ac0e961afa44b556fe850dd6c8e1aa v7-3-387 +683fab13904c115b4e1f8b9ecb902d192501245d v7-3-388 +c97c3272d7a67a2980ddc291f12f09c36568c54c v7-3-389 +48252b5fd17042ae95c6736073ba3c5b12820f2c v7-3-390 +819322e0e93e50c04fa79163f9b88085cbe7db8d v7-3-391 +c4898d6d73a2ffa55fc91f79f8e110260eda29cb v7-3-392 +e0248b732a5cf0c4e6d61253564f3f855d11a755 v7-3-393 +927c7377cf49bbbf87d12863c2a2d462c9cf97a7 v7-3-394 +80c529a5650f1d70342f18c681b69d7897495006 v7-3-395 +2f075595590f498f1a9cfc42dfce24cd0d980e96 v7-3-396 +75217982ea460e7bdfdd2517d8d4e4f0d0ebaef4 v7-3-397 +9eb7fdfb5e63ad98f6feb81b03566fbdc5ebd895 v7-3-398 +ce6afdc00290520fb2d9677b44a0cbb70bc401e6 v7-3-399 +320cc46d0eb022bfb24d1b636050becc83ac0014 v7-3-400 +1251e1ce94610b265d3c1f636d379a0504cf2ae5 v7-3-401 +4eda43e1fce06ef32d0a79721fa0a6850a72b4dc v7-3-402 +5850b58276918de8edf19ece0bd258e179967af8 v7-3-403 +8b928bc814a8d502f25a06ddfa66b0474b89a73f v7-3-404 +c75a8d2404bd4f1297aafbb10ab1ae68ba678249 v7-3-405 +fbb23bd517f8614f512cd81b253519cbf4548863 v7-3-406 +55cebc7e5de078ef323a94ad79319c0ab33b09ef v7-3-407 +1fec3c62f6e8065c2f7ea7422213e78b50032de6 v7-3-408 +7b59c2c032ca8a15425afb1b519c809abfd572f0 v7-3-409 +5cf2a671d8ebdf46590b8fe349ad2b6f84eed868 v7-3-410 +8066fb7e356481b52019a52696072594d2590d4f v7-3-411 +aaee6093302281b70798ae4dc599145b95891908 v7-3-412 +821c8be2e9d604282481f50f7c5a1a210b9b1696 v7-3-413 +c7861dd3b593a2011ae46dbe43d78f44cdf2d99f v7-3-414 +e7e4dbac7ded5e048e289c7fd92c40e29f775758 v7-3-415 +5c5ca538693fbfd3a574998693094b48f19ec12e v7-3-416 +5c5ca538693fbfd3a574998693094b48f19ec12e v7-3-416 +22a626604672b37914ae929b0d5e11e3efb0d79f v7-3-416 +63d3541d07339c65d602bac2bbc72d755b416ad8 v7-3-417 +4500a0ad2e0a24f54e5c4b4a3266456cd5ccb2eb v7-3-418 +f4574729f6df749668df181a9dc09030f37de2ad v7-3-419 +ded8f5add04c9477c47098a66991f971324787f2 v7-3-420 +076003f52582c2ec0b4851df539edf512945778c v7-3-421 +60f6df978a413952e37d03b85a50ca858456b53b v7-3-422 +b7811ab264bf31e0049e7a9b689a399ead6cbda6 v7-3-423 +2e4539dc2de7da0aed83286304d1afeb0a4cdb3d v7-3-424 +7b17a38eb223b4b56327f019267c1156121f5c0f v7-3-425 +c70c005f61fb08ca032b4eab533908cfc6e6f40a v7-3-426 +45467d77047df9134a7694367bf97344441b1b3c v7-3-427 +d473f39aeadf6d022e520968db17257b42b52b61 v7-3-428 +c9366ca36f6feb95bd8e01dbed9973a404f5391e v7-3-429 +a9f8dd20a49f9b8296a6ef6d9e17e3446c0974eb v7-3-430 +a27fac494e709a3cb78399f5dbc5d807a1dc7a46 v7-3-431 +81201fb337a58a58cbac43c2b89025c681361df7 v7-3-432 +8a731d7f0664b13176afb640ed0325949836962d v7-3-433 +636c2b1cdc8b6cc5279ac7d5986da1085484b98a v7-3-434 +afbf45d854965f9e557497ab9d4d9aca87e220fd v7-3-435 +2a6eb75275d94b864eba6d6135de650a903a4a7e v7-3-436 +539613ce999d3a938c602a6b6eb230fd0d77a1d1 v7-3-437 +bb67cd961fc3011d367357c215a0603dcc46ea40 v7-3-438 +dec4338a7da22b02e7c7cc65668d35db264d3400 v7-3-439 +e3cbb11f3555d5dbb1cbd3daac4a958a9e1f01ea v7-3-440 +af4ed13ca541f034e3241f2eda1abdb3b45d1770 v7-3-441 +198ec1fff71a44a35aa7a59b4952583a82a296fa v7-3-442 +de050fcc24cfb56a7dc07dd283cc1132d774e7b7 v7-3-443 +72146e7f47fa647f19fe419f4c8602897880eed5 v7-3-444 +397e7e49bb0b831f7260d3ad70f6b07175c44a0c v7-3-445 +20ca2e05ae20ece942490182691ed45746f64cb6 v7-3-446 +6a03b0ea2e12d748c1e4199e3f428ee080760939 v7-3-447 +756d712b3118b896b57ddb4f4c071135bc031607 v7-3-448 +9ccdc4a69d8ff7aab8abf89f9a3cc9dad12249dd v7-3-449 +3479ac596f6c4b38849d2e5235ad590378605eb8 v7-3-450 +045fdc5b6056a18579f28b40a4914f4a7cb8d4a3 v7-3-451 +f1cde9cf023e15cd1bc26ae720d6380fa5ceac7d v7-3-452 +791baa7b35e1b6244cdecd4a2feed933f78fd84f v7-3-453 +1632640a24b42a9193eeb8f6e8150afaeee5ee35 v7-3-454 +e6392f2aed4c13170664b4ec13dd2d8b3ce968aa v7-3-455 +07fd030f89be62aa11c4ea1a188ee2d8f4348677 v7-3-456 +4a2744311b3f3c8207189dee4ef405959a2e2446 v7-3-457 +da670fb71d30a1eefb07b19256f8c0d677807550 v7-3-458 +cb2ae92ce106de532c53f8a16a82bc2bf6edacd2 v7-3-459 +981c7ad9dd48cac1b4030b97c2f0dc0b8fe82337 v7-3-460 +de60f6fa3d8d77442a39ec13efef89f6ca76af03 v7-3-461 +70eff6af1158f9dc99118ba73e81f456015c3ebd v7-3-462 +8e0fe5a723adfb45c44978083db7aeac11e6d72b v7-3-463 +43259e4542c76e950fecc86114c43065064d1b34 v7-3-464 +d1096a4e96bdd5bfc0ce2f1aaddcbff1475c69ad v7-3-465 +df9c7798b5e2c022310cd12e199c9de8d866aa39 v7-3-466 +276d58e9265cfee76c04bc5450681090900a16f4 v7-3-467 +38a1357304234dcea96f96019abf0f3e5ae290ab v7-3-468 +e61c3b09ae86a8a448ad2d028df6fa6b9778666b v7-3-469 +636e4db6e2075bd22640cfc8229af62059f8ffe0 v7-3-470 +3465a9e7758850684d18a9bb11ac033efdcd1755 v7-3-471 +8332129d9ae8f11f8ecb9f016e5292c6582bbb4e v7-3-472 +7f1bce9c9b79d4ebbf798d6122612934d55d70d9 v7-3-473 +7613c9ab083f3e9262be5a21fe086921b757da4c v7-3-474 +36160830a5e8d0e3b4174aa7d98363623468b77c v7-3-475 +fb2c5a51dac7f1dbce6a0f35808927ac206c7f47 v7-3-476 +62dc0d69ab11d5b5a67c6139a0dd3e2618d2c2a1 v7-3-477 +754db405921292fc57dbdaa85e62af333dce5912 v7-3-478 +3db4282d5e6bb74a5c1094f35a81472d5a98f313 v7-3-479 +b35844f3eb49bb84101fdb276e3e69b0b8f7813f v7-3-480 +8e21ac7f2d6e9f269b057939dda58d3a31beb894 v7-3-481 +3229335d0c4e6cd7e91e6e61d791d7dff7d3082d v7-3-482 +19040069b8bf1818db44396a150acb54f47c3a96 v7-3-483 +00fa605e7d7ba7d522c627a93de6e2f5017d2884 v7-3-484 +94374e0b6267d8983a73a22166888c2282ee793d v7-3-485 +08a37c57af479b54fa327bedc0ef31c42dd96f63 v7-3-486 +21219ffc97903684349f1fcc843eb61838877874 v7-3-487 +8691bdcdbf66733c7ec1ef8161da1d4ef49dce66 v7-3-488 +c1a6e1745cb521f863e63670e6c22c1c682ab4b1 v7-3-489 +b067b8b81be9c2839df75824da2e88da24b07b54 v7-3-490 +e070b34fe35e6e8c40ec31a08196dd81353db4e5 v7-3-491 +214c7ec1c8f995664d5684da8cbeaaa86850468f v7-3-492 +bf5960ec253293b7240f59a7682f2e862dacd205 v7-3-493 +5240610f277823478983e3f04abfbed4e85141cf v7-3-494 +27f6a22ff88eea07f24163fe470b7335f3c1b32b v7-3-495 +3daba355b0c15ef66a9d2810ae7c7cc534dccf62 v7-3-496 +e34c620007be9fd805556c43fe848de521f3b64c v7-3-497 +b1a42d2522fb4ff627a0c381e994e2a598f7bbbb v7-3-498 +4a2cb025b6417b00f2ced076eb79739e03acd7d4 v7-3-499 +b36640b2f671c006fe26b573fd42347227efbfa8 v7-3-500 +d7b335626ddc7a61667cb3e23ecadfe399b676fb v7-3-501 +1d1cce57421c78884cff2d3234d3759bc858d6fb v7-3-502 +65d036fd449e488303e78d2c6679a736551c39a6 v7-3-503 +17bfcb054cb770ac685acaa349165f210bdd36ca v7-3-504 +fe7bf24804e195209bef4cd008f0bac7eec7fc60 v7-3-505 +982f84487daf102f1203977a09f2c6c76d1ed3d5 v7-3-506 +f9a865d97614940f817b76642282d966781296e5 v7-3-507 +2722f11ddc998ac7c578c68c0248b58468179418 v7-3-508 +8101253704f6504bed3f0209e9a6fcae3966c6e7 v7-3-509 +53786601213cd9f86db8714f7b0e077b05e2704f v7-3-510 +b782e2f9e6892116ae5d068249b5198bbe0042c6 v7-3-511 +454646820185cbe13e1f2e4f7533b984d3b07b18 v7-3-512 +75037f9bc97ad76bca58dbbc0ddac69cc7f5d9ac v7-3-513 +7e4428115d2cea86fcfa980097c98c11380ae196 v7-3-514 +6c318419e3310fb9658ee6ead6b4ea33def8cb6d v7-3-515 +02440d1fcc9aa953ebb7c0719405ccf2525f2777 v7-3-516 +9a1dba1f969ac4cb2477626cd79a7a6b0bea1894 v7-3-517 +ec4ab9d832b0f5308c861423d99253fa496b3a3b v7-3-518 +ebec52bc2800b8e51e522425fdca5c252e6d4f8e v7-3-519 +7bafe52b6245761a242321352daca224e6b9df78 v7-3-520 +b14842cf382bd3f99ca090c985609c6dead5f9e0 v7-3-521 +e4899d2ff5d8e552ace52b7eafe02b2c5dcdb409 v7-3-522 +d8ce4a2eb44e3e3d56db5e26d9982aeb48d7814b v7-3-523 +ae1641c4fbcc8c25d27802d6048cb0767c4021d1 v7-3-524 +ac2e00f917df566b81b9e33891b102cba5b390e0 v7-3-525 +257c2878e0fcabd5504dcfed910287374405440a v7-3-526 +a17918b76ca1296f63db0e81dea0e37b8b880150 v7-3-527 +fa17c8646feb4719639150f1c301ce6c1557afb7 v7-3-528 +d83218a156dd8258a5f2f3ae019c56f3e8851d48 v7-3-529 +81d5f3a3e27fff9188ae34c41b939fc88c9837de v7-3-530 +c44f0f7424b98d321d90994198374628911623ce v7-3-531 +9755d151c7492a5f1d0e77a2d3c9e414f20f3b4e v7-3-532 +74d51b51f3e69df7d3295255ee10391b3409055b v7-3-533 +65f905eb14cd373e205ff4c8a53027514e96d819 v7-3-534 +f52d2ea0f81c20e6f026d74cec66b135d5470d2d v7-3-535 +a8897fd5d074d7baaba692013521304b13beb784 v7-3-536 +96715c3a905faa1bbdc50b16b0f57671b4758e0c v7-3-537 +bbf1fbbe4ab45442f8876790004805503e25f563 v7-3-538 +7a710cf51d73cb3c3c76fcea34ee706443800c54 v7-3-539 +af083cb521bcb69aae315654a3873c488dc58c43 v7-3-540 +5c1aaf9b4b1bc2d14d627fe22d414f3a2525c50b v7-3-541 +8d1b63e6d3173625324f4adfe733efc8091f9422 v7-3-542 +ce7bd50bafa74f4da979f27c4e5fa9a47e69d739 v7-3-543 +09d0bda69df0c5eb505a02e37a978e92fbc89332 v7-3-544 +e7ff3251dfa157284a48c5322783499d079e3eb0 v7-3-545 +0a364618c0e59fa777f526c99bee608bb5cf55ce v7-3-546 +4f4db5d661c4fae42f2d917c09549d58a2f4d05f v7-3-547 +8625e38066dbf6a4d5e2563fbe191c3910681d2e v7-3-548 +c0c935956ac3b7c706043e5c7c0ba840636fb10f v7-3-549 +297771eff080ed3bcfb2ade57c2dcab34bac5de8 v7-3-550 +e83c5dcea112a44f9a7b06042b52798e32d96541 v7-3-551 +443c50cd3e8811b58a4ca131ab21abd18aea9489 v7-3-552 +583e46e4a56c40fa1a7336be85eaec93f6800edf v7-3-553 +a967a979c37f458bd4d164afb8a6192a5b4a6fde v7-3-554 +8fb7bd9dfb2b26b43725c90e042d2089762466a6 v7-3-555 +b8924014a03991b79947d735a894e2c2e8f94980 v7-3-556 +a220dd97b5c7218558eaea27d301af2ed4f9ec2d v7-3-557 +34724dc5172bb81a9e670c5bd23edbe6a124fd28 v7-3-558 +74adc9f7e15b8c088abd04de35615cad6c83a811 v7-3-559 +0abd38ba64557c4a6d62575aaa3fc7ab6482d747 v7-3-560 +a1de7928a7aba45240c85a2bc8d70adadc49e4dc v7-3-561 +b2763055bdf26e1f11bf8cfb0601fefbefb34e0d v7-3-562 +02c86cdcf9a23f092400c7631e5906cb9053703b v7-3-563 +683de93060968ed4e9dfb7992910c75f479471ec v7-3-564 +5f811338b1186e1aef683d03fa05a8026d30e9f1 v7-3-565 +18c6b1752d0baab043792d3f6267ec393f7a11e1 v7-3-566 +f90bb88c261582fef85c16009f19168b38debd74 v7-3-567 +3b5f541269e2d9e57b82ea1ec89c6747e2003434 v7-3-568 +c052f3b79b9948e7072580e7db42f90c92eb40af v7-3-569 +4f1c511e71f851c4f1c14e950f95ebd6967c6ed1 v7-3-570 +43fd3896fab7be5ad01deed2960d37d91ba65691 v7-3-571 +3ae387af405f46e200fdf9bc204d0a251864abb9 v7-3-572 +802b1a1b275f5c8f95724d50d53642f221621d79 v7-3-573 +3ac005f02cf015b3aa246482c6331bd61c08d91a v7-3-574 +79ae10bd056520fb6367247804af22e52d2de8b8 v7-3-575 +7e3fedfc3d08d020e3ce047ec1a1cfd195af9ed7 v7-3-576 +286ba0251c0aff1a664a481846c1f4107fae0c11 v7-3-577 +0e9b2622c94a8edf906d6c44831c1cded7184d13 v7-3-578 +80ed6aa7b9eb18058a0b105af2ecd7b213891be2 v7-3-579 +f02b6ad168ae82ead0286b64627762ab2343ee96 v7-3-580 +96249a1803e28e6173faed53f8687334aa63360c v7-3-581 +d383bc2ba8112103389a44c2c747eaa1016da935 v7-3-582 +a69b1d711ff9d8b227acff694c53310cf237933f v7-3-583 +2d107086903af80afee524549e57d3ba016b3f12 v7-3-584 +d258a0c5c38a6a604b983b6499a0f02bc061c816 v7-3-585 +8393a16069fb5f7b22ab766167b698e4dc129911 v7-3-586 +a34fb0a077c9c26946727a25222e0a99dc08db0d v7-3-587 +e92cc285632dc29d932061970e43b53cdbb3460d v7-3-588 +e82937b753a8ca6705bf55dbf258f077746ec428 v7-3-589 +bdf7f3e4c763f2a038c397af8eb6b8950e58db6b v7-3-590 +e5b925ae56e36e86eb2ff059aa28d6a2dd332845 v7-3-591 +0e06193d4bd7be03924dd9c6251a64c6c6adf78d v7-3-592 +46896c29edd74418c665af7c1ed685aa52a41e1a v7-3-593 +5e7b500dbb7e9e964457d300b536aeba9771af6c v7-3-594 +928e7cef8836d13d4f2a17234e127b928ee63ff4 v7-3-595 +5aad2c444a00a2309e6e373b6bcb5441669ba126 v7-3-596 +b9aa7fb4a9281b87a651251f799e049409634757 v7-3-597 +f0747581607924c30530687fa88ebaa57602eb5f v7-3-598 +b06578f1390fea339a2d9d18e12758ec1dbcc279 v7-3-599 +8f98038a0bf34310a8224a569eacd539b7b8b649 v7-3-600 +c1780b4cb9955fc113c3c993c18c139e06425ef5 v7-3-601 +5cacdf56c94b6fa1992f7e9c07c95bfe52bcccec v7-3-602 +085f14642fe828b1cbae5706ca87f2932cebeb75 v7-3-603 +acd91c9741a6d0185b7c63db412888de4f904118 v7-3-604 +4873d9c4ad3b7214d3ea8af9712a87ff69948380 v7-3-605 +c612d154bcdd642e4097ae88526a81ed7868c184 v7-3-606 +002f2c5de317aaedb93bd2e506a295efe2d552ce v7-3-607 +d47e6222d1cde1caf08fa63104375f5750c25d90 v7-3-608 +d29aa05b7e311bc05491521f4059ca2b625c5550 v7-3-609 +9f48a54329975434d73ddfc19e33c343653d5c73 v7-3-610 +e13f2f3568e1e21fbd223a1c0627605e2b670c53 v7-3-611 +2b4b6185054ff05fb6ee3ab1bcde47409bf2ebe0 v7-3-612 +c03b6363492b26c02b4f8a725a91849a1a5cf548 v7-3-613 +2bb51730ef4bb0824658f7507edad165e194dd45 v7-3-614 +169ccc471a8a947c046b7ff41023b9045beb3496 v7-3-615 +baba6286c91e63dd42039206e3e0990fb0ac346f v7-3-616 +73db39ca1877a07008310a2ec98a2220e50c52f1 v7-3-617 +0b1cb3f839c48daaccbb3abcbd5f1c394c57cb10 v7-3-618 +27ecf0c87bd20140d9e85d4fd581332e0916191e v7-3-619 +a6ebae140d89f35876628cde44f0e7ee5a0ae1d2 v7-3-620 +ac13ea2b098d98e62408ec2d88026f690f68f940 v7-3-621 +52247eb615118965bb6a949307e9abfd378cd088 v7-3-622 +a46a101bfddd4fcf30759f3847fa1e18546907f4 v7-3-623 +06749e351b1c030acf50cf8c469f8973aff4a96a v7-3-624 +f43ffd820a46bf47b3e55b56d3e5334302383757 v7-3-625 +956b1ed19282518e0287891d4e7b2b8a3f850402 v7-3-626 +dc65e6429d2c1b79719455d7303f3f95c5897965 v7-3-627 +1ed93878d6e224d46a7c125a82e52338b9bf0f6b v7-3-628 +7de7ef01288db1abc944293a28aac13ddd87879e v7-3-629 +3416ac23d0758528919aaffbe02cecc6420b8aac v7-3-630 +99f076ca8d846d553aefd7e626ca938bcf93f259 v7-3-631 +44038a9777aaf0e6502e0eb57b8f7ccf31798ec4 v7-3-632 +ad5fbf3596e0a8ad15c260c5b529efc5ac689e13 v7-3-633 +b7eea24095073d55ac3c59664466b78a0525bebc v7-3-634 +f7f68f83fc335379bc9e3371c5118b8f81c8d5bc v7-3-635 +616bc1ad4f12be0ef37fe67d2f6ed7535f20e515 v7-3-636 +3b62d8f36cdf709d4e0575d63486ebe57ce7150c v7-3-637 +c0256c4bd91ed7b806aab002e4a45e440dd00343 v7-3-638 +1ec385a8faf4002fa300caf370ef2ac380d9702a v7-3-639 +c2c3577021ed4e354853d330e5fc60691d8750c5 v7-3-640 +c068389057c9a89fa351678b5f5776278971dabe v7-3-641 +79ac6744237ce5076a6d2e2b21198dfddc2cc9dd v7-3-642 +fdac34e3afa5f0dea26dba5e96932e3b9a0be50a v7-3-643 +fb7c028dcac7555fee78096813e3846d157cc91b v7-3-644 +1810ee914648ef3e16a8cf866299a32c4a9a00cb v7-3-645 +e70485d3f81df4d72cb40d6fa4ad4218cf1e8392 v7-3-646 +29fe4e5c1db17a62b16a95fdda84f08cd05c27b5 v7-3-647 +76c099d45772a233982c39a29510d89eaa4d5a1c v7-3-648 +063765c3cebbd6040dc091b8c1ba28739fef9118 v7-3-649 +a638ae0f1b0cc41d8d753d79503238f11215f3ea v7-3-650 +ece544e85821a6118da55dad1538ea4c3625bd1c v7-3-651 +5edf3c51aa93110e57fcd0428c30e5bed149df34 v7-3-652 +fd0c7452fa51118d8f6557b34b4cc96e830ef6c7 v7-3-653 +73557eda70271b49015265b7147562b63a7a094d v7-3-654 +0d3238b54963c4b1358a1f33221f75e067c1613f v7-3-655 +a2f61b2b8e770bb8d233ce50c8c7508508578a8b v7-3-656 +3958b0e672d676a310d756bff1b9c629a7b0142f v7-3-657 +15cdcb8ddcfb848c929cc37e239d5da8fe48a8d9 v7-3-658 +e75da4a3225d48e59ee321411134cf9999348b7d v7-3-659 +8fdadfccd184b7de73811a3a18dc8815b7eb3434 v7-3-660 +5e909c379a1e87491bfa95ba1a37b39d0725933b v7-3-661 +87afa95a2992a31b1937def0e1db4a193b0ab32f v7-3-662 +2a200527131fac8f50487790ec201badbccdaf0e v7-3-663 +f86619764a1e0338ef9e14c653a5909847304b8b v7-3-664 +35939e1e25ff5a3862b83248f8039971c81936d0 v7-3-665 +1e22adc6176ec07f52102f383a9c3c414d43f9c2 v7-3-666 +cd36c0fed43e63a94d6e87b5c5c0b4d95628da27 v7-3-667 +dde6d0216a08a5554f3c351e519134c386d14232 v7-3-668 +2b3b7b48370848149c8b831b2b7aee9b7f4f88bb v7-3-669 +2bf8c00741f7f07d9b58596764236a92eaeca862 v7-3-670 +530f5a9030315f984e096794938c61f9d3562e22 v7-3-671 +fd6ef931aa77239804860b74ed2362b29c1a6d4a v7-3-672 +ca1c025079b11c98363e11576d903af756a593fc v7-3-673 +4da6003f0f0eee0f3908f8627af6d13a94c10cc6 v7-3-674 +9963f7a9b41b555a0660288dd94df44b6dee7c2e v7-3-675 +5309996ddcedd7e2dcc8c46624348405290b8940 v7-3-676 +8115f449a574bc146f75449161f1757aaa5bbb66 v7-3-677 +de253f606048a2862a338190b071e5e3c7de7a41 v7-3-678 +dd0f25ede9a8322b5b638961835cc4743cd479a2 v7-3-679 +52acec46b75ecf24d044982d4cc067ef7890e7d6 v7-3-680 +a2fe24ec6a0d06d0af286b9fee9e307c33f27cca v7-3-681 +8eb5b61161b4c56b378ec829e360204102d22db4 v7-3-682 +0f5ee262963528ddccfa1f54b83696f939d21b53 v7-3-683 +1cc37b8cfaa1c670e442e2f9444feeb1820228bc v7-3-684 +34aa94a421b7a03a71013ddbb92937dbaf83b1aa v7-3-685 +ba9c9d0c4ff4cf56c3c5d2dec2da71decbbe9f6a v7-3-686 +0545dab1517f8ce2b8319c02572e4bb357567034 v7-3-687 +2696da84d37093da0dea419878e4241385eb515b v7-3-688 +3c072c1cb87372f3ebd345463abbc451e80143e2 v7-3-689 +caa0ca9ad06cb515b7e6d2e4410e03802b58e167 v7-3-690 +7f10daa706bb6ed0c39f1d2905cd78368a98d19f v7-3-691 +337a4368fd2b68b9822b94e595d77b4d6773bfa4 v7-3-692 +fd96b3cc88ed71d4c4d24c6ac67c9d3a68ae6e6b v7-3-693 +8235ccf121bb241f8105d0ba6e1c92e9f8b04555 v7-3-694 +cd6c420e31d6843fa1231e1cf7a3d9eff0ad4e07 v7-3-695 +447c688b82eb4a5eb7cd0e16521094b77160fd0f v7-3-696 +7c72b5f7ada1f4a028315aa50f8739e0e83c2e74 v7-3-697 +b5b892472ecb1a10cce1709e41700b264b6485d2 v7-3-698 +4ffb6f9b58e0b51923fe6a71e6af158b6e3f7864 v7-3-699 +c656847932d33b5d68394ae1ea3153dbdba4d3ff v7-3-700 +48af8656094539f8f71dc51e0a6aa14d48ddffd0 v7-3-701 +916b5c11a13e9978c85f9742546e70d614116883 v7-3-702 +f69321485951a3c9bd0e9e7484a1901b94cae726 v7-3-703 +be8ad9c9b973a4d87b9bcfee2b6a8de1f6d3e071 v7-3-704 +0aa74f2f50a8333fd5544f5d4b383132be41704c v7-3-705 +d0ae72c2f5f94e2483ab0979eec652b1289679a8 v7-3-706 +d24d309c365fc5c6a9324a6183d7b927d9f5132f v7-3-707 +64427849c1582299f2af389c6225eead529f0329 v7-3-708 +fb7dec372910b61478abdd7f79871724153ebfdd v7-3-709 +906eb5c0ef129b6876fa9c6c5a13e44807f7a503 v7-3-710 +2a7b2943be22c27edb3c0334423c1b17275f18fb v7-3-711 +557ef119999ea687ccb84eddca295755c24989da v7-3-712 +f15769bce0b811fc840fd455035270288e8d744d v7-3-713 +9ea14f097855e0929f86c86d405725717efb044d v7-3-714 +4f0ddf4137eeb08753f2593a32b42a1dcb1e6f4c v7-3-715 +eb268db98f321b93f5e7552920b6389f9dddfd3f v7-3-716 +6a76846b84eb0fe1220f8cfa19b1161145932d4d v7-3-717 +18e95db59826aa9379e6e3ada5d3540cbae1e596 v7-3-718 +e6d8b44065bc05741effbc0635c21506032d97b4 v7-3-719 +9e119e0ade5d804f174a3b67ad5e0d0e7449739f v7-3-720 +b23f583e132e88ec98f2b449b7216642ba64a8a8 v7-3-721 +de6968039340db04ec65164a3450a40773488e00 v7-3-722 +ee138f29259e02f62fe8181073e7a063523e50b8 v7-3-723 +6e5acfdf7a5a2b3fa27a529881af77c1e1b1c0f7 v7-3-724 +f4aa43d952f5bacc752951c80495fd20c72ba90c v7-3-725 +5049eacbff0e9688af99eb67a408cae5919ff52c v7-3-726 +d3c291efdb0b9f5cd286013b789eb1c91ae868ca v7-3-727 +233666f859339f425684af70dd008354776259af v7-3-728 +d08f05285dd102d8f071ee42869416d25dd4e72d v7-3-729 +37a4cacd20511ead4cf1a8ecb235276bc448fddf v7-3-730 +778ff2e87806133faa8fcfefbd41cad2b601bdb6 v7-3-731 +fa8bf69d3866eaf31e6c8fed74862feea11a40b0 v7-3-732 +509e55bd4a3feeb651ea173cefcbd933f723d8b6 v7-3-733 +fc8b4a06af9db05af800b1304599afd3e1229980 v7-3-734 +d3158bf4dee9270477defcde85949ce58fa350e5 v7-3-735 +b1536bbbda104edb11b0f5772e433d2b5388905e v7-3-736 +1773d5aa6437b0f88029a192cdde2c510faf517d v7-3-737 +eccae034465b9a44aa2389039ba06b25dc6ae7dc v7-3-738 +e2d36f345a7f1131e085336e7b471f718fad6c9d v7-3-739 +2c12cd5c1381dd9691af5e7d3e1fe1f54c929ee1 v7-3-740 +6e1fe64cf4404d899232a880552cf52998934656 v7-3-741 +4d1753f3e85c7fb6d9cde1a8aa9ded8d11cdcd01 v7-3-742 +67e3b2753a6ef97a94084b85f87873c309fea3d6 v7-3-743 +26c8b3b49f743ca163a63463da08cc3822322bc2 v7-3-744 +aab4b29520e79134e33f2c641f1d960de2dcdc1e v7-3-745 +4934eb2e22dc0bc03fd5d4f95706a69a1ddffb94 v7-3-746 +cd59ba19985a3b3bd66dffdcf59b00427f844818 v7-3-747 +56bb88c68f985365b0545a0370be59fcd97a4178 v7-3-748 +3e22fe67fa6935d1156738a34e50bffdf62006c9 v7-3-749 +5c36fe9f19a529fb6064b37b8e47e82cdeeb7ca8 v7-3-750 +d149f18b289fdf19363214e7805a0637307bd264 v7-3-751 +ed936effb1f374004db15f092b8c8ab87631fdd4 v7-3-752 +c83cd3d01128204d6926550cbe1064daaf8dee8c v7-3-753 +beceb0a18c79b5b1bda4822b34cb2d62b2967d27 v7-3-754 +d9b4cf53be2edbb872cc489aea32a4441b39eaf9 v7-3-755 +706c87d16d40ecdf9c6fba45bc47b911d8e140cc v7-3-756 +65ef7c96d65fb2fbf660797608809f0ac5d0c4b7 v7-3-757 +9eb0d30510f7b02aa5f55f400bfab08d847ab447 v7-3-758 +25ea15fdfa5c7d5894a06814fe9411b75050ebff v7-3-759 +8e54a32bcd56226647cfd3d8c5e142e3a98c0ca7 v7-3-760 +6834d6aeae099d6bfdff5151aa2174cafc22647f v7-3-761 +699f8d8f096d4627f97e8d3bcf64b8634a484c26 v7-3-762 +b6148e4a9c397b5dd1716cdac2f96730bd0f353d v7-3-763 +b29e55d0ef01c506ec48c0c5782e669bb1d80f14 v7-3-764 +915fb3d2dd8ffc322a5cc9e294d9bb7dfa8c5a83 v7-3-765 +b5103b7d9e1284ef9ffbc7d1170d9105c0769c4d v7-3-766 +be1cffa1e477c4a96bb54a3097d3369b23f32825 v7-3-767 +9ea81cd9b1f50054629547ce2eccfac1fa00d096 v7-3-768 +d179a8eff9d7b0adc561f4a4dcfb0b7612c1f301 v7-3-769 +da7a7ba36ed2a51f28e4d3f7e1fd550303e3ece8 v7-3-770 +3bd2c055319e086665af5e449498a4d5bf40f25e v7-3-771 +d828cab6964f4249db54bff6df0fe02d0f290387 v7-3-772 +3db9aee957f7eea6729e5bfd294e3a24d41c79e4 v7-3-773 +a8f5876e498125f4916c5f7168823885c27dad8c v7-3-774 +a6e60677aea727622dde15d1306c61588b805500 v7-3-775 +80b041b994d156360992666110964e74f7473d3e v7-3-776 +9a1a4c486e6bb367c639c29c6120d5fb1fadcc38 v7-3-777 +562bbee33aa4f9896cb23ed6de8fbf60cac323e0 v7-3-778 +2067ed78d37c331685ef8f293d6a23c372ca4b78 v7-3-779 +42edc5dac33c92876d93f00f8ab8c1f6bb25d3fc v7-3-780 +29f29e86602e4a7f83d4572d2fe75b9b0de2752f v7-3-781 +0de969850c0687d2018e025f31e5cef9e9ce1444 v7-3-782 +a80af62d5e3b3614ff9e058f42647c99bffe7481 v7-3-783 +fbadf0f6987790d98c3b3fd935fea0494743830a v7-3-784 +be4baed0c933e1f1543ea175e2e36551ff6caa18 v7-3-785 +8b3e88bab70215a18768fca5a90c6f07ac1aa5eb v7-3-786 +e1b98967a985f4d1ad889c8e69b822d9126411ab v7-3-787 +386fc822dd002958fdade4329845013cbfaa3dab v7-3-788 +43c15135926fb95fa82b01424677a9c37f4d0e46 v7-3-789 +8819ea6dcb72dcf61fd0d20f8ea1904a7546917f v7-3-790 +16e8a09e8ab08d2226dc84b12b7e434bda6b4fa9 v7-3-791 +7061704c2014e4563efa032672264a47b4b7b0d9 v7-3-792 +fdbded463fdcc861630b3ea61b9654374847231a v7-3-793 +9867f92c9b9fb082ee6daca816f859b53ed8e58b v7-3-794 +17a312ba38a0b606cfd64d82ed2ebc844828085f v7-3-795 +2c12c4e2fae8db60fbdf58b34c8b73eacdc32665 v7-3-796 +0cbea05f19c73c01dbd0f04378a65ab7de6719e7 v7-3-797 +cdaa688e3dddc442c1d39780b6ac0b5ac98c253e v7-3-798 +5e9730de25e9b4fc2abe14b8d6b0968a9e59983a v7-3-799 +c0cc0e0620dd935956a472e5b23369d1d78f5fb9 v7-3-800 +48b54c590dc83b705f2e19f9aea1e9a69fe09720 v7-3-801 +cd5145d2408bb52217417af654f5664af269e19e v7-3-802 +77fa4dee43fcd1c0bacad9dc85b3deb39e0ba487 v7-3-803 +2eb4b9ed2d42312eff32e845336aab748f7fe311 v7-3-804 +dc30c01f995623e65ee6651a46b12ff062df8860 v7-3-805 +f7e3f87ac9928df0079741258a3c6034ecc48806 v7-3-806 +1efc30385c417bb413f5199253edca2795f9da0e v7-3-807 +3b2a771abb39f670269b0ee9c4041bf02c2d5b84 v7-3-808 +918d7df425afb77261428968ae646efb95b15224 v7-3-809 +8904ccd5ee85ff326a05530c02cc90e1260f768a v7-3-810 +ad21448af931b3923d9b76e4efdcf0e966c9d199 v7-3-811 +4584e59860b8db6fc5870f0b8f0425f540ea90a7 v7-3-812 +4e6e012af15028dde0f55bd9bc676bbb14e481ff v7-3-813 +d5b1d6177b374bbecfbd5c75fbce28e148eeecea v7-3-814 +448a6e7cf32e14a4adcbc4066743e2f058f7e1c0 v7-3-815 +2b340e5c5baaf66015f3367208d9bf22ce1dfc8e v7-3-816 +01fa9313d4b560997234b94b2408e6bf64808afc v7-3-817 +ad7b6062a7f4041b736d45c5f045671d60eb782f v7-3-818 +36fd800b8c6c527c75bfe285d0ed0c3bc1cf45f7 v7-3-819 +688da4d486a019afa3565ffc553af6ee1a4e67d8 v7-3-820 +4936ee89b4bcfaa33f74114bd07f20af382af14d v7-3-821 +2f7883063b19039840a4a73fa227f6f42b9e3281 v7-3-822 +db401e5e4c5d868b7848486c84521f047dc04b01 v7-3-823 +f5ef9b9c18cd9345eca783fb0c6d4ed50e215cb8 v7-3-824 +6b1f3fc893cdb6d0a4fff5997cc8ff083940e727 v7-3-825 +646cb6b6ff2372c26cb9dc9ef1a0f8d562204950 v7-3-826 +5e17a12a3b1438a7ce044db02d9916ef36e404a9 v7-3-827 +13170a796134824375a42e77af4ff012ceed2b5a v7-3-828 +7728d626ae038dedbf3347508238ef3ab4216a9e v7-3-829 +454d35a4339251adf125de78a8a98d99105533eb v7-3-830 +cb185366f5c84852a7221ed6d9b274a7239ad06d v7-3-831 +670e576a58d19c2033877d26b4338873d8a7db12 v7-3-832 +b971097606032c6fceb961fd559121d5bd74a260 v7-3-833 +3ac9d7d8274e669d10178c4d95eac55080ee0ea5 v7-3-834 +d356b5ce84ceac41b036136807ebe887208fb6f0 v7-3-835 +ff193256398a81a520b44c67d661eee36c64ee95 v7-3-836 +14698f63de8db5b034939aa66b7076ab76bcd529 v7-3-837 +1c819b05529cbbc39982513271499e0217382124 v7-3-838 +2030aca407edf6c865114f459bf2d5d79adea390 v7-3-839 +1778d51fcbc37e819c305b860f98c949915d35eb v7-3-840 +b40e6a47ee53789e91b57c04d9ee7328fa9237d5 v7-3-841 +78321dcaa8e263cdf408f7880530b7aea7401a49 v7-3-842 +f4960ddda07ce46a098d9106ac1b22fd0f6d0f0a v7-3-843 +eccc0e8a82fb632efdfa600db3f65f4ed3dff01b v7-3-844 +171234e02b1e74a2482003d56e7110d37fb4a62b v7-3-845 +b06bb07d906be3be689f90399effd2b3b2ac2ee3 v7-3-846 +4dd43d6b3df705a513be75db8a1b50a83f72088d v7-3-847 +e49b80f267dc3cde78de78026368dec3a20520f2 v7-3-848 +dc77c2a14a05810bda7e53373d76b7f41341f44d v7-3-849 +07fef68eb0188adb3d750b92b78059cf41fc8c7c v7-3-850 +dd669f296568a7525e02ab54b615bde20d37c466 v7-3-851 +3fd805ca2a6a6ef231f111c6a7b3cd512abaf537 v7-3-852 +eea32254940fb4cd61339650e10a808f4e702e62 v7-3-853 +14cdb6e4d5b88aaaf7e33eaee87efec5b1c1ebf5 v7-3-854 +6604853dd8227c7983dc1b10f804f6aa4b28578f v7-3-855 +fb533fb6c015f40a3b1301c0c876c35665b0d6ef v7-3-856 +4905e038b1057e133d0e72c48cf88580cdedf26b v7-3-857 +0a3fab86f34d6bab27e0be69db4f39ffb664557a v7-3-858 +ecf21be84def6033137d168e0a66500c29aeffec v7-3-859 +6ce32844727d8d04e8dc91310d0a4118d81aa161 v7-3-860 +6fe728bf165e9b6974ef47e86d98b0eb14ce21f3 v7-3-861 +dd4f3ceb5d86f8367d4cfd6fdc898e493c6d0aad v7-3-862 +5c0652f455c9f2ae72790a782fe5b5fd1a0e857c v7-3-863 +a82ef37d38c09523bab204253b52e177dbbc0581 v7-3-864 +94342b0605fb9111b7fd4a45a8bbc72992c4c255 v7-3-865 +90d72df431e54d677f03171cbe558434029c027e v7-3-866 +0fcb050fd79d84ed190452e6387e42d320678fec v7-3-867 +b31989e2b05832d432557a32ed8901dce237dec2 v7-3-868 +23ce9a61bdc2a35892ec4e4fa22e8964d60dc6cd v7-3-869 +26e59a39fdd965ffe83bd654b705540551c8e0c8 v7-3-870 +d52c45b35fb0c3b77bbace6cec3deda8100fbb7a v7-3-871 +edd0bc1f26bd019cfd328a0dc2c9a854607e4a41 v7-3-872 +7faeece39228fde0ac5c26a362a223d0dbe9bba5 v7-3-873 +4d0b39bcec207130e483ffa66b6f51f999d8e95b v7-3-874 +beab15a2ef147b880bf7b5add269142b9af58317 v7-3-875 +787df0fc6539ff7886e9fabc85ea403096577440 v7-3-876 +96f478b812b14fb1a5710450a1174baa55c73409 v7-3-877 +97a5ce76cb7d5f635876bbddf35b421c0c76690c v7-3-878 +79176b78969cf5d182b378ffb8e341e22f18775b v7-3-879 +9945fe0536a32496fe4842524199b5c24bb8b0d0 v7-3-880 +d8acfc49d94e485f839d8e2534d302b91a98bf9d v7-3-881 +8653c39b85ea93e052bb0cbda571e7298451eebe v7-3-882 +76aa34cef80f5d22bbbcf60278c833fdadd70131 v7-3-883 +22adc26aaa9f701267bd1ee4636592859ee2dc70 v7-3-884 +c5eab656ec51dc2d40ef6e39194c74af868a4b5e v7-3-885 +902d6ab377ee2f011279b3aaebeb05d0f5c2bf80 v7-3-886 +015e53d9978721bbb9283a999c668c98ad2554a9 v7-3-887 +b0b253898cf9ff8f5fbacf69de76b5640b1b6a55 v7-3-888 +cb0c694517a08f1f8f548f0771e874537a390dd4 v7-3-889 +89bdd6d575101291c66f9e701c456ee71085d147 v7-3-890 +1dc160bf2488fb1332250edaefcc9f1e320c8e57 v7-3-891 +6c2e8074ea2588f710adc669e7a15041f6e80adc v7-3-892 +dc3efb6d5a0821c79f939db8e3b77a714292195c v7-3-893 +52e946d654e0fe978609e0a23dde3c8998f2ce24 v7-3-894 +11007e80829ca9d72813a9c60a2eded80a0c1855 v7-3-895 +af3a3680fc75f090e896d902f0b4c7a710c41d41 v7-3-896 +5aa74a2f8f9de4a6c10bdebbef910d6750f2a980 v7-3-897 +aca1886102bdf19f755dc5eb1ac379f1f0680f6d v7-3-898 +bb3cfdb626077d9236447f40ee725b9a5d78216b v7-3-899 +b53fa3b431934de82d3bee329643bbe0856f651b v7-3-900 +790238e5a46c70f45232c0a54d0c73a6ca1d37dd v7-3-901 +b01e3cff92530f6c317e0cf2c0ba0fb4f97df883 v7-3-902 +166b3df562ead7b4f85a494fb8a6eef40affdf85 v7-3-903 +bdab73bf24a8b361a42ffcf429c0aa705d4594e0 v7-3-904 +8e1d1da398b378cf03c0910979cf475ddb2df7e3 v7-3-905 +ff1f3e42df08b2ebc39e3b1f2c80f4751bf16dbc v7-3-906 +9f3da1dea7c0944837e8d5a080eb59a24f6c9dd7 v7-3-907 +4281875776fb2c3127d08a03c3600b58353c9796 v7-3-908 +b79f3c3a584c701e93acd1881a934c931634c39f v7-3-909 +d8d9c591c50fec51b64c12bd2f42d3550bd31d7d v7-3-910 +f1eab4f77a6fe4b77508d86a68a6681195806607 v7-3-911 +62eadd7de409641de83ce61e1eb311e9116e06fa v7-3-912 +0d3573091d42d4797f10cff1c4139557d384f899 v7-3-913 +9f642ac84df9303d34d0214da2ade28f78ecfb6c v7-3-914 +d8053e6bf72a555ed34201c6edb55a23b4fc9965 v7-3-915 +f39af34195702c5587eff88dec51b40e327f418d v7-3-916 +3887b02953cec045611021e0adcd512b3d127692 v7-3-917 +6a8ffaf0585660badbb817f6a2f1cb583c9f1447 v7-3-918 +12636b8248163628e7c8df68210dc17932440157 v7-3-919 +923277a9cce4316d6b4cb3c6571dab538a6b0108 v7-3-920 +97474f967eec7f24f09d20dbac65ec9bb660bb2e v7-3-921 +1d56e5dfa08e68c9ef0645cabf076e401799e3bd v7-3-922 +6ecb80dc6521837e28bc58d27539767d6947037d v7-3-923 +7eaccdaa530431c15fb0e0803e5495074e883bb9 v7-3-924 +04736b4030ecfa2c9e8d6046ea533718dc5d8ff0 v7-3-925 +c80838526eebf3374fc42febcf40cd911cc1523c v7-3-926 +d67e292af6f9d259d0893c8062f3896a8aac000f v7-3-927 +6d45e6f974159e816a4300877296e9a0760ad113 v7-3-928 +94aa0d30a3ea6291daf7e6207810ec5282cc97a4 v7-3-929 +d85196defe0da017ff6d547e36bcf40aecba9661 v7-3-930 +fe0c7437ae8b0e05b57990549e1ddc71e456f18e v7-3-931 +b7f2d97ae2b7442c46c48ef36d9e33c3ddd34db7 v7-3-932 +c9820396afb971035e722ddce2058d5db2f0fc64 v7-3-933 +000bb500208d54e17de26bd5cc5a18fae8d1729c v7-3-934 +c42e130ebf36515e574d89efbe98fe380ec7c694 v7-3-935 +e7361b2d8136f6468daedf1bec7390d77c5c5bb1 v7-3-936 +8ec7323f417d998685afc26bbb4e466eb0204352 v7-3-937 +a2f03b41dca7024da5e702d016ae52fe7f51594c v7-3-938 +48a22f36ff45659594ca865f502fe95691b2e332 v7-3-939 +e2db42528a5bf380bc7e92e41afc807b27f01c12 v7-3-940 +da71e66dc1d4300cd792f0da77a5afd99d634c6c v7-3-941 +358c10968c7fcb2599356b419473a3fd46edcb69 v7-3-942 +736b8e18a3bced7e498a6b81e7189d78cf4671e0 v7-3-943 +71fa86c8fd4a1af0a27a880ea15e3a7b97334453 v7-3-944 +80eea7a9d6b9c2e7e8ceb18d6a090387f7e1e9f5 v7-3-945 +11376842075637114ee3714ccbc2e0e8a432a4ac v7-3-946 +a84f21892563be88839b4026bafba77f9e9a1fec v7-3-947 +a6f0544df95e5f783861d3c67d84bc5a28a315da v7-3-948 +cfd76908da252e03f46ea15cde44a3664e895fb0 v7-3-949 +d4816e7c33289b9c8aec739850133484c5c3e8fa v7-3-950 +907b1f035ee7cc61fec1463db85a9eaba4717120 v7-3-951 +2a166caf8709876053f9b32f4f88590a4fbc6899 v7-3-952 +7b789d337820088f09f6a8fb488efd418f702133 v7-3-953 +1afdb7d21c14e15a1239d406205563dd702d7d24 v7-3-954 +fa90ebf2c8f36d98ef27b2668ac1e1c11db75bbe v7-3-955 +0bbacb6a83bd678266a0a864e47f4e03927103fd v7-3-956 +c16602758d847665ed50138a562f1513ca5dedc8 v7-3-957 +58b74ab7f29df09e54bf76ac84697f04b9f4c163 v7-3-958 +ef6b11bb183da058edf52c86ce705726ccf72600 v7-3-959 +e67522c4f56646bd6ef91ad63b152bcec96b2e05 v7-3-960 +d5177d5ece0c539680390448c8ce8d05a6d61201 v7-3-961 +0a94ac379769762200c427995551fa4325ec8f28 v7-3-962 +7eafa576528e6921f337da5c1e3e2d0a9617993a v7-3-963 +7d81f4e967285d14c9e9901328d2c66911a9a2f2 v7-3-964 +8a3ca4adb5d8046f87aabcf30a2b7aefb8b9d46c v7-3-965 +9b800f0a757fcbedc2c6a1851353c3e5044d39b2 v7-3-966 +20e30e31bd86390590e288516670b81caec6188c v7-3-967 +dfbe53a54c790d63f8788c13a6a2d18198825605 v7-3-968 +137f9d41f50894cd25e5b47764af817dd84037cd v7-3-969 +ccecb03e5e8ba41db171a5535047f9a30b5d391d v7-3-970 +8d6bb2338a583af5eb85589949065cfe46c42bd4 v7-3-971 +ba53304245f033b6cf2f6088c09f45dc0d98c47c v7-3-972 +09e1e574a52d38522a35af8741b3f8ce92336398 v7-3-973 +92fec4b83be56a65ed81f25885717f6db7639854 v7-3-974 +44b89b025cdfb6a7371a036ef1b2dd93670b2a15 v7-3-975 +015a8fabf90072ae0eadee5c013f7db00f83977c v7-3-976 +21e13403140aec6f32a8f9b49dac02c37945ab11 v7-3-977 +fe8a0a6a1c2a2ca51c92275a9010999106505ed8 v7-3-978 +a63361b9097952faa9c9eba2caebef09b9f8b62b v7-3-979 +c83656c9745a005df1aa7d6985787048a1884734 v7-3-980 +4ff8fa416a0dd64046e0471933d09f7f19a4ea0f v7-3-981 +dde1cf311be6edf32243f03fd8436bdf9798de93 v7-3-982 +ab5154170c3dfc0dd769243e1da53a865e1f69d7 v7-3-983 +94c5441984cc47971ac49435d184c13cd6d3014b v7-3-984 +0c940b6f282836186f428d201760c6f6b9b52fc6 v7-3-985 +3cc2dca142a0aed29befbe6d2944ed580d728545 v7-3-986 +032c9f916f257ed59f7c55a6c8113791d3def365 v7-3-987 +035fb0d5e7ce67eaff19a6cadb37b57c0c25a36b v7-3-988 +cd005ab15ef3fce8f551c81ea10c93889f42d09d v7-3-989 +9a1d78f828261181232734378f73d648148a42bc v7-3-990 +8fe768bc1234fc817db3cda61ae9e9dabf4ae958 v7-3-991 +89ea7593fc0cb9ec66cc04619217447715289a78 v7-3-992 +dff1542e64f95a3fe10ea24f4007206d53880087 v7-3-993 +f74611bfb1b77eb2ad42b6d74b3e3657cf3f0725 v7-3-994 +6d517f6e5f0b031cdb386878d8d428f7f2cfc2a1 v7-3-995 +ebd94eabfd8013a605d8efc7df64a970531fd5a8 v7-3-996 +ef02f32d8e53a7b3d7327ac79359a18070e4a101 v7-3-997 +47e6dec5ce3cbc8e833480b8300132d4bf5f035e v7-3-998 +e6e60d9da892296ad770b26a22f98bb72c4e1b7d v7-3-999 +d037b9cbdaaa0af2b383c93acd0fd87e8eb2b8f1 v7-3-1000 +9dbbddb2ed10936c20048ad28a2dcb9fdb6cdd79 v7-3-1001 +b498224f5b417bc436c9b967978628703191c0d9 v7-3-1002 +ce94a870b59bbaad92399eb782edc33a855e0b93 v7-3-1003 +cadb57fbb78165c81fe4718a355b5f73c641bb62 v7-3-1004 +90e9917d4114461c5f7258c04e61de1dff2e1a74 v7-3-1005 +9a2183bd829502597d52f22a1c27fec8399298fd v7-3-1006 +fba9c0f86f77942d47a5505b065e01a733e7f111 v7-3-1007 +8cb14f59a3275cb183f031e2aa1e29e230635d6f v7-3-1008 +57393dc4b811a1283a77c759a09bc52ba78acb8d v7-3-1009 +36ddcf4cecbc96b9854af6956f371dea205a6890 v7-3-1010 +55bcaa1d2749f9dc22187bea848b002220cfe960 v7-3-1011 +432a6b8c7d933dee8faf25a342e857fa0a538eea v7-3-1012 +1be43c095affe8e945751a5cb4e21210f31c02ab v7-3-1013 +6a2005efa02b4ae30fa4867db1463fd4a3689843 v7-3-1014 +45f97c34953728cfe859cfe5212c241fab1da20f v7-3-1015 +5cc98a5898cf9ff0841c78acfe1056ae075a217a v7-3-1016 +532c2e850256cced37b8864ee7042ef8240f135a v7-3-1017 +80170d61a85cc03d66228c16c80cd8a4898a971e v7-3-1018 +08ac4698095359c3a888b34074548435e9775973 v7-3-1019 +f7944ce459ac77416617e0b2f8a91a9c8cb385b6 v7-3-1020 +fc997f05cbc7b566df765c79452a541afaadccb8 v7-3-1021 +849180347ac359fd52b92d70b545800126178eab v7-3-1022 +f0c37f5cf4eabb04044ccab4031cc4056c5a47a2 v7-3-1023 +7b835b2969af137f979b633977d59e13cc0960df v7-3-1024 +b2946c06d1b6d4e9d38fad1d4281e2d4db3523f3 v7-3-1025 +888c12c899e552deb33b2e1e8ea3c8141352c3ce v7-3-1026 +04086e29756318d7a7cfe3d35fd38ccf550ac366 v7-3-1027 +4d81fdda8f35cf764744161118aeaec948b9fc90 v7-3-1028 +e7016af0cbf92a5562c01e95f2cec306b6465783 v7-3-1029 +d1f3c77159f9b69f229ee0f70fd98464b2546920 v7-3-1030 +96c1a785009768720fcb16add8b9daf1290ce56d v7-3-1031 +f262fb02889d46743226a78363250e2e1ed7426b v7-3-1032 +b2a8e3a66f8cc73c3942ef5cb9c0519df86203cd v7-3-1033 +37e444aeb33b2adf359f8736807f18ff5dc11019 v7-3-1034 +626e9ccb7c48b3fa7ff6d2ca5efe91bff39135dc v7-3-1035 +b22bff1a6af81dd78f8e9ff0bcded471ab858245 v7-3-1036 +7a2be4a39423e4763ca164dc77fcfd4b27f91a8e v7-3-1037 +6a73ac422c67d7ad4642ae9194cf9d4c832021d2 v7-3-1038 +321cfbef943199e8e967f6354877ca8fc07e4551 v7-3-1039 +b9f87487d93597f69f09ecab8cdca11bef6c09d0 v7-3-1040 +63c9b681c3dba1cfcd2df48085de2453c43855af v7-3-1041 +fa39483a1363d533f9c7897d476bf0ebd1b8f44b v7-3-1042 +1e8952a5a726ddc1458ff40270cd5da16be3f272 v7-3-1043 +0cf552b325b55d417079ad28dff4e27afec5a2ca v7-3-1044 +29b2be2bba0d369fef85af7aa3196f8b84cce35c v7-3-1045 +00eecb2f8e3e9664ff00682d278a2b1e19cc4b09 v7-3-1046 +89bec74fd7936cc425b42f9e882f1f3864b1c95d v7-3-1047 +19d406a8509d9755b05af7d5ea521925b01f0d76 v7-3-1048 +074491a83571596acb6aac6d371140e8f99fbc24 v7-3-1049 +38276cfe40b2069f94b159cc14b4ade47257c836 v7-3-1050 +70600448f9e7f3bff3b8b0c2f2733662bac08ea8 v7-3-1051 +12421d8a45d5597828b8343c31faa79f77d9c512 v7-3-1052 +49f0fcd9762ce5057e4ac22417105b3ce43a35f3 v7-3-1053 +219b2fcad60d27febcaf7251a91be331484b2c98 v7-3-1054 +5679b8ddd8cc0eb004cbb61babb336c3af398c92 v7-3-1055 +21a99611149b0f1c200e001ec26b8b07c6e28c45 v7-3-1056 +90beab957ba9ebeac150bc5a56cf6ad90f53336d v7-3-1057 +66e615ce7f61948a2a4a8615d703a42d56763490 v7-3-1058 +548b889fe3cfbf06ab50de373df5e65f52cb249c v7-3-1059 +cb5c1e37ad4d4811e5fe178f14c523b178da81ec v7-3-1060 +18ba89e06fab93e8cdf7ca8dfbb34b66ff9d61d1 v7-3-1061 +e4e48d4ee0409509d56f7d654b77a35133283bc7 v7-3-1062 +4157fef7b95074cac55977127964adfa883ec030 v7-3-1063 +3857d399ab41ee8af64c5307c27da64b01e0a233 v7-3-1064 +07c534fe9b6cdbfecfd100b7e01f894d6708de1b v7-3-1065 +4c46e1487c634997f4701d8e68ba9ab019f85227 v7-3-1066 +52a4f66ae1f5695426de21877b2954d11ad8a4f4 v7-3-1067 +59e6c2bd68e38244d2133fc8d76bfc9c7b082d9f v7-3-1068 +6ec3dada4ad3c7e2551191e598cfb6d37bedac36 v7-3-1069 +c316a30a889217be4158fba900c85d9d44ad3a1b v7-3-1070 +857f6c53f1172ed836d44f105f6832973369bef5 v7-3-1071 +9f502d8d5165a79b361ad6048e84c278e1397f88 v7-3-1072 +f10f63aaec5c08e6f3b1b3abdef6ce3eef1cff6f v7-3-1073 +b943fd24c351141113dba360bd1d1f02b38813f5 v7-3-1074 +779ca415f8e142ab5ca74f95c8f732d1f00fb7dc v7-3-1075 +93b7ed814bec8a9a0b43138be7500b948d48eb92 v7-3-1076 +80b0081824fa3084d0e12f0b21f6e504b4e5e076 v7-3-1077 +0dce3d812e7acc74c39b3d87d8bb5b3a4dbee878 v7-3-1078 +bce2051173f01564805158ff669255359953fcad v7-3-1079 +7a35419393c36edcb710602edba31d5096d357d0 v7-3-1080 +9e7ef781d494694a36e056631dbd2c4357ab1090 v7-3-1081 +2d15582e132f62aa37e5eea5e837b3824f148dd2 v7-3-1082 +b3c59716e7001ab5127c259c9fd3552de0d36d53 v7-3-1083 +05d57d7c2d5578f1d794151be9cbb5aef89d821e v7-3-1084 +811a4c9b51d808cbd54dd0bab606d7cc1cc2e412 v7-3-1085 +c1622ff9ed8d984604a47ad0805d3fc528452bde v7-3-1086 +4d92b873acefb69e112fd73b642bfdf7979f1355 v7-3-1087 +2f51ee8825dbeb31713e635fd8d77ef77742ad64 v7-3-1088 +79522bb1712556183073b148e085d302967d7260 v7-3-1089 +8db697ae406a8ceb05f9fb8b45a70980904f230a v7-3-1090 +371cc0c44097772ac13e0e3cb59350c6be52257a v7-3-1091 +9d97a0c045ef5c86652c7fae4d4cd5752bcb42d6 v7-3-1092 +08fbb1ce1bc56e3884c5d35106df31a9cae1f954 v7-3-1093 +efc4fb311d5d45f6320b9d17ed47d24748335bcb v7-3-1094 +ed4e689bbea1c45a8aeb808b526dfd052470ef20 v7-3-1095 +2db0050523719e39f17f4bd855310bf5688155f5 v7-3-1096 +0c25fa1dfd97721cd4c92f4e7a9a524a24f3f43e v7-3-1097 +26f2dbea7443f719c854c7a1fc35dbacdd129307 v7-3-1098 +542af01979be709a4763eb8b9cc1cbcfaf584838 v7-3-1099 +bf917ee1fad22f643d7ef1a919b233f07fc1fb3c v7-3-1100 +761e42cc79c2560af55ebec0ec1060f547e64577 v7-3-1101 +1c5da99d1b708b7af2928e7bc0d9d57935872958 v7-3-1102 +832bf8136d86dd17489d962cd2d7316d7edf5087 v7-3-1103 +fc4d7f02ea3ac731a9717438c72aba098b117e8e v7-3-1104 +a804309e7327f0ece015aace3c855e7987f0ac3d v7-3-1105 +ec72bb4a0fc2e7f0d517cb12f784770cea9cc19c v7-3-1106 +bd6bef0bd0fbeb79b440e429f5e077169388198c v7-3-1107 +3534e9b4fa42b392399d66d08a1dcdd230accba5 v7-3-1108 +450e13fe16211217f32bc57c3827f439540398bf v7-3-1109 +3849c811cc0bccbe09a559e2be5fec7e810510cc v7-3-1110 +43de4ebbe7ad009199987337b864240ba19bfec6 v7-3-1111 +749e2b2755d59eedd6fd28e7d9ec47523b722be7 v7-3-1112 +0798b096bab3efde994f0b50d6776ac72ca0f41c v7-3-1113 +532c31f9e92fd44526d02d26c503a15c1c1c78c2 v7-3-1114 +3f2319a953b3c2fc8cbe9ae9225080a5b30a638a v7-3-1115 +66a9e8fa6f45ddd8dec5b98c193abc576330e4d4 v7-3-1116 +97560c16ca99a1341f31d88ed9f508d777647b5c v7-3-1117 +6a706ca7a889d27ecd6b671e31dbe28ab6b66f28 v7-3-1118 +a62695305e031260557ff0cde6eca1db5ab9e3e9 v7-3-1119 +d1376091d18b5a742ada87bf825d20e99ccbef19 v7-3-1120 +4b9503f0c7d3d75d772c2c0dbe19616da2480749 v7-3-1121 +7793e737ec8723a18d4c5468b33a895249ba4f02 v7-3-1122 +77ecab3bb2078fe525602172b35c2031c819ade3 v7-3-1123 +be1e4acb30cab46ab439e45b9b6871a7aff23800 v7-3-1124 +96f3348f9f119a996ae8826ef4d5a06c3f7e677f v7-3-1125 +b25a1b2e3175902e49a69e8d9ccc5c1cc43fbe3f v7-3-1126 +532a9855bd30d28cc14848ce5136658a273bc999 v7-3-1127 +47906f888725760ac704668b71057629e266e486 v7-3-1128 +f824cb97eb922975cdc1025f3c2c62f1bdbcfdd6 v7-3-1129 +ec24ff78a79c1851d8003780035d6c55f98dcceb v7-3-1130 +82e6588762e4aee5b0f0cd51d5c124ebfec6424d v7-3-1131 +b20dbf3a5370543ffaa1d6fc337df1969843477e v7-3-1132 +03375ccf28a27ed72f6cf347383aaacbd1a51e4d v7-3-1133 +531e598651fc6a7c28bc808d82c09ddc1759bf4f v7-3-1134 +e4bc21965079eb6948d8e22ad96d145659852707 v7-3-1135 +343d09006056ff408f08850317b8e8caf056f5fe v7-3-1136 +c02c7df9bdc91ae08ef626d4a8262fed47285c41 v7-3-1137 +47222d8b1e94c962f9daf6c2ff3f6c6ddcb71613 v7-3-1138 +3b5a023a45434e825b8dbeed551cf7f4578243f6 v7-3-1139 +7fde662e1db24077abbe26e6d78c286928f5c9b6 v7-3-1140 diff -Naur vim73.orig/Filelist vim73/Filelist --- vim73.orig/Filelist 2010-08-07 11:04:57.000000000 +0000 +++ vim73/Filelist 2013-06-07 17:07:05.425659845 +0000 @@ -39,6 +39,7 @@ src/mark.c \ src/mbyte.c \ src/memfile.c \ + src/memfile_test.c \ src/memline.c \ src/menu.c \ src/message.c \ @@ -56,6 +57,7 @@ src/popupmnu.c \ src/quickfix.c \ src/regexp.c \ + src/regexp_nfa.c \ src/regexp.h \ src/screen.c \ src/search.c \ @@ -72,6 +74,7 @@ src/version.c \ src/version.h \ src/vim.h \ + src/winclip.c \ src/window.c \ src/xxd/xxd.c \ src/main.aap \ @@ -80,6 +83,7 @@ src/testdir/test[0-9]*.ok \ src/testdir/test49.vim \ src/testdir/test60.vim \ + src/testdir/test83-tags? \ src/proto.h \ src/proto/blowfish.pro \ src/proto/buffer.pro \ @@ -128,6 +132,7 @@ src/proto/ui.pro \ src/proto/undo.pro \ src/proto/version.pro \ + src/proto/winclip.pro \ src/proto/window.pro \ @@ -259,8 +264,10 @@ src/Make_mvc.mak \ src/Make_w16.mak \ src/bigvim.bat \ + src/bigvim64.bat \ src/msvcsetup.bat \ src/msvc2008.bat \ + src/msvc2010.bat \ src/dimm.idl \ src/dlldata.c \ src/dosinst.c \ @@ -311,6 +318,7 @@ src/xxd/Make_bc5.mak \ src/xxd/Make_cyg.mak \ src/xxd/Make_djg.mak \ + src/xxd/Make_ming.mak \ src/xxd/Make_mvc.mak \ nsis/gvim.nsi \ nsis/README.txt \ @@ -345,6 +353,13 @@ src/vim*.ico \ src/vim.tlb \ src/vimtbar.lib \ + src/xpm/COPYRIGHT \ + src/xpm/README.txt \ + src/xpm/include/*.h \ + src/xpm/x64/lib/libXpm.a \ + src/xpm/x64/lib/libXpm.lib \ + src/xpm/x86/lib/libXpm.a \ + src/xpm/x86/lib/libXpm.lib \ src/vimtbar.dll \ nsis/icons/*.bmp \ nsis/icons/*.ico \ @@ -426,20 +441,14 @@ $(SRC_VMS) \ README_os390.txt \ src/Make_mint.mak \ - src/Make_ro.mak \ - src/gui_riscos.c \ - src/gui_riscos.h \ src/if_sniff.c \ src/infplist.xml \ src/link.390 \ src/os_beos.c \ src/os_beos.h \ src/os_beos.rsrc \ + src/proto/os_beos.pro \ src/os_mint.h \ - src/os_riscos.c \ - src/os_riscos.h \ - src/proto/gui_riscos.pro \ - src/proto/os_riscos.pro \ src/os_vms_fix.com \ src/toolbar.phi \ @@ -466,6 +475,7 @@ runtime/macros/hanoi/hanoi.vim \ runtime/macros/hanoi/poster \ runtime/macros/justify.vim \ + runtime/macros/less.bat \ runtime/macros/less.sh \ runtime/macros/less.vim \ runtime/macros/life/click.me \ @@ -669,6 +679,8 @@ # generic language files LANG_GEN = \ + runtime/doc/*-de.1 \ + runtime/doc/*-de.UTF-8.1 \ runtime/doc/*-fr.1 \ runtime/doc/*-fr.UTF-8.1 \ runtime/doc/*-it.1 \ @@ -685,7 +697,17 @@ runtime/tutor/Makefile \ runtime/tutor/tutor.utf-8 \ runtime/tutor/tutor.?? \ - runtime/tutor/tutor.??.* \ + runtime/tutor/tutor.??.utf-8 \ + runtime/tutor/tutor.??.euc \ + runtime/tutor/tutor.??.sjis \ + runtime/tutor/tutor.??.iso9 \ + runtime/tutor/tutor.??.big5 \ + runtime/tutor/tutor.??.cp1250 \ + runtime/tutor/tutor.??.cp1251 \ + runtime/tutor/tutor.??.cp737 \ + runtime/tutor/tutor.??_??.utf-8 \ + runtime/tutor/tutor.bar \ + runtime/tutor/tutor.bar.utf-8 \ runtime/spell/README.txt \ runtime/spell/??/*.diff \ runtime/spell/??/main.aap \ diff -Naur vim73.orig/Makefile vim73/Makefile --- vim73.orig/Makefile 2010-08-15 12:23:34.000000000 +0000 +++ vim73/Makefile 2013-06-07 17:07:05.432326493 +0000 @@ -23,6 +23,9 @@ # has run can result in compiling with $(CC) empty. first: + @if test ! -f src/auto/config.mk; then \ + cp src/config.mk.dist src/auto/config.mk; \ + fi @echo "Starting make in the src directory." @echo "If there are problems, cd to the src directory and run make there" cd src && $(MAKE) $@ @@ -30,6 +33,9 @@ # Some make programs use the last target for the $@ default; put the other # targets separately to always let $@ expand to "first" by default. all install uninstall tools config configure reconfig proto depend lint tags types test testclean clean distclean: + @if test ! -f src/auto/config.mk; then \ + cp src/config.mk.dist src/auto/config.mk; \ + fi @echo "Starting make in the src directory." @echo "If there are problems, cd to the src directory and run make there" cd src && $(MAKE) $@ diff -Naur vim73.orig/README.txt vim73/README.txt --- vim73.orig/README.txt 2010-08-15 12:23:19.000000000 +0000 +++ vim73/README.txt 2013-06-07 17:07:05.462326407 +0000 @@ -97,10 +97,12 @@ If you have problems, have a look at the Vim FAQ: http://vimdoc.sf.net/vimfaq.html -Send bug reports to: - Bram Moolenaar +If you still have problems or any other questions, use one of the mailing +lists to discuss them with Vim users and developers: + http://www.vim.org/maillist.php -There are several mailing lists for Vim, see http://www.vim.org/maillist.php. +If nothing else works, report bugs directly: + Bram Moolenaar MAIN AUTHOR diff -Naur vim73.orig/README_extra.txt vim73/README_extra.txt --- vim73.orig/README_extra.txt 2010-08-15 12:23:19.000000000 +0000 +++ vim73/README_extra.txt 2013-06-07 17:07:05.605659331 +0000 @@ -13,9 +13,6 @@ src/os_amiga.* Files for the Amiga port. -src/gui_riscos.* -src/os_riscos.* Files for the RISC OS port. - src/gui_beos.* src/os_beos.* Files for the BeOS port. diff -Naur vim73.orig/runtime/autoload/ada.vim vim73/runtime/autoload/ada.vim --- vim73.orig/runtime/autoload/ada.vim 2010-05-15 11:03:31.000000000 +0000 +++ vim73/runtime/autoload/ada.vim 2013-06-07 17:07:06.515656734 +0000 @@ -29,6 +29,8 @@ if version < 700 finish endif +let s:keepcpo= &cpo +set cpo&vim " Section: Constants {{{1 " @@ -619,6 +621,9 @@ lockvar! g:ada#Keywords lockvar! g:ada#Ctags_Kinds +let &cpo = s:keepcpo +unlet s:keepcpo + finish " 1}}} "------------------------------------------------------------------------------ diff -Naur vim73.orig/runtime/autoload/ccomplete.vim vim73/runtime/autoload/ccomplete.vim --- vim73.orig/runtime/autoload/ccomplete.vim 2010-05-15 11:03:31.000000000 +0000 +++ vim73/runtime/autoload/ccomplete.vim 2013-06-07 17:07:06.532323353 +0000 @@ -1,8 +1,10 @@ " Vim completion script " Language: C " Maintainer: Bram Moolenaar -" Last Change: 2010 Mar 23 +" Last Change: 2012 Jun 20 +let s:cpo_save = &cpo +set cpo&vim " This function is used for the 'omnifunc' option. function! ccomplete#Complete(findstart, base) @@ -498,7 +500,7 @@ endif if !cached while 1 - exe 'silent! ' . n . 'vimgrep /\t' . typename . '\(\t\|$\)/j ' . fnames + exe 'silent! keepj noautocmd ' . n . 'vimgrep /\t' . typename . '\(\t\|$\)/j ' . fnames let qflist = getqflist() if len(qflist) > 0 || match(typename, "::") < 0 @@ -603,3 +605,6 @@ endfor return res endfunc + +let &cpo = s:cpo_save +unlet s:cpo_save diff -Naur vim73.orig/runtime/autoload/clojurecomplete.vim vim73/runtime/autoload/clojurecomplete.vim --- vim73.orig/runtime/autoload/clojurecomplete.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim73/runtime/autoload/clojurecomplete.vim 2013-06-07 17:07:06.545656648 +0000 @@ -0,0 +1,20 @@ +" Vim completion script +" Language: Clojure +" Maintainer: Sung Pae +" URL: https://github.com/guns/vim-clojure-static +" License: Same as Vim +" Last Change: 05 February 2013 + +" Special forms and public vars in clojure.core +" Generated from https://github.com/guns/vim-clojure-static/blob/vim-release-002/vim_clojure_static.clj +" Clojure 1.5.0-RC6 +let s:words = ["*","*'","*1","*2","*3","*agent*","*allow-unresolved-vars*","*assert*","*clojure-version*","*command-line-args*","*compile-files*","*compile-path*","*compiler-options*","*data-readers*","*default-data-reader-fn*","*e","*err*","*file*","*flush-on-newline*","*fn-loader*","*in*","*math-context*","*ns*","*out*","*print-dup*","*print-length*","*print-level*","*print-meta*","*print-readably*","*read-eval*","*read-whitelist*","*source-path*","*unchecked-math*","*use-context-classloader*","*verbose-defrecords*","*warn-on-reflection*","+","+'","-","-'","->","->>","->ArrayChunk","->Vec","->VecNode","->VecSeq","-cache-protocol-fn","-reset-methods",".","..","/","<","<=","=","==",">",">=","EMPTY-NODE","accessor","aclone","add-classpath","add-watch","agent","agent-error","agent-errors","aget","alength","alias","all-ns","alter","alter-meta!","alter-var-root","amap","ancestors","and","apply","areduce","array-map","as->","aset","aset-boolean","aset-byte","aset-char","aset-double","aset-float","aset-int","aset-long","aset-short","assert","assoc!","assoc","assoc-in","associative?","atom","await","await-for","await1","bases","bean","bigdec","bigint","biginteger","binding","bit-and","bit-and-not","bit-clear","bit-flip","bit-not","bit-or","bit-set","bit-shift-left","bit-shift-right","bit-test","bit-xor","boolean","boolean-array","booleans","bound-fn","bound-fn*","bound?","butlast","byte","byte-array","bytes","case","cast","catch","char","char-array","char-escape-string","char-name-string","char?","chars","chunk","chunk-append","chunk-buffer","chunk-cons","chunk-first","chunk-next","chunk-rest","chunked-seq?","class","class?","clear-agent-errors","clojure-version","coll?","comment","commute","comp","comparator","compare","compare-and-set!","compile","complement","concat","cond","cond->","cond->>","condp","conj!","conj","cons","constantly","construct-proxy","contains?","count","counted?","create-ns","create-struct","cycle","dec","dec'","decimal?","declare","def","default-data-readers","definline","definterface","defmacro","defmethod","defmulti","defn","defn-","defonce","defprotocol","defrecord","defstruct","deftype","delay","delay?","deliver","denominator","deref","derive","descendants","destructure","disj!","disj","dissoc!","dissoc","distinct","distinct?","do","doall","dorun","doseq","dosync","dotimes","doto","double","double-array","doubles","drop","drop-last","drop-while","empty","empty?","ensure","enumeration-seq","error-handler","error-mode","eval","even?","every-pred","every?","ex-data","ex-info","extend","extend-protocol","extend-type","extenders","extends?","false?","ffirst","file-seq","filter","filterv","finally","find","find-keyword","find-ns","find-protocol-impl","find-protocol-method","find-var","first","flatten","float","float-array","float?","floats","flush","fn","fn","fn?","fnext","fnil","for","force","format","frequencies","future","future-call","future-cancel","future-cancelled?","future-done?","future?","gen-class","gen-interface","gensym","get","get-in","get-method","get-proxy-class","get-thread-bindings","get-validator","group-by","hash","hash-combine","hash-map","hash-set","identical?","identity","if","if-let","if-not","ifn?","import","in-ns","inc","inc'","init-proxy","instance?","int","int-array","integer?","interleave","intern","interpose","into","into-array","ints","io!","isa?","iterate","iterator-seq","juxt","keep","keep-indexed","key","keys","keyword","keyword?","last","lazy-cat","lazy-seq","let","let","letfn","line-seq","list","list*","list?","load","load-file","load-reader","load-string","loaded-libs","locking","long","long-array","longs","loop","loop","macroexpand","macroexpand-1","make-array","make-hierarchy","map","map-indexed","map?","mapcat","mapv","max","max-key","memfn","memoize","merge","merge-with","meta","method-sig","methods","min","min-key","mod","monitor-enter","monitor-exit","munge","name","namespace","namespace-munge","neg?","new","newline","next","nfirst","nil?","nnext","not","not-any?","not-empty","not-every?","not=","ns","ns-aliases","ns-imports","ns-interns","ns-map","ns-name","ns-publics","ns-refers","ns-resolve","ns-unalias","ns-unmap","nth","nthnext","nthrest","num","number?","numerator","object-array","odd?","or","parents","partial","partition","partition-all","partition-by","pcalls","peek","persistent!","pmap","pop!","pop","pop-thread-bindings","pos?","pr","pr-str","prefer-method","prefers","primitives-classnames","print","print-ctor","print-dup","print-method","print-simple","print-str","printf","println","println-str","prn","prn-str","promise","proxy","proxy-call-with-super","proxy-mappings","proxy-name","proxy-super","push-thread-bindings","pvalues","quot","quote","rand","rand-int","rand-nth","range","ratio?","rational?","rationalize","re-find","re-groups","re-matcher","re-matches","re-pattern","re-seq","read","read-line","read-string","realized?","recur","reduce","reduce-kv","reduced","reduced?","reductions","ref","ref-history-count","ref-max-history","ref-min-history","ref-set","refer","refer-clojure","reify","release-pending-sends","rem","remove","remove-all-methods","remove-method","remove-ns","remove-watch","repeat","repeatedly","replace","replicate","require","reset!","reset-meta!","resolve","rest","restart-agent","resultset-seq","reverse","reversible?","rseq","rsubseq","satisfies?","second","select-keys","send","send-off","send-via","seq","seq?","seque","sequence","sequential?","set!","set","set-agent-send-executor!","set-agent-send-off-executor!","set-error-handler!","set-error-mode!","set-validator!","set?","short","short-array","shorts","shuffle","shutdown-agents","slurp","some","some->","some->>","some-fn","sort","sort-by","sorted-map","sorted-map-by","sorted-set","sorted-set-by","sorted?","special-symbol?","spit","split-at","split-with","str","string?","struct","struct-map","subs","subseq","subvec","supers","swap!","symbol","symbol?","sync","take","take-last","take-nth","take-while","test","the-ns","thread-bound?","throw","time","to-array","to-array-2d","trampoline","transient","tree-seq","true?","try","type","unchecked-add","unchecked-add-int","unchecked-byte","unchecked-char","unchecked-dec","unchecked-dec-int","unchecked-divide-int","unchecked-double","unchecked-float","unchecked-inc","unchecked-inc-int","unchecked-int","unchecked-long","unchecked-multiply","unchecked-multiply-int","unchecked-negate","unchecked-negate-int","unchecked-remainder-int","unchecked-short","unchecked-subtract","unchecked-subtract-int","underive","unquote","unquote-splicing","update-in","update-proxy","use","val","vals","var","var-get","var-set","var?","vary-meta","vec","vector","vector-of","vector?","when","when-first","when-let","when-not","while","with-bindings","with-bindings*","with-in-str","with-loading-context","with-local-vars","with-meta","with-open","with-out-str","with-precision","with-redefs","with-redefs-fn","xml-seq","zero?","zipmap"] + +" Simple word completion omnifunc +function! clojurecomplete#Complete(findstart, base) + if a:findstart + return searchpos('\<', 'bnW', line('.'))[1] - 1 + else + return { 'words': filter(copy(s:words), 'v:val =~ "\\V\\^' . a:base . '"') } + endif +endfunction diff -Naur vim73.orig/runtime/autoload/getscript.vim vim73/runtime/autoload/getscript.vim --- vim73.orig/runtime/autoload/getscript.vim 2010-05-15 11:03:31.000000000 +0000 +++ vim73/runtime/autoload/getscript.vim 2013-06-07 17:07:06.592323181 +0000 @@ -1,8 +1,8 @@ " --------------------------------------------------------------------- " getscript.vim -" Author: Charles E. Campbell, Jr. -" Date: Dec 28, 2009 -" Version: 32 +" Author: Charles E. Campbell +" Date: Apr 17, 2013 +" Version: 35 " Installing: :help glvs-install " Usage: :help glvs " @@ -15,7 +15,7 @@ if exists("g:loaded_getscript") finish endif -let g:loaded_getscript= "v32" +let g:loaded_getscript= "v35" if &cp echoerr "GetLatestVimScripts is not vi-compatible; not loaded (you need to set nocp)" finish @@ -74,6 +74,11 @@ let g:GetLatestVimScripts_allowautoinstall= 1 endif +" set up default scriptaddr address +if !exists("g:GetLatestVimScripts_scriptaddr") + let g:GetLatestVimScripts_scriptaddr = 'http://vim.sourceforge.net/script.php?script_id=' +endif + "" For debugging: "let g:GetLatestVimScripts_wget = "echo" "let g:GetLatestVimScripts_options = "options" @@ -314,7 +319,7 @@ if &mod silent! w! endif - q + q! " restore events and current directory exe "cd ".fnameescape(substitute(origdir,'\','/','ge')) @@ -415,7 +420,7 @@ echo 'considering <'.aicmmnt.'> scriptid='.scriptid.' srcid='.srcid " grab a copy of the plugin's vim.sourceforge.net webpage - let scriptaddr = 'http://vim.sourceforge.net/script.php?script_id='.scriptid + let scriptaddr = g:GetLatestVimScripts_scriptaddr.scriptid let tmpfile = tempname() let v:errmsg = "" @@ -519,6 +524,7 @@ " -------------------------------------------------------------------------- " AutoInstall: only if doautoinstall has been requested by the plugin itself " -------------------------------------------------------------------------- +" call Decho("checking if plugin requested autoinstall: doautoinstall=".doautoinstall) if doautoinstall " call Decho(" ") " call Decho("Autoinstall: getcwd<".getcwd()."> filereadable(".sname.")=".filereadable(sname)) @@ -526,7 +532,7 @@ " call Decho("<".sname."> is readable") " call Decho("exe silent !".g:GetLatestVimScripts_mv." ".shellescape(sname)." ".shellescape(s:autoinstall)) exe "silent !".g:GetLatestVimScripts_mv." ".shellescape(sname)." ".shellescape(s:autoinstall) - let curdir = escape(substitute(getcwd(),'\','/','ge'),"|[]*'\" #") + let curdir = fnameescape(substitute(getcwd(),'\','/','ge')) let installdir= curdir."/Installed" if !isdirectory(installdir) call mkdir(installdir) @@ -549,25 +555,42 @@ " decompress if sname =~ '\.bz2$' " call Decho("decompress: attempt to bunzip2 ".sname) - exe "silent !bunzip2 ".shellescape(sname) + exe "sil !bunzip2 ".shellescape(sname) let sname= substitute(sname,'\.bz2$','','') " call Decho("decompress: new sname<".sname."> after bunzip2") elseif sname =~ '\.gz$' " call Decho("decompress: attempt to gunzip ".sname) - exe "silent !gunzip ".shellescape(sname) + exe "sil !gunzip ".shellescape(sname) let sname= substitute(sname,'\.gz$','','') " call Decho("decompress: new sname<".sname."> after gunzip") + elseif sname =~ '\.xz$' +" call Decho("decompress: attempt to unxz ".sname) + exe "sil !unxz ".shellescape(sname) + let sname= substitute(sname,'\.xz$','','') +" call Decho("decompress: new sname<".sname."> after unxz") else " call Decho("no decompression needed") endif - " distribute archive(.zip, .tar, .vba) contents + " distribute archive(.zip, .tar, .vba, ...) contents if sname =~ '\.zip$' " call Decho("dearchive: attempt to unzip ".sname) exe "silent !unzip -o ".shellescape(sname) elseif sname =~ '\.tar$' " call Decho("dearchive: attempt to untar ".sname) exe "silent !tar -xvf ".shellescape(sname) + elseif sname =~ '\.tgz$' +" call Decho("dearchive: attempt to untar+gunzip ".sname) + exe "silent !tar -zxvf ".shellescape(sname) + elseif sname =~ '\.taz$' +" call Decho("dearchive: attempt to untar+uncompress ".sname) + exe "silent !tar -Zxvf ".shellescape(sname) + elseif sname =~ '\.tbz$' +" call Decho("dearchive: attempt to untar+bunzip2 ".sname) + exe "silent !tar -jxvf ".shellescape(sname) + elseif sname =~ '\.txz$' +" call Decho("dearchive: attempt to untar+xz ".sname) + exe "silent !tar -Jxvf ".shellescape(sname) elseif sname =~ '\.vba$' " call Decho("dearchive: attempt to handle a vimball: ".sname) silent 1split diff -Naur vim73.orig/runtime/autoload/htmlcomplete.vim vim73/runtime/autoload/htmlcomplete.vim --- vim73.orig/runtime/autoload/htmlcomplete.vim 2010-05-15 11:03:31.000000000 +0000 +++ vim73/runtime/autoload/htmlcomplete.vim 2013-06-07 17:07:06.638989715 +0000 @@ -1,7 +1,7 @@ " Vim completion script " Language: HTML and XHTML " Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl ) -" Last Change: 2006 Oct 19 +" Last Change: 2011 Apr 28 function! htmlcomplete#CompleteTags(findstart, base) if a:findstart @@ -285,6 +285,7 @@ let cssfiles = styletable + secimportfiles let classes = [] for file in cssfiles + let classlines = [] if filereadable(file) let stylesheet = readfile(file) let stylefile = join(stylesheet, ' ') diff -Naur vim73.orig/runtime/autoload/netrw.vim vim73/runtime/autoload/netrw.vim --- vim73.orig/runtime/autoload/netrw.vim 2010-07-27 14:55:00.000000000 +0000 +++ vim73/runtime/autoload/netrw.vim 2013-06-07 17:07:06.742322753 +0000 @@ -1,10 +1,10 @@ " netrw.vim: Handles file transfer and remote directory listing across " AUTOLOAD SECTION -" Date: Jul 27, 2010 -" Version: 140 -" Maintainer: Charles E Campbell, Jr +" Date: May 18, 2013 +" Version: 149 +" Maintainer: Charles E Campbell " GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim -" Copyright: Copyright (C) 1999-2010 Charles E. Campbell, Jr. {{{1 +" Copyright: Copyright (C) 1999-2012 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright " notice is copied with it. Like anything else that's free, @@ -22,10 +22,10 @@ if &cp || exists("g:loaded_netrw") finish endif -let g:loaded_netrw = "v140" -if v:version < 702 +let g:loaded_netrw = "v149" +if v:version < 703 || (v:version == 703 && !has("patch465")) echohl WarningMsg - echo "***warning*** this version of netrw needs vim 7.2" + echo "***warning*** this version of netrw needs vim 7.3.465 or later" echohl Normal finish endif @@ -35,14 +35,8 @@ let s:ERROR = 2 endif -" sanity checks -if v:version < 700 - call netrw#ErrorMsg(s:WARNING,"you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw",1) - finish -endif - let s:keepcpo= &cpo -setlocal cpo&vim +set cpo&vim "DechoTabOn "call Decho("doing autoload/netrw.vim version ".g:loaded_netrw) @@ -51,12 +45,95 @@ " ====================== " --------------------------------------------------------------------- +" netrw#ErrorMsg: {{{2 +" 0=note = s:NOTE +" 1=warning = s:WARNING +" 2=error = s:ERROR +" May 01, 2013 : max errnum currently is 93 +fun! netrw#ErrorMsg(level,msg,errnum) +" call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow) + + if a:level < g:netrw_errorlvl +" call Dret("netrw#ErrorMsg : suppressing level=".a:level." since g:netrw_errorlvl=".g:netrw_errorlvl) + return + endif + + if a:level == 1 + let level= "**warning** (netrw) " + elseif a:level == 2 + let level= "**error** (netrw) " + else + let level= "**note** (netrw) " + endif +" call Decho("level=".level) + + if g:netrw_use_errorwindow + " (default) netrw creates a one-line window to show error/warning + " messages (reliably displayed) + + " record current window number for NetrwRestorePosn()'s benefit + let s:winBeforeErr= winnr() +" call Decho("s:winBeforeErr=".s:winBeforeErr) + + " getting messages out reliably is just plain difficult! + " This attempt splits the current window, creating a one line window. + if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0 +" call Decho("write to NetrwMessage buffer") + exe bufwinnr("NetrwMessage")."wincmd w" +" call Decho("setl ma noro") + setl ma noro + keepj call setline(line("$")+1,level.a:msg) + keepj $ + else +" call Decho("create a NetrwMessage buffer window") + bo 1split + sil! call s:NetrwEnew() + sil! keepj call s:NetrwSafeOptions() + setl bt=nofile + keepj file NetrwMessage +" call Decho("setl ma noro") + setl ma noro + call setline(line("$"),level.a:msg) + endif +" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr()) + if &fo !~ '[ta]' + syn clear + syn match netrwMesgNote "^\*\*note\*\*" + syn match netrwMesgWarning "^\*\*warning\*\*" + syn match netrwMesgError "^\*\*error\*\*" + hi link netrwMesgWarning WarningMsg + hi link netrwMesgError Error + endif +" call Decho("(ErrorMsg) setl noma ro bh=wipe") + setl noma ro bh=wipe + + else + " (optional) netrw will show messages using echomsg. Even if the + " message doesn't appear, at least it'll be recallable via :messages +" redraw! + if a:level == s:WARNING + echohl WarningMsg + elseif a:level == s:ERROR + echohl Error + endif + echomsg level.a:msg +" call Decho("echomsg ***netrw*** ".a:msg) + echohl None + endif + +" call Dret("netrw#ErrorMsg") +endfun + +" --------------------------------------------------------------------- " NetrwInit: initializes variables if they haven't been defined {{{2 " Loosely, varname = value. fun s:NetrwInit(varname,value) +" call Decho("varname<".a:varname."> value=".a:value) if !exists(a:varname) if type(a:value) == 0 exe "let ".a:varname."=".a:value + elseif type(a:value) == 1 && a:value =~ '^[{[]' + exe "let ".a:varname."=".a:value elseif type(a:value) == 1 exe "let ".a:varname."="."'".a:value."'" else @@ -78,6 +155,8 @@ " --------------------------------------------------------------------- " Default values for netrw's global protocol variables {{{2 +call s:NetrwInit("g:netrw_use_errorwindow",1) + if !exists("g:netrw_dav_cmd") if executable("cadaver") let g:netrw_dav_cmd = "cadaver" @@ -97,6 +176,10 @@ if !exists("g:netrw_ftp_cmd") let g:netrw_ftp_cmd = "ftp" endif +let s:netrw_ftp_cmd= g:netrw_ftp_cmd +if !exists("g:netrw_ftp_options") + let g:netrw_ftp_options= "-i -n" +endif if !exists("g:netrw_http_cmd") if executable("elinks") let g:netrw_http_cmd = "elinks" @@ -119,7 +202,20 @@ endif call s:NetrwInit("g:netrw_rcp_cmd" , "rcp") call s:NetrwInit("g:netrw_rsync_cmd", "rsync") -call s:NetrwInit("g:netrw_scp_cmd" , "scp -q") +if !exists("g:netrw_scp_cmd") + if executable("scp") + call s:NetrwInit("g:netrw_scp_cmd" , "scp -q") + elseif executable("pscp") + if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable('c:\private.ppk') + call s:NetrwInit("g:netrw_scp_cmd", 'pscp -i c:\private.ppk') + else + call s:NetrwInit("g:netrw_scp_cmd", 'pscp -q') + endif + else + call s:NetrwInit("g:netrw_scp_cmd" , "scp -q") + endif +endif + call s:NetrwInit("g:netrw_sftp_cmd" , "sftp") call s:NetrwInit("g:netrw_ssh_cmd" , "ssh") @@ -139,7 +235,7 @@ " Cygwin Detection ------- {{{3 if !exists("g:netrw_cygwin") if has("win32") || has("win95") || has("win64") || has("win16") - if &shell =~ '\%(\\|\\)\%(\.exe\)\=$' + if has("win32unix") && &shell =~ '\%(\\|\\)\%(\.exe\)\=$' let g:netrw_cygwin= 1 else let g:netrw_cygwin= 0 @@ -157,15 +253,19 @@ call s:NetrwInit("g:netrw_chgwin" , -1) call s:NetrwInit("g:netrw_compress" , "gzip") call s:NetrwInit("g:netrw_ctags" , "ctags") -if !exists("g:netrw_cursorline") - let g:netrw_cursorline= 1 - let s:netrw_usercul = &cursorline - let s:netrw_usercuc = &cursorcolumn +if exists("g:netrw_cursorline") && !exists("g:netrw_cursor") + call netrw#ErrorMsg(s:NOTE,'g:netrw_cursorline is deprecated; use g:netrw_cursor instead',77) + let g:netrw_cursor= g:netrw_cursorline endif +call s:NetrwInit("g:netrw_cursor" , 2) +let s:netrw_usercul = &cursorline +let s:netrw_usercuc = &cursorcolumn " Default values - d-g ---------- {{{3 +call s:NetrwInit("s:didstarstar",0) call s:NetrwInit("g:netrw_dirhist_cnt" , 0) call s:NetrwInit("g:netrw_decompress" , '{ ".gz" : "gunzip", ".bz2" : "bunzip2", ".zip" : "unzip", ".tar" : "tar -xf", ".xz" : "unxz" }') call s:NetrwInit("g:netrw_dirhistmax" , 10) +call s:NetrwInit("g:netrw_errorlvl" , s:NOTE) call s:NetrwInit("g:netrw_fastbrowse" , 1) call s:NetrwInit("g:netrw_ftp_browse_reject", '^total\s\+\d\+$\|^Trying\s\+\d\+.*$\|^KERBEROS_V\d rejected\|^Security extensions not\|No such file\|: connect to address [0-9a-fA-F:]*: No route to host$') if !exists("g:netrw_ftp_list_cmd") @@ -191,28 +291,39 @@ endif call s:NetrwInit("g:netrw_keepdir",1) if !exists("g:netrw_list_cmd") + if g:netrw_scp_cmd =~ '^pscp' && executable("pscp") - " provide a 'pscp' listing command if (has("win32") || has("win95") || has("win64") || has("win16")) && filereadable("c:\\private.ppk") + " provide a pscp-based listing command let g:netrw_scp_cmd ="pscp -i C:\\private.ppk" endif let g:netrw_list_cmd= g:netrw_scp_cmd." -ls USEPORT HOSTNAME:" + elseif executable(g:netrw_ssh_cmd) - " provide a default listing command + " provide a scp-based default listing command let g:netrw_list_cmd= g:netrw_ssh_cmd." USEPORT HOSTNAME ls -FLa" + else " call Decho(g:netrw_ssh_cmd." is not executable") let g:netrw_list_cmd= "" endif + endif call s:NetrwInit("g:netrw_list_hide","") " Default values - lh-lz ---------- {{{3 +if exists("g:netrw_local_copycmd") + let g:netrw_localcopycmd= g:netrw_local_copycmd + call netrw#ErrorMsg(s:NOTE,"g:netrw_local_copycmd is deprecated in favor of g:netrw_localcopycmd",84) +endif +if !exists("g:netrw_localcmdshell") + let g:netrw_localcmdshell= "" +endif if !exists("g:netrw_localcopycmd") if has("win32") || has("win95") || has("win64") || has("win16") if g:netrw_cygwin let g:netrw_localcopycmd= "cp" else - let g:netrw_localcopycmd= "copy" + let g:netrw_localcopycmd= "cmd /c copy" endif elseif has("unix") || has("macunix") let g:netrw_localcopycmd= "cp" @@ -220,13 +331,22 @@ let g:netrw_localcopycmd= "" endif endif -call s:NetrwInit("g:netrw_local_mkdir","mkdir") +if exists("g:netrw_local_mkdir") + let g:netrw_localmkdir= g:netrw_local_mkdir + call netrw#ErrorMsg(s:NOTE,"g:netrw_local_mkdir is deprecated in favor of g:netrw_localmkdir",87) +endif +call s:NetrwInit("g:netrw_localmkdir","mkdir") +call s:NetrwInit("g:netrw_remote_mkdir","mkdir") +if exists("g:netrw_local_movecmd") + let g:netrw_localmovecmd= g:netrw_local_movecmd + call netrw#ErrorMsg(s:NOTE,"g:netrw_local_movecmd is deprecated in favor of g:netrw_localmovecmd",88) +endif if !exists("g:netrw_localmovecmd") if has("win32") || has("win95") || has("win64") || has("win16") if g:netrw_cygwin let g:netrw_localmovecmd= "mv" else - let g:netrw_localmovecmd= "move" + let g:netrw_localmovecmd= "cmd /c move" endif elseif has("unix") || has("macunix") let g:netrw_localmovecmd= "mv" @@ -234,7 +354,11 @@ let g:netrw_localmovecmd= "" endif endif -call s:NetrwInit("g:netrw_local_rmdir", "rmdir") +call s:NetrwInit("g:netrw_localrmdir", "rmdir") +if exists("g:netrw_local_rmdir") + let g:netrw_localrmdir= g:netrw_local_rmdir + call netrw#ErrorMsg(s:NOTE,"g:netrw_local_rmdir is deprecated in favor of g:netrw_localrmdir",86) +endif call s:NetrwInit("g:netrw_liststyle" , s:THINLIST) " sanity checks if g:netrw_liststyle < 0 || g:netrw_liststyle >= s:MAXLIST @@ -248,7 +372,7 @@ call s:NetrwInit("g:netrw_maxfilenamelen", 32) call s:NetrwInit("g:netrw_menu" , 1) call s:NetrwInit("g:netrw_mkdir_cmd" , g:netrw_ssh_cmd." USEPORT HOSTNAME mkdir") -call s:NetrwInit("g:netrw_mousemaps" , (exists("&mouse") && &mouse =~ '[anh]')) +call s:NetrwInit("g:netrw_mousemaps" , (exists("+mouse") && &mouse =~ '[anh]')) call s:NetrwInit("g:netrw_retmap" , 0) if has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin) call s:NetrwInit("g:netrw_chgperm" , "chmod PERM FILENAME") @@ -267,13 +391,13 @@ " Default values - s ---------- {{{3 " g:netrw_sepchr: picking a character that doesn't appear in filenames that can be used to separate priority from filename call s:NetrwInit("g:netrw_sepchr" , (&enc == "euc-jp")? "\" : "\") -call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "silent keepj " : "keepj ") +call s:NetrwInit("s:netrw_silentxfer" , (exists("g:netrw_silent") && g:netrw_silent != 0)? "sil keepj " : "keepj ") call s:NetrwInit("g:netrw_sort_by" , "name") " alternatives: date , size call s:NetrwInit("g:netrw_sort_options" , "") call s:NetrwInit("g:netrw_sort_direction", "normal") " alternative: reverse (z y x ...) if !exists("g:netrw_sort_sequence") if has("unix") - let g:netrw_sort_sequence= '[\/]$,\,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$' + let g:netrw_sort_sequence= '[\/]$,\,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$' else let g:netrw_sort_sequence= '[\/]$,\.h$,\.c$,\.cpp$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$' endif @@ -283,20 +407,31 @@ call s:NetrwInit("g:netrw_use_noswf" , 0) " Default values - t-w ---------- {{{3 call s:NetrwInit("g:netrw_timefmt","%c") -call s:NetrwInit("g:netrw_xstrlen",0) +if !exists("g:netrw_xstrlen") + if exists("g:Align_xstrlen") + let g:netrw_xstrlen= g:Align_xstrlen + elseif exists("g:drawit_xstrlen") + let g:netrw_xstrlen= g:drawit_xstrlen + elseif &enc == "latin1" || !has("multi_byte") + let g:netrw_xstrlen= 0 + else + let g:netrw_xstrlen= 1 + endif +endif call s:NetrwInit("g:NetrwTopLvlMenu","Netrw.") -call s:NetrwInit("g:netrw_use_errorwindow",1) call s:NetrwInit("g:netrw_win95ftp",1) -call s:NetrwInit("g:netrw_winsize",25) +call s:NetrwInit("g:netrw_winsize",50) +if g:netrw_winsize == 0|let g:netrw_winsize= -1|endif +if g:netrw_winsize > 100|let g:netrw_winsize= 100|endif " --------------------------------------------------------------------- " Default values for netrw's script variables: {{{2 call s:NetrwInit("g:netrw_fname_escape",' ?&;%') if has("win32") || has("win95") || has("win64") || has("win16") - call s:NetrwInit("g:netrw_glob_escape",'[]*?`{$') + call s:NetrwInit("g:netrw_glob_escape",'*?`{[]$') else - call s:NetrwInit("g:netrw_glob_escape",'[]*?`{~$\') + call s:NetrwInit("g:netrw_glob_escape",'*[]?`{~$\') endif -call s:NetrwInit("g:netrw_menu_escape",'./&? \') +call s:NetrwInit("g:netrw_menu_escape",'.&? \') call s:NetrwInit("g:netrw_tmpfile_escape",' &;') call s:NetrwInit("s:netrw_map_escape","<|\n\r\\\\"") @@ -305,84 +440,152 @@ " files read by network transfer aren't appropriately highlighted. "let g:decho_bufenter = 1 "Decho +" ====================== +" Netrw Initialization: {{{1 +" ====================== +if v:version >= 700 && has("balloon_eval") && !exists("s:initbeval") && !exists("g:netrw_nobeval") && has("syntax") && exists("g:syntax_on") + let s:initbeval = &beval +" let s:initbexpr = &l:bexpr + let &l:bexpr = "netrw#NetrwBalloonHelp()" + set beval + au BufWinEnter,WinEnter * if &ft == "netrw"|set beval|else|let &beval= s:initbeval|endif +endif +au WinEnter * if &ft == "netrw"|call s:NetrwInsureWinVars()|endif + " ============================== " Netrw Utility Functions: {{{1 " ============================== +" --------------------------------------------------------------------- +" netrw#NetrwBalloonHelp: {{{2 +if v:version >= 700 && has("balloon_eval") && &beval == 1 && has("syntax") && exists("g:syntax_on") + fun! netrw#NetrwBalloonHelp() + if !exists("w:netrw_bannercnt") || v:beval_lnum >= w:netrw_bannercnt || (exists("g:netrw_nobeval") && g:netrw_nobeval) + let mesg= "" + elseif v:beval_text == "Netrw" || v:beval_text == "Directory" || v:beval_text == "Listing" + let mesg = "i: thin-long-wide-tree gh: quick hide/unhide of dot-files qf: quick file info %:open new file" + elseif getline(v:beval_lnum) =~ '^"\s*/' + let mesg = ": edit/enter o: edit/enter in horiz window t: edit/enter in new tab v:edit/enter in vert window" + elseif v:beval_text == "Sorted" || v:beval_text == "by" + let mesg = 's: sort by name, time, or file size r: reverse sorting order mt: mark target' + elseif v:beval_text == "Sort" || v:beval_text == "sequence" + let mesg = "S: edit sorting sequence" + elseif v:beval_text == "Hiding" || v:beval_text == "Showing" + let mesg = "a: hiding-showing-all ctrl-h: editing hiding list mh: hide/show by suffix" + elseif v:beval_text == "Quick" || v:beval_text == "Help" + let mesg = "Help: press " + elseif v:beval_text == "Copy/Move" || v:beval_text == "Tgt" + let mesg = "mt: mark target mc: copy marked file to target mm: move marked file to target" + else + let mesg= "" + endif + return mesg + endfun +endif + " ------------------------------------------------------------------------ -" s:NetrwOptionSave: save options and set to "standard" form {{{2 +" s:NetrwOptionSave: save options prior to setting to "netrw-buffer-standard" form {{{2 " 06/08/07 : removed call to NetrwSafeOptions(), either placed " immediately after NetrwOptionSave() calls in NetRead " and NetWrite, or after the s:NetrwEnew() call in " NetrwBrowse. " vt: normally its "w:" or "s:" (a variable type) fun! s:NetrwOptionSave(vt) -" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$")) - +" call Dfunc("s:NetrwOptionSave(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%")).">"." winnr($)=".winnr("$")." mod=".&mod." ma=".&ma) " call Decho(a:vt."netrw_optionsave".(exists("{a:vt}netrw_optionsave")? ("=".{a:vt}netrw_optionsave) : " doesn't exist")) + if !exists("{a:vt}netrw_optionsave") let {a:vt}netrw_optionsave= 1 else " call Dret("s:NetrwOptionSave : options already saved") return endif -" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")." diff=".&l:diff) +" call Decho("fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." diff=".&l:diff) " Save current settings and current directory +" call Decho("saving current settings and current directory") let s:yykeep = @@ - if exists("&l:acd") - let {a:vt}netrw_acdkeep = &l:acd - endif + if exists("&l:acd")|let {a:vt}netrw_acdkeep = &l:acd|endif let {a:vt}netrw_aikeep = &l:ai let {a:vt}netrw_awkeep = &l:aw + let {a:vt}netrw_bhkeep = &l:bh + let {a:vt}netrw_blkeep = &l:bl + let {a:vt}netrw_btkeep = &l:bt let {a:vt}netrw_bombkeep = &l:bomb + let {a:vt}netrw_cedit = &cedit let {a:vt}netrw_cikeep = &l:ci let {a:vt}netrw_cinkeep = &l:cin let {a:vt}netrw_cinokeep = &l:cino let {a:vt}netrw_comkeep = &l:com let {a:vt}netrw_cpokeep = &l:cpo let {a:vt}netrw_diffkeep = &l:diff - if g:netrw_keepdir - let {a:vt}netrw_dirkeep = getcwd() - endif + let {a:vt}netrw_fenkeep = &l:fen + let {a:vt}netrw_ffkeep = &l:ff let {a:vt}netrw_fokeep = &l:fo " formatoptions let {a:vt}netrw_gdkeep = &l:gd " gdefault let {a:vt}netrw_hidkeep = &l:hidden let {a:vt}netrw_imkeep = &l:im + let {a:vt}netrw_iskkeep = &l:isk + let {a:vt}netrw_lskeep = &l:ls + let {a:vt}netrw_makeep = &l:ma let {a:vt}netrw_magickeep = &l:magic + let {a:vt}netrw_modkeep = &l:mod + let {a:vt}netrw_nukeep = &l:nu let {a:vt}netrw_repkeep = &l:report + let {a:vt}netrw_rokeep = &l:ro let {a:vt}netrw_selkeep = &l:sel let {a:vt}netrw_spellkeep = &l:spell + let {a:vt}netrw_tskeep = &l:ts let {a:vt}netrw_twkeep = &l:tw " textwidth let {a:vt}netrw_wigkeep = &l:wig " wildignore + let {a:vt}netrw_wrapkeep = &l:wrap + let {a:vt}netrw_writekeep = &l:write + if g:netrw_use_noswf && has("win32") && !has("win95") + let {a:vt}netrw_swfkeep = &l:swf + endif + + " save a few selected netrw-related variables +" call Decho("saving a few selected netrw-related variables") + if g:netrw_keepdir + let {a:vt}netrw_dirkeep = getcwd() + endif if has("win32") && !has("win95") let {a:vt}netrw_swfkeep = &l:swf " swapfile endif - if &go =~ 'a' | silent! let {a:vt}netrw_regstar = @* | endif - silent! let {a:vt}netrw_regslash= @/ + if &go =~# 'a' | sil! let {a:vt}netrw_regstar = @* | endif + sil! let {a:vt}netrw_regslash= @/ -" call Dret("s:NetrwOptionSave : win#".winnr()." buf#".bufnr("%")) +" call Dret("s:NetrwOptionSave : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly) endfun " ------------------------------------------------------------------------ " s:NetrwOptionRestore: restore options {{{2 fun! s:NetrwOptionRestore(vt) -" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")." winnr($)=".winnr("$")) +" call Dfunc("s:NetrwOptionRestore(vt<".a:vt.">) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$")) if !exists("{a:vt}netrw_optionsave") -" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) + if exists("s:nbcd_curpos_{bufnr('%')}") +" call Decho("(NetrwOptionRestore) restoring previous position (s:nbcd_curpos_".bufnr('%')." exists)") + keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')}) +" call Decho("(NetrwOptionRestore) win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> winnr($)=".winnr("$")) +" call Decho("(NetrwOptionRestore) unlet s:nbcd_curpos_".bufnr('%')) + unlet s:nbcd_curpos_{bufnr('%')} + else +" call Decho("(NetrwOptionRestore) no previous position") + endif +" call Decho("(NetrwOptionRestore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") " call Dret("s:NetrwOptionRestore : ".a:vt."netrw_optionsave doesn't exist") return endif unlet {a:vt}netrw_optionsave - if exists("&acd") + if exists("+acd") if exists("{a:vt}netrw_acdkeep") -" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) +" call Decho("(NetrwOptionRestore) g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) let curdir = getcwd() let &l:acd = {a:vt}netrw_acdkeep unlet {a:vt}netrw_acdkeep if &l:acd -" call Decho("exe keepjumps lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason +" call Decho("exe keepj lcd ".fnameescape(curdir)) " NOTE: was g:netrw_fname_escape for some reason try if !exists("&l:acd") && !&l:acd exe 'keepj lcd '.fnameescape(curdir) @@ -395,27 +598,41 @@ endif if exists("{a:vt}netrw_aikeep") |let &l:ai = {a:vt}netrw_aikeep |unlet {a:vt}netrw_aikeep |endif if exists("{a:vt}netrw_awkeep") |let &l:aw = {a:vt}netrw_awkeep |unlet {a:vt}netrw_awkeep |endif + if g:netrw_liststyle != s:TREELIST + if exists("{a:vt}netrw_bhkeep") |let &l:bh = {a:vt}netrw_bhkeep |unlet {a:vt}netrw_bhkeep |endif + endif + if exists("{a:vt}netrw_blkeep") |let &l:bl = {a:vt}netrw_blkeep |unlet {a:vt}netrw_blkeep |endif + if exists("{a:vt}netrw_btkeep") |let &l:bt = {a:vt}netrw_btkeep |unlet {a:vt}netrw_btkeep |endif if exists("{a:vt}netrw_bombkeep") |let &l:bomb = {a:vt}netrw_bombkeep |unlet {a:vt}netrw_bombkeep |endif + if exists("{a:vt}netrw_cedit") |let &cedit = {a:vt}netrw_cedit |unlet {a:vt}netrw_cedit |endif if exists("{a:vt}netrw_cikeep") |let &l:ci = {a:vt}netrw_cikeep |unlet {a:vt}netrw_cikeep |endif if exists("{a:vt}netrw_cinkeep") |let &l:cin = {a:vt}netrw_cinkeep |unlet {a:vt}netrw_cinkeep |endif if exists("{a:vt}netrw_cinokeep") |let &l:cino = {a:vt}netrw_cinokeep |unlet {a:vt}netrw_cinokeep |endif if exists("{a:vt}netrw_comkeep") |let &l:com = {a:vt}netrw_comkeep |unlet {a:vt}netrw_comkeep |endif if exists("{a:vt}netrw_cpokeep") |let &l:cpo = {a:vt}netrw_cpokeep |unlet {a:vt}netrw_cpokeep |endif if exists("{a:vt}netrw_diffkeep") |let &l:diff = {a:vt}netrw_diffkeep |unlet {a:vt}netrw_diffkeep |endif - if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir - let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g') - if exists("{a:vt}netrw_dirkeep") |exe "keepjumps lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif - endif + if exists("{a:vt}netrw_fenkeep") |let &l:fen = {a:vt}netrw_fenkeep |unlet {a:vt}netrw_fenkeep |endif + if exists("{a:vt}netrw_ffkeep") |let &l:ff = {a:vt}netrw_ffkeep |unlet {a:vt}netrw_ffkeep |endif if exists("{a:vt}netrw_fokeep") |let &l:fo = {a:vt}netrw_fokeep |unlet {a:vt}netrw_fokeep |endif if exists("{a:vt}netrw_gdkeep") |let &l:gd = {a:vt}netrw_gdkeep |unlet {a:vt}netrw_gdkeep |endif if exists("{a:vt}netrw_hidkeep") |let &l:hidden = {a:vt}netrw_hidkeep |unlet {a:vt}netrw_hidkeep |endif if exists("{a:vt}netrw_imkeep") |let &l:im = {a:vt}netrw_imkeep |unlet {a:vt}netrw_imkeep |endif - if exists("{a:vt}netrw_magic") |let &l:magic = {a:vt}netrw_magic |unlet {a:vt}netrw_magic |endif + if exists("{a:vt}netrw_iskkeep") |let &l:isk = {a:vt}netrw_iskkeep |unlet {a:vt}netrw_iskkeep |endif + if exists("{a:vt}netrw_lskeep") |let &l:ls = {a:vt}netrw_lskeep |unlet {a:vt}netrw_lskeep |endif + if exists("{a:vt}netrw_makeep") |let &l:ma = {a:vt}netrw_makeep |unlet {a:vt}netrw_makeep |endif + if exists("{a:vt}netrw_magickeep")|let &l:magic = {a:vt}netrw_magickeep |unlet {a:vt}netrw_magickeep|endif + if exists("{a:vt}netrw_modkeep") |let &l:mod = {a:vt}netrw_modkeep |unlet {a:vt}netrw_modkeep |endif + if exists("{a:vt}netrw_nukeep") |let &l:nu = {a:vt}netrw_nukeep |unlet {a:vt}netrw_nukeep |endif if exists("{a:vt}netrw_repkeep") |let &l:report = {a:vt}netrw_repkeep |unlet {a:vt}netrw_repkeep |endif + if exists("{a:vt}netrw_rokeep") |let &l:ro = {a:vt}netrw_rokeep |unlet {a:vt}netrw_rokeep |endif if exists("{a:vt}netrw_selkeep") |let &l:sel = {a:vt}netrw_selkeep |unlet {a:vt}netrw_selkeep |endif if exists("{a:vt}netrw_spellkeep")|let &l:spell = {a:vt}netrw_spellkeep |unlet {a:vt}netrw_spellkeep|endif + " Problem: start with liststyle=0; press : result, following line resets l:ts. +" if exists("{a:vt}netrw_tskeep") |let &l:ts = {a:vt}netrw_tskeep |unlet {a:vt}netrw_tskeep |endif if exists("{a:vt}netrw_twkeep") |let &l:tw = {a:vt}netrw_twkeep |unlet {a:vt}netrw_twkeep |endif if exists("{a:vt}netrw_wigkeep") |let &l:wig = {a:vt}netrw_wigkeep |unlet {a:vt}netrw_wigkeep |endif + if exists("{a:vt}netrw_wrapkeep") |let &l:wrap = {a:vt}netrw_wrapkeep |unlet {a:vt}netrw_wrapkeep |endif + if exists("{a:vt}netrw_writekeep")|let &l:write = {a:vt}netrw_writekeep |unlet {a:vt}netrw_writekeep|endif if exists("s:yykeep") |let @@ = s:yykeep |unlet s:yykeep |endif if exists("{a:vt}netrw_swfkeep") if &directory == "" @@ -423,3512 +640,4201 @@ " netrw will temporarily set the swapfile directory " to the current directory as returned by getcwd(). let &l:directory = getcwd() - silent! let &l:swf = {a:vt}netrw_swfkeep - setlocal directory= + sil! let &l:swf = {a:vt}netrw_swfkeep + setl directory= unlet {a:vt}netrw_swfkeep elseif &l:swf != {a:vt}netrw_swfkeep " following line causes a Press ENTER in windows -- can't seem to work around it!!! - silent! let &l:swf= {a:vt}netrw_swfkeep + sil! let &l:swf= {a:vt}netrw_swfkeep unlet {a:vt}netrw_swfkeep endif endif - if exists("{a:vt}netrw_regstar") |silent! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif - if exists("{a:vt}netrw_regslash")|silent! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif + if exists("{a:vt}netrw_dirkeep") && isdirectory({a:vt}netrw_dirkeep) && g:netrw_keepdir + let dirkeep = substitute({a:vt}netrw_dirkeep,'\\','/','g') + if exists("{a:vt}netrw_dirkeep") |exe "keepj lcd ".fnameescape(dirkeep)|unlet {a:vt}netrw_dirkeep |endif + endif + if exists("{a:vt}netrw_regstar") |sil! let @*= {a:vt}netrw_regstar |unlet {a:vt}netrw_regstar |endif + if exists("{a:vt}netrw_regslash")|sil! let @/= {a:vt}netrw_regslash|unlet {a:vt}netrw_regslash|endif + if exists("s:nbcd_curpos_{bufnr('%')}") +" call Decho("(NetrwOptionRestore) restoring previous position (s:nbcd_curpos_".bufnr('%')." exists)") + keepj call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')}) +" call Decho("(NetrwOptionRestore) unlet s:nbcd_curpos_".bufnr('%')) + unlet s:nbcd_curpos_{bufnr('%')} + else +" call Decho("no previous position") + endif -" call Decho("g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) -" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")) -" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) -" call Decho("diff=".&l:diff." win#".winnr()." w:netrw_diffkeep=".(exists("w:netrw_diffkeep")? w:netrw_diffkeep : "doesn't exist")) -" call Dret("s:NetrwOptionRestore : win#".winnr()." buf#".bufnr("%")) +" call Decho("(NetrwOptionRestore) g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) +" call Decho("(NetrwOptionRestore) fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")) +" call Decho("(NetrwOptionRestore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") +" call Decho("(NetrwOptionRestore) diff=".&l:diff." win#".winnr()." w:netrw_diffkeep=".(exists("w:netrw_diffkeep")? w:netrw_diffkeep : "doesn't exist")) +" call Decho("(NetrwOptionRestore) ts=".&l:ts) + " Moved the filetype detect here from NetrwGetFile() because remote files + " were having their filetype detect-generated settings overwritten by + " NetrwOptionRestore. + if &ft != "netrw" +" call Decho("(NetrwOptionRestore) filetype detect (ft=".&ft.")") + filetype detect + endif +" call Dret("s:NetrwOptionRestore : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly) endfun " --------------------------------------------------------------------- " s:NetrwSafeOptions: sets options to help netrw do its job {{{2 +" Use s:NetrwSaveOptions() to save user settings +" Use s:NetrwOptionRestore() to restore user settings fun! s:NetrwSafeOptions() " call Dfunc("s:NetrwSafeOptions() win#".winnr()." buf#".bufnr("%")."<".bufname(bufnr("%"))."> winnr($)=".winnr("$")) " call Decho("win#".winnr()."'s ft=".&ft) - setlocal cino= - setlocal com= - setlocal cpo-=aA - if exists("&acd") | setlocal noacd | endif - setlocal nocin noai nobomb noci magic nospell nohid wig= noaw noim - setlocal fo=nroql2 - setlocal tw=0 - setlocal report=10000 - setlocal isk+=@ isk+=* isk+=/ - setlocal sel=inclusive + if exists("+acd") | setl noacd | endif + setl noai + setl noaw + setl nobomb + setl noci + setl nocin + if g:netrw_liststyle == s:TREELIST + setl bh=hide + endif + setl cino= + setl com= + setl cpo-=a + setl cpo-=A + setl fo=nroql2 + setl nohid + setl noim + setl isk+=@ isk+=* isk+=/ + setl magic + setl report=10000 + setl sel=inclusive + setl nospell + setl tw=0 + setl wig= + set cedit& if g:netrw_use_noswf && has("win32") && !has("win95") - setlocal noswf + setl noswf endif - call s:NetrwCursorline() + call s:NetrwCursor() " allow the user to override safe options " call Decho("ft<".&ft."> ei=".&ei) if &ft == "netrw" -" call Decho("do any netrw FileType autocmds") - silent keepalt keepjumps doau FileType netrw +" call Decho("do any netrw FileType autocmds (doau FileType netrw)") + sil! keepalt keepj doau FileType netrw endif -" call Decho("fo=".&fo.(exists("&acd")? " acd=".&acd : " acd doesn't exist")) +" call Decho("fo=".&fo.(exists("+acd")? " acd=".&acd : " acd doesn't exist")." bh=".&l:bh) " call Dret("s:NetrwSafeOptions") endfun " --------------------------------------------------------------------- -" netrw#NetrwClean: remove netrw {{{2 -" supports :NetrwClean -- remove netrw from first directory on runtimepath -" :NetrwClean! -- remove netrw from all directories on runtimepath -fun! netrw#NetrwClean(sys) -" call Dfunc("netrw#NetrwClean(sys=".a:sys.")") - - if a:sys - let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No") - else - let choice= confirm("Remove personal copy of netrw?","&Yes\n&No") - endif -" call Decho("choice=".choice) - let diddel= 0 - let diddir= "" - - if choice == 1 - for dir in split(&rtp,',') - if filereadable(dir."/plugin/netrwPlugin.vim") -" call Decho("removing netrw-related files from ".dir) - if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif - if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif - if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif - if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif - if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif - if s:NetrwDelete(dir."/syntax/netrwlist.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrwlist.vim",55) |endif - let diddir= dir - let diddel= diddel + 1 - if !a:sys|break|endif - endif - endfor +" netrw#Explore: launch the local browser in the directory of the current file {{{2 +" indx: == -1: Nexplore +" == -2: Pexplore +" == +: this is overloaded: +" * If Nexplore/Pexplore is in use, then this refers to the +" indx'th item in the w:netrw_explore_list[] of items which +" matched the */pattern **/pattern *//pattern **//pattern +" * If Hexplore or Vexplore, then this will override +" g:netrw_winsize to specify the qty of rows or columns the +" newly split window should have. +" dosplit==0: the window will be split iff the current file has been modified +" dosplit==1: the window will be split before running the local browser +" style == 0: Explore style == 1: Explore! +" == 2: Hexplore style == 3: Hexplore! +" == 4: Vexplore style == 5: Vexplore! +" == 6: Texplore +fun! netrw#Explore(indx,dosplit,style,...) +" call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified." modifiable=".&modifiable." a:0=".a:0." win#".winnr()." buf#".bufnr("%")) + if !exists("b:netrw_curdir") + let b:netrw_curdir= getcwd() + if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16")) + let b:netrw_curdir= substitute(b:netrw_curdir,'\','/','g') + endif +" call Decho("(Explore) set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)") endif - - echohl WarningMsg - if diddel == 0 - echomsg "netrw is either not installed or not removable" - elseif diddel == 1 - echomsg "removed one copy of netrw from <".diddir.">" - else - echomsg "removed ".diddel." copies of netrw" + let curdir = simplify(b:netrw_curdir) + let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e') + if !exists("g:netrw_cygwin") && (has("win32") || has("win95") || has("win64") || has("win16")) + let curdir= substitute(curdir,'\','/','g') endif - echohl None +" call Decho("(Explore) curdir<".curdir."> curfiledir<".curfiledir.">") -" call Dret("netrw#NetrwClean") -endfun + " save registers + sil! let keepregstar = @* + sil! let keepregplus = @+ + sil! let keepregslash= @/ -" --------------------------------------------------------------------- -" netrw#Nread: {{{2 -fun! netrw#Nread(mode,fname) -" call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)") - call netrw#NetrwSavePosn() - call netrw#NetRead(a:mode,a:fname) - call netrw#NetrwRestorePosn() -" call Dret("netrw#Nread") -endfun + " if dosplit or file has been modified + if a:dosplit || &modified || a:style == 6 +" call Decho("(Explore) case dosplit=".a:dosplit." modified=".&modified." a:style=".a:style.": dosplit or file has been modified") + call s:SaveWinVars() + let winsz= g:netrw_winsize + if a:indx > 0 + let winsz= a:indx + endif -" ------------------------------------------------------------------------ -" Netrw Transfer Functions: {{{1 -" =============================== + if a:style == 0 " Explore, Sexplore +" call Decho("(Explore) style=0: Explore or Sexplore") + let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz + exe winsz."wincmd s" -" ------------------------------------------------------------------------ -" netrw#NetRead: responsible for reading a file over the net {{{2 -" mode: =0 read remote file and insert before current line -" =1 read remote file and insert after current line -" =2 replace with remote file -" =3 obtain file, but leave in temporary format -fun! netrw#NetRead(mode,...) -" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw) + elseif a:style == 1 "Explore!, Sexplore! +" call Decho("(Explore) style=1: Explore! or Sexplore!") + let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz + exe "keepalt ".winsz."wincmd v" - " NetRead: save options {{{3 - call s:NetrwOptionSave("w:") - call s:NetrwSafeOptions() - call s:RestoreCursorline() + elseif a:style == 2 " Hexplore +" call Decho("(Explore) style=2: Hexplore") + let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz + exe "keepalt bel ".winsz."wincmd s" - " NetRead: interpret mode into a readcmd {{{3 - if a:mode == 0 " read remote file before current line - let readcmd = "0r" - elseif a:mode == 1 " read file after current line - let readcmd = "r" - elseif a:mode == 2 " replace with remote file - let readcmd = "%r" - elseif a:mode == 3 " skip read of file (leave as temporary) - let readcmd = "t" - else - exe a:mode - let readcmd = "r" - endif - let ichoice = (a:0 == 0)? 0 : 1 -" call Decho("readcmd<".readcmd."> ichoice=".ichoice) + elseif a:style == 3 " Hexplore! +" call Decho("(Explore) style=3: Hexplore!") + let winsz= (winsz > 0)? (winsz*winheight(0))/100 : -winsz + exe "keepalt abo ".winsz."wincmd s" - " NetRead: get temporary filename {{{3 - let tmpfile= s:GetTempfile("") - if tmpfile == "" -" call Dret("netrw#NetRead : unable to get a tempfile!") - return - endif + elseif a:style == 4 " Vexplore +" call Decho("(Explore) style=4: Vexplore") + let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz + exe "keepalt lefta ".winsz."wincmd v" - while ichoice <= a:0 + elseif a:style == 5 " Vexplore! +" call Decho("(Explore) style=5: Vexplore!") + let winsz= (winsz > 0)? (winsz*winwidth(0))/100 : -winsz + exe "keepalt rightb ".winsz."wincmd v" - " attempt to repeat with previous host-file-etc - if exists("b:netrw_lastfile") && a:0 == 0 -" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">") - let choice = b:netrw_lastfile - let ichoice= ichoice + 1 + elseif a:style == 6 " Texplore + call s:SaveBufVars() +" call Decho("(Explore) style = 6: Texplore") + exe "keepalt tabnew ".fnameescape(curdir) + call s:RestoreBufVars() + endif + call s:RestoreWinVars() +" else " Decho +" call Decho("(Explore) case a:dosplit=".a:dosplit." AND modified=".&modified." AND a:style=".a:style." is not 6") + endif + keepj norm! 0 + if a:0 > 0 +" call Decho("(Explore) case [a:0=".a:0."] > 0: a:1<".a:1.">") + if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)) +" call Decho("(Explore) ..case a:1<".a:1.">: starts with ~ and unix or cygwin") + let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),'')) +" call Decho("(Explore) ..using dirname<".dirname."> (case: ~ && unix||cygwin)") + elseif a:1 == '.' +" call Decho("(Explore) ..case a:1<".a:1.">: matches .") + let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd()) + if dirname !~ '/$' + let dirname= dirname."/" + endif +" call Decho("(Explore) ..using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")") + elseif a:1 =~ '\$' +" call Decho("(Explore) ..case a:1<".a:1.">: matches ending $") + let dirname= simplify(expand(a:1)) +" call Decho("(Explore) ..using user-specified dirname<".dirname."> with $env-var") + elseif a:1 !~ '^\*\{1,2}/' && a:1 !~ '^\a\{3,}://' +" call Decho("(Explore) ..case a:1<".a:1.">: other, not pattern or filepattern") + let dirname= simplify(a:1) +" call Decho("(Explore) ..using user-specified dirname<".dirname.">") else - exe "let choice= a:" . ichoice -" call Decho("no lastfile: choice<" . choice . ">") +" call Decho("(Explore) ..case a:1: pattern or filepattern") + let dirname= a:1 + endif + else + " clear explore +" call Decho("(Explore) case a:0=".a:0.": clearing Explore list") + call s:NetrwClearExplore() +" call Dret("netrw#Explore : cleared list") + return + endif - if match(choice,"?") == 0 - " give help - echomsg 'NetRead Usage:' - echomsg ':Nread machine:path uses rcp' - echomsg ':Nread "machine path" uses ftp with <.netrc>' - echomsg ':Nread "machine id password path" uses ftp' - echomsg ':Nread dav://machine[:port]/path uses cadaver' - echomsg ':Nread fetch://machine/path uses fetch' - echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>' - echomsg ':Nread http://[user@]machine/path uses http wget' - echomsg ':Nread rcp://[user@]machine/path uses rcp' - echomsg ':Nread rsync://machine[:port]/path uses rsync' - echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp' - echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp' - sleep 4 - break +" call Decho("(Explore) dirname<".dirname.">") + if dirname =~ '\.\./\=$' + let dirname= simplify(fnamemodify(dirname,':p:h')) + elseif dirname =~ '\.\.' || dirname == '.' + let dirname= simplify(fnamemodify(dirname,':p')) + endif +" call Decho("(Explore) dirname<".dirname."> (after simplify)") - elseif match(choice,'^"') != -1 - " Reconstruct Choice if choice starts with '"' -" call Decho("reconstructing choice") - if match(choice,'"$') != -1 - " case "..." - let choice=strpart(choice,1,strlen(choice)-2) - else - " case "... ... ..." - let choice = strpart(choice,1,strlen(choice)-1) - let wholechoice = "" + if dirname =~ '^\*//' + " starpat=1: Explore *//pattern (current directory only search for files containing pattern) +" call Decho("(Explore) case starpat=1: Explore *//pattern") + let pattern= substitute(dirname,'^\*//\(.*\)$','\1','') + let starpat= 1 +" call Decho("(Explore) ..Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">") + if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif - while match(choice,'"$') == -1 - let wholechoice = wholechoice . " " . choice - let ichoice = ichoice + 1 - if ichoice > a:0 - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3) - endif -" call Dret("netrw#NetRead :2 getcwd<".getcwd().">") - return - endif - let choice= a:{ichoice} - endwhile - let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1) - endif - endif + elseif dirname =~ '^\*\*//' + " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) +" call Decho("(Explore) case starpat=2: Explore **//pattern") + let pattern= substitute(dirname,'^\*\*//','','') + let starpat= 2 +" call Decho("(Explore) ..Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">") + + elseif dirname =~ '/\*\*/' + " handle .../**/.../filepat +" call Decho("(Explore) case starpat=4: Explore .../**/.../filepat") + let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','') + if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16"))) + let b:netrw_curdir = prefixdir + else + let b:netrw_curdir= getcwd().'/'.prefixdir endif + let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','') + let starpat= 4 +" call Decho("(Explore) ..pwd<".getcwd()."> dirname<".dirname.">") +" call Decho("(Explore) ..case Explore ../**/../filepat (starpat=".starpat.")") -" call Decho("choice<" . choice . ">") - let ichoice= ichoice + 1 + elseif dirname =~ '^\*/' + " case starpat=3: Explore */filepat (search in current directory for filenames matching filepat) + let starpat= 3 +" call Decho("(Explore) case starpat=3: Explore */filepat (starpat=".starpat.")") - " NetRead: Determine method of read (ftp, rcp, etc) {{{3 - call s:NetrwMethod(choice) - if !exists("b:netrw_method") || b:netrw_method < 0 -" call Dfunc("netrw#NetRead : unsupported method") - return - endif - let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix + elseif dirname=~ '^\*\*/' + " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) + let starpat= 4 +" call Decho("(Explore) case starpat=4: Explore **/filepat (starpat=".starpat.")") - " Check if NetrwBrowse() should be handling this request -" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">") - if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^http://' -" call Decho("yes, choice matches '^.*[\/]$'") - keepj call s:NetrwBrowse(0,choice) -" call Dret("netrw#NetRead :3 getcwd<".getcwd().">") - return + else + let starpat= 0 +" call Decho("(Explore) case starpat=0: default") + endif + + if starpat == 0 && a:indx >= 0 + " [Explore Hexplore Vexplore Sexplore] [dirname] +" call Decho("(Explore) case starpat==0 && a:indx=".a:indx.": dirname<".dirname.">, handles Explore Hexplore Vexplore Sexplore") + if dirname == "" + let dirname= curfiledir +" call Decho("(Explore) ..empty dirname, using current file's directory<".dirname.">") + endif + if dirname =~ '^scp://' || dirname =~ '^ftp://' + call netrw#Nread(2,dirname) + "call s:NetrwBrowse(0,dirname) + else + if dirname == "" + let dirname= getcwd() + elseif (has("win32") || has("win95") || has("win64") || has("win16")) && !g:netrw_cygwin + if dirname !~ '^[a-zA-Z]:' + let dirname= b:netrw_curdir."/".dirname + endif + elseif dirname !~ '^/' + let dirname= b:netrw_curdir."/".dirname + endif +" call Decho("(Explore) ..calling LocalBrowseCheck(dirname<".dirname.">)") + call netrw#LocalBrowseCheck(dirname) +" call Decho("(Explore) win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly) endif + if exists("w:netrw_bannercnt") + " done to handle P08-Ingelrest. :Explore will _Always_ go to the line just after the banner. + " If one wants to return the same place in the netrw window, use :Rex instead. + exe w:netrw_bannercnt + endif + +" call Decho("(Explore) curdir<".curdir.">") + " --------------------------------------------------------------------- + " Jan 24, 2013: not sure why the following was present. See P08-Ingelrest +" if has("win32") || has("win95") || has("win64") || has("win16") +" keepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW') +" else +" keepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW') +" endif + " --------------------------------------------------------------------- - " ============ - " NetRead: Perform Protocol-Based Read {{{3 - " =========================== - if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 - echo "(netrw) Processing your read request..." + " starpat=1: Explore *//pattern (current directory only search for files containing pattern) + " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) + " starpat=3: Explore */filepat (search in current directory for filenames matching filepat) + " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) + elseif a:indx <= 0 + " Nexplore, Pexplore, Explore: handle starpat +" call Decho("(Explore) case a:indx<=0: Nexplore, Pexplore, , starpat=".starpat." a:indx=".a:indx) + if !mapcheck("","n") && !mapcheck("","n") && exists("b:netrw_curdir") +" call Decho("(Explore) ..set up and maps") + let s:didstarstar= 1 + nnoremap :Pexplore + nnoremap :Nexplore endif - "......................................... - " NetRead: (rcp) NetRead Method #1 {{{3 - if b:netrw_method == 1 " read with rcp -" call Decho("read via rcp (method #1)") - " ER: nothing done with g:netrw_uid yet? - " ER: on Win2K" rcp machine[.user]:file tmpfile - " ER: if machine contains '.' adding .user is required (use $USERNAME) - " ER: the tmpfile is full path: rcp sees C:\... as host C - if s:netrw_has_nt_rcp == 1 - if exists("g:netrw_uid") && ( g:netrw_uid != "" ) - let uid_machine = g:netrw_machine .'.'. g:netrw_uid - else - " Any way needed it machine contains a '.' - let uid_machine = g:netrw_machine .'.'. $USERNAME - endif - else - if exists("g:netrw_uid") && ( g:netrw_uid != "" ) - let uid_machine = g:netrw_uid .'@'. g:netrw_machine - else - let uid_machine = g:netrw_machine + if has("path_extra") +" call Decho("(Explore) ..starpat=".starpat.": has +path_extra") + if !exists("w:netrw_explore_indx") + let w:netrw_explore_indx= 0 endif - endif -" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)) - exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1) - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - let b:netrw_lastfile = choice - "......................................... - " NetRead: (ftp + <.netrc>) NetRead Method #2 {{{3 - elseif b:netrw_method == 2 " read with ftp + <.netrc> -" call Decho("read via ftp+.netrc (method #2)") - let netrw_fname= b:netrw_fname - call s:SaveBufVars()|new|call s:RestoreBufVars() - let filtbuf= bufnr("%") - setlocal ff=unix - keepj put =g:netrw_ftpmode -" call Decho("filter input: ".getline(line("$"))) - if exists("g:netrw_ftpextracmd") - keepj put =g:netrw_ftpextracmd -" call Decho("filter input: ".getline(line("$"))) - endif - call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile) -" call Decho("filter input: ".getline(line("$"))) - if exists("g:netrw_port") && g:netrw_port != "" -" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1)) - exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine." ".g:netrw_port,1) - else -" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) - exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) - endif - " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) - if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying ' - let debugkeep = &debug - setlocal debug=msg - call netrw#ErrorMsg(s:ERROR,getline(1),4) - let &debug = debugkeep + let indx = a:indx +" call Decho("(Explore) ..starpat=".starpat.": set indx= [a:indx=".indx."]") + + if indx == -1 + " Nexplore +" call Decho("(Explore) ..case Nexplore with starpat=".starpat.": (indx=".indx.")") + if !exists("w:netrw_explore_list") " sanity check + keepj call netrw#ErrorMsg(s:WARNING,"using Nexplore or improperly; see help for netrw-starstar",40) + sil! let @* = keepregstar + sil! let @+ = keepregstar + sil! let @/ = keepregslash +" call Dret("netrw#Explore") + return endif - call s:SaveBufVars() - bd! - if bufname("%") == "" && getline("$") == "" && line('$') == 1 - " needed when one sources a file in a nolbl setting window via ftp - q! + let indx= w:netrw_explore_indx + if indx < 0 | let indx= 0 | endif + if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif + let curfile= w:netrw_explore_list[indx] +" call Decho("(Explore) ....indx=".indx." curfile<".curfile.">") + while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx] + let indx= indx + 1 +" call Decho("(Explore) ....indx=".indx." (Nexplore while loop)") + endwhile + if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif +" call Decho("(Explore) ....Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx) + + elseif indx == -2 + " Pexplore +" call Decho("(Explore) case Pexplore with starpat=".starpat.": (indx=".indx.")") + if !exists("w:netrw_explore_list") " sanity check + keepj call netrw#ErrorMsg(s:WARNING,"using Pexplore or improperly; see help for netrw-starstar",41) + sil! let @* = keepregstar + sil! let @+ = keepregstar + sil! let @/ = keepregslash +" call Dret("netrw#Explore") + return endif - call s:RestoreBufVars() - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - let b:netrw_lastfile = choice + let indx= w:netrw_explore_indx + if indx < 0 | let indx= 0 | endif + if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif + let curfile= w:netrw_explore_list[indx] +" call Decho("(Explore) ....indx=".indx." curfile<".curfile.">") + while indx >= 0 && curfile == w:netrw_explore_list[indx] + let indx= indx - 1 +" call Decho("(Explore) ....indx=".indx." (Pexplore while loop)") + endwhile + if indx < 0 | let indx= 0 | endif +" call Decho("(Explore) ....Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx) - "......................................... - " NetRead: (ftp + machine,id,passwd,filename) NetRead Method #3 {{{3 - elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname - " Construct execution string (four lines) which will be passed through filter -" call Decho("read via ftp+mipf (method #3)") - let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) - call s:SaveBufVars()|new|call s:RestoreBufVars() - let filtbuf= bufnr("%") - setlocal ff=unix - if exists("g:netrw_port") && g:netrw_port != "" - keepj put ='open '.g:netrw_machine.' '.g:netrw_port -" call Decho("filter input: ".getline('.')) else - keepj put ='open '.g:netrw_machine -" call Decho("filter input: ".getline('.')) - endif + " Explore -- initialize + " build list of files to Explore with Nexplore/Pexplore +" call Decho("(Explore) ..starpat=".starpat.": case Explore: initialize (indx=".indx.")") + keepj keepalt call s:NetrwClearExplore() + let w:netrw_explore_indx= 0 + if !exists("b:netrw_curdir") + let b:netrw_curdir= getcwd() + endif +" call Decho("(Explore) ....starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">") - if exists("g:netrw_ftp") && g:netrw_ftp == 1 - keepj put =g:netrw_uid -" call Decho("filter input: ".getline('.')) - keepj put ='\"'.s:netrw_passwd.'\"' -" call Decho("filter input: ".getline('.')) - else - keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' -" call Decho("filter input: ".getline('.')) - endif + " switch on starpat to build the w:netrw_explore_list of files + if starpat == 1 + " starpat=1: Explore *//pattern (current directory only search for files containing pattern) +" call Decho("(Explore) ..case starpat=".starpat.": build *//pattern list (curdir-only srch for files containing pattern) &hls=".&hls) +" call Decho("(Explore) ....pattern<".pattern.">") + try + exe "keepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*" + catch /^Vim\%((\a\+)\)\=:E480/ + keepalt call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76) +" call Dret("netrw#Explore : unable to find pattern<".pattern.">") + return + endtry + let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)')) + if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif - if exists("g:netrw_ftpmode") && g:netrw_ftpmode != "" - keepj put =g:netrw_ftpmode -" call Decho("filter input: ".getline('.')) - endif - if exists("g:netrw_ftpextracmd") - put =g:netrw_ftpextracmd -" call Decho("filter input: ".getline('.')) - endif - keepj put ='get \"'.netrw_fname.'\" '.tmpfile -" call Decho("filter input: ".getline('.')) + elseif starpat == 2 + " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) +" call Decho("(Explore) ..case starpat=".starpat.": build **//pattern list (recursive descent files containing pattern)") +" call Decho("(Explore) ....pattern<".pattern.">") + try + exe "sil keepj noautocmd keepalt vimgrep /".pattern."/gj "."**/*" + catch /^Vim\%((\a\+)\)\=:E480/ + keepalt call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45) + if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif + sil! let @* = keepregstar + sil! let @+ = keepregstar + sil! let @/ = keepregslash +" call Dret("netrw#Explore : no files matched pattern") + return + endtry + let s:netrw_curdir = b:netrw_curdir + let w:netrw_explore_list = getqflist() + let w:netrw_explore_list = s:NetrwExploreListUniq(map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)')) + if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif - " perform ftp: - " -i : turns off interactive prompting from ftp - " -n unix : DON'T use <.netrc>, even though it exists - " -n win32: quit being obnoxious about password - norm! 1Gdd -" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n") - exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n" - " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) - if getline(1) !~ "^$" -" call Decho("error<".getline(1).">") - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,getline(1),5) - endif - endif - call s:SaveBufVars()|bd!|call s:RestoreBufVars() - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - let b:netrw_lastfile = choice + elseif starpat == 3 + " starpat=3: Explore */filepat (search in current directory for filenames matching filepat) +" call Decho("(Explore) ..case starpat=".starpat.": build */filepat list (curdir-only srch filenames matching filepat) &hls=".&hls) + let filepat= substitute(dirname,'^\*/','','') + let filepat= substitute(filepat,'^[%#<]','\\&','') +" call Decho("(Explore) ....b:netrw_curdir<".b:netrw_curdir.">") +" call Decho("(Explore) ....filepat<".filepat.">") + let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n')) + if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif - "......................................... - " NetRead: (scp) NetRead Method #4 {{{3 - elseif b:netrw_method == 4 " read with scp -" call Decho("read via scp (method #4)") - if exists("g:netrw_port") && g:netrw_port != "" - let useport= " ".g:netrw_scpport." ".g:netrw_port - else - let useport= "" - endif -" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)) - exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1) - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - let b:netrw_lastfile = choice + elseif starpat == 4 + " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) +" call Decho("(Explore) ..case starpat=".starpat.": build **/filepat list (recursive descent srch filenames matching filepat) &hls=".&hls) + let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n')) + if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif + endif " switch on starpat to build w:netrw_explore_list - "......................................... - " NetRead: (http) NetRead Method #5 (wget) {{{3 - elseif b:netrw_method == 5 -" call Decho("read via http (method #5)") - if g:netrw_http_cmd == "" - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6) - endif -" call Dret("netrw#NetRead :4 getcwd<".getcwd().">") - return - endif + let w:netrw_explore_listlen = len(w:netrw_explore_list) +" call Decho("(Explore) ....w:netrw_explore_list<".string(w:netrw_explore_list).">") +" call Decho("(Explore) ....w:netrw_explore_listlen=".w:netrw_explore_listlen) - if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd") - " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch) -" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)") - if exists("g:netrw_http_xcmd") -" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)) - exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1) - else -" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)) - exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1) + if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/') + keepalt keepj call netrw#ErrorMsg(s:WARNING,"no files matched",42) + sil! let @* = keepregstar + sil! let @+ = keepregstar + sil! let @/ = keepregslash +" call Dret("netrw#Explore : no files matched") + return endif - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - - else - " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker) -" call Decho(("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)") - let netrw_html= substitute(b:netrw_fname,"#.*$","","") - let netrw_tag = substitute(b:netrw_fname,"^.*#","","") -" call Decho("netrw_html<".netrw_html.">") -" call Decho("netrw_tag <".netrw_tag.">") -" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1)) - exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1) - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) -" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/') - exe 'norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\" - endif - let b:netrw_lastfile = choice - setlocal ro - - "......................................... - " NetRead: (dav) NetRead Method #6 {{{3 - elseif b:netrw_method == 6 -" call Decho("read via cadaver (method #6)") + endif " if indx ... endif - if !executable(g:netrw_dav_cmd) - call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73) -" call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable") - return - endif - if g:netrw_dav_cmd =~ "curl" -" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1)) - exe s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1) - else - " Construct execution string (four lines) which will be passed through filter - let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) - new - setlocal ff=unix - if exists("g:netrw_port") && g:netrw_port != "" - keepj put ='open '.g:netrw_machine.' '.g:netrw_port - else - keepj put ='open '.g:netrw_machine - endif - keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd - keepj put ='get '.netrw_fname.' '.tmpfile - keepj put ='quit' + " NetrwStatusLine support - for exploring support + let w:netrw_explore_indx= indx +" call Decho("(Explore) ....w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen) - " perform cadaver operation: - keepj norm! 1Gdd -" call Decho("executing: %!".g:netrw_dav_cmd) - exe s:netrw_silentxfer."%!".g:netrw_dav_cmd - bd! + " wrap the indx around, but issue a note + if indx >= w:netrw_explore_listlen || indx < 0 +" call Decho("(Explore) ....wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")") + let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0 + let w:netrw_explore_indx= indx + keepalt keepj call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43) endif - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - let b:netrw_lastfile = choice - "......................................... - " NetRead: (rsync) NetRead Method #7 {{{3 - elseif b:netrw_method == 7 -" call Decho("read via rsync (method #7)") -" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)) - exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1) - let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method) - let b:netrw_lastfile = choice + exe "let dirfile= w:netrw_explore_list[".indx."]" +" call Decho("(Explore) ....dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">") + let newdir= substitute(dirfile,'/[^/]*$','','e') +" call Decho("(Explore) ....newdir<".newdir.">") - "......................................... - " NetRead: (fetch) NetRead Method #8 {{{3 - " fetch://[user@]host[:http]/path - elseif b:netrw_method == 8 -" call Decho("read via fetch (method #8)") - if g:netrw_fetch_cmd == "" - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"fetch command not available",7) - endif -" call Dret("NetRead") - endif - if exists("g:netrw_option") && g:netrw_option == ":http" - let netrw_option= "http" - else - let netrw_option= "ftp" +" call Decho("(Explore) ....calling LocalBrowseCheck(newdir<".newdir.">)") + call netrw#LocalBrowseCheck(newdir) + if !exists("w:netrw_liststyle") + let w:netrw_liststyle= g:netrw_liststyle endif -" call Decho("read via fetch for ".netrw_option) - - if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != "" -" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1)) - exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1) + if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST + keepalt keepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W") else -" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1)) - exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1) + keepalt keepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w") endif + let w:netrw_explore_mtchcnt = indx + 1 + let w:netrw_explore_bufnr = bufnr("%") + let w:netrw_explore_line = line(".") + keepalt keepj call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}') +" call Decho("(Explore) ....explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line) - let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method) - let b:netrw_lastfile = choice - setlocal ro - - "......................................... - " NetRead: (sftp) NetRead Method #9 {{{3 - elseif b:netrw_method == 9 -" call Decho("read via sftp (method #9)") -" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile) - exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile - let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - let b:netrw_lastfile = choice - - "......................................... - " NetRead: Complain {{{3 else - call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8) +" call Decho("(Explore) ..your vim does not have +path_extra") + if !exists("g:netrw_quiet") + keepalt keepj call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44) + endif + sil! let @* = keepregstar + sil! let @+ = keepregstar + sil! let @/ = keepregslash +" call Dret("netrw#Explore : missing +path_extra") + return endif - endwhile - - " NetRead: cleanup {{{3 - if exists("b:netrw_method") -" call Decho("cleanup b:netrw_method and b:netrw_fname") - unlet b:netrw_method - unlet b:netrw_fname - endif - if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't' && tmpfile !~ '.tar.xz$' && tmpfile !~ '.txz' -" call Decho("cleanup by deleting tmpfile<".tmpfile.">") - call s:NetrwDelete(tmpfile) - endif - call s:NetrwOptionRestore("w:") - -" call Dret("netrw#NetRead :5 getcwd<".getcwd().">") -endfun - -" ------------------------------------------------------------------------ -" netrw#NetWrite: responsible for writing a file over the net {{{2 -fun! netrw#NetWrite(...) range -" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw) - - " NetWrite: option handling {{{3 - let mod= 0 - call s:NetrwOptionSave("w:") - call s:NetrwSafeOptions() - - " NetWrite: Get Temporary Filename {{{3 - let tmpfile= s:GetTempfile("") - if tmpfile == "" -" call Dret("netrw#NetWrite : unable to get a tempfile!") - return - endif - if a:0 == 0 - let ichoice = 0 else - let ichoice = 1 +" call Decho("(Explore) ..default case: Explore newdir<".dirname.">") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/' + sil! unlet w:netrw_treedict + sil! unlet w:netrw_treetop + endif + let newdir= dirname + if !exists("b:netrw_curdir") + keepj call netrw#LocalBrowseCheck(getcwd()) + else + keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir)) + endif endif - let curbufname= expand("%") -" call Decho("curbufname<".curbufname.">") - if &binary - " For binary writes, always write entire file. - " (line numbers don't really make sense for that). - " Also supports the writing of tar and zip files. -" call Decho("(write entire file) silent exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)) - exe "silent keepj w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile) - elseif g:netrw_cygwin - " write (selected portion of) file to temporary - let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','') -" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)) - exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile) + " visual display of **/ **// */ Exploration files +" call Decho("(Explore) w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist")) +" call Decho("(Explore) b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">") + if exists("w:netrw_explore_indx") && exists("b:netrw_curdir") +" call Decho("(Explore) s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-")) + if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir + " only update match list if current directory isn't the same as before +" call Decho("(Explore) only update match list if current directory not the same as before") + let s:explore_prvdir = b:netrw_curdir + let s:explore_match = "" + let dirlen = s:Strlen(b:netrw_curdir) + if b:netrw_curdir !~ '/$' + let dirlen= dirlen + 1 + endif + let prvfname= "" + for fname in w:netrw_explore_list +" call Decho("(Explore) fname<".fname.">") + if fname =~ '^'.b:netrw_curdir + if s:explore_match == "" + let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>' + else + let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>' + endif + elseif fname !~ '^/' && fname != prvfname + if s:explore_match == "" + let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>' + else + let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>' + endif + endif + let prvfname= fname + endfor +" call Decho("(Explore) explore_match<".s:explore_match.">") + exe "2match netrwMarkFile /".s:explore_match."/" + endif + echo "==Pexplore ==Nexplore" else - " write (selected portion of) file to temporary -" call Decho("(write selected portion) silent exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)) - exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile) + 2match none + if exists("s:explore_match") | unlet s:explore_match | endif + if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif + echo " " +" call Decho("(Explore) cleared explore match list") endif - if curbufname == "" - " if the file is [No Name], and one attempts to Nwrite it, the buffer takes - " on the temporary file's name. Deletion of the temporary file during - " cleanup then causes an error message. - 0file! + sil! let @* = keepregstar + sil! let @+ = keepregstar + sil! let @/ = keepregslash +" call Dret("netrw#Explore : @/<".@/.">") +endfun + +" --------------------------------------------------------------------- +" netrw#NetrwMakeTgt: make a target out of the directory name provided {{{2 +fun! netrw#NetrwMakeTgt(dname) +" call Dfunc("netrw#NetrwMakeTgt(dname<".a:dname.">)") + " simplify the target (eg. /abc/def/../ghi -> /abc/ghi) + let svpos = netrw#NetrwSavePosn() + let s:netrwmftgt_islocal= (a:dname !~ '^\a\+://') +" call Decho("s:netrwmftgt_islocal=".s:netrwmftgt_islocal) + if s:netrwmftgt_islocal + let netrwmftgt= simplify(a:dname) + else + let netrwmftgt= a:dname + endif + if exists("s:netrwmftgt") && netrwmftgt == s:netrwmftgt + " re-selected target, so just clear it + unlet s:netrwmftgt s:netrwmftgt_islocal + else + let s:netrwmftgt= netrwmftgt + endif + if g:netrw_fastbrowse <= 1 + call s:NetrwRefresh((b:netrw_curdir !~ '\a\+://'),b:netrw_curdir) endif + call netrw#NetrwRestorePosn(svpos) +" call Dret("netrw#NetrwMakeTgt") +endfun - " NetWrite: while choice loop: {{{3 - while ichoice <= a:0 +" --------------------------------------------------------------------- +" netrw#NetrwClean: remove netrw {{{2 +" supports :NetrwClean -- remove netrw from first directory on runtimepath +" :NetrwClean! -- remove netrw from all directories on runtimepath +fun! netrw#NetrwClean(sys) +" call Dfunc("netrw#NetrwClean(sys=".a:sys.")") - " Process arguments: {{{4 - " attempt to repeat with previous host-file-etc - if exists("b:netrw_lastfile") && a:0 == 0 -" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">") - let choice = b:netrw_lastfile - let ichoice= ichoice + 1 - else - exe "let choice= a:" . ichoice + if a:sys + let choice= confirm("Remove personal and system copies of netrw?","&Yes\n&No") + else + let choice= confirm("Remove personal copy of netrw?","&Yes\n&No") + endif +" call Decho("choice=".choice) + let diddel= 0 + let diddir= "" - " Reconstruct Choice if choice starts with '"' - if match(choice,"?") == 0 - echomsg 'NetWrite Usage:"' - echomsg ':Nwrite machine:path uses rcp' - echomsg ':Nwrite "machine path" uses ftp with <.netrc>' - echomsg ':Nwrite "machine id password path" uses ftp' - echomsg ':Nwrite dav://[user@]machine/path uses cadaver' - echomsg ':Nwrite fetch://[user@]machine/path uses fetch' - echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)' - echomsg ':Nwrite rcp://machine/path uses rcp' - echomsg ':Nwrite rsync://[user@]machine/path uses rsync' - echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp' - echomsg ':Nwrite sftp://[user@]machine/path uses sftp' - sleep 4 - break + if choice == 1 + for dir in split(&rtp,',') + if filereadable(dir."/plugin/netrwPlugin.vim") +" call Decho("removing netrw-related files from ".dir) + if s:NetrwDelete(dir."/plugin/netrwPlugin.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/plugin/netrwPlugin.vim",55) |endif + if s:NetrwDelete(dir."/autoload/netrwFileHandlers.vim")|call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwFileHandlers.vim",55)|endif + if s:NetrwDelete(dir."/autoload/netrwSettings.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrwSettings.vim",55) |endif + if s:NetrwDelete(dir."/autoload/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/autoload/netrw.vim",55) |endif + if s:NetrwDelete(dir."/syntax/netrw.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrw.vim",55) |endif + if s:NetrwDelete(dir."/syntax/netrwlist.vim") |call netrw#ErrorMsg(1,"unable to remove ".dir."/syntax/netrwlist.vim",55) |endif + let diddir= dir + let diddel= diddel + 1 + if !a:sys|break|endif + endif + endfor + endif - elseif match(choice,"^\"") != -1 - if match(choice,"\"$") != -1 - " case "..." - let choice=strpart(choice,1,strlen(choice)-2) - else - " case "... ... ..." - let choice = strpart(choice,1,strlen(choice)-1) - let wholechoice = "" + echohl WarningMsg + if diddel == 0 + echomsg "netrw is either not installed or not removable" + elseif diddel == 1 + echomsg "removed one copy of netrw from <".diddir.">" + else + echomsg "removed ".diddel." copies of netrw" + endif + echohl None - while match(choice,"\"$") == -1 - let wholechoice= wholechoice . " " . choice - let ichoice = ichoice + 1 - if choice > a:0 - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13) - endif -" call Dret("netrw#NetWrite") - return - endif - let choice= a:{ichoice} - endwhile - let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1) +" call Dret("netrw#NetrwClean") +endfun + +" --------------------------------------------------------------------- +" netrw#Nread: {{{2 +fun! netrw#Nread(mode,fname) +" call Dfunc("netrw#Nread(mode=".a:mode." fname<".a:fname.">)") + call netrw#NetrwSavePosn() + call netrw#NetRead(a:mode,a:fname) + call netrw#NetrwRestorePosn() +" call Dret("netrw#Nread") +endfun + +" ------------------------------------------------------------------------ +" netrw#NetrwObtain: {{{2 +" netrw#NetrwObtain(islocal,fname[,tgtdirectory]) +" islocal=0 obtain from remote source +" =1 obtain from local source +" fname : a filename or a list of filenames +" tgtdir : optional place where files are to go (not present, uses getcwd()) +fun! netrw#NetrwObtain(islocal,fname,...) +" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0) + " NetrwStatusLine support - for obtaining support + + if type(a:fname) == 1 + let fnamelist= [ a:fname ] + elseif type(a:fname) == 3 + let fnamelist= a:fname + else + call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62) +" call Dret("netrw#NetrwObtain") + return + endif +" call Decho("fnamelist<".string(fnamelist).">") + if a:0 > 0 + let tgtdir= a:1 + else + let tgtdir= getcwd() + endif +" call Decho("tgtdir<".tgtdir.">") + + if exists("b:netrw_islocal") && b:netrw_islocal + " obtain a file from local b:netrw_curdir to (local) tgtdir +" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir) + if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir + let topath= s:ComposePath(tgtdir,"") + if (has("win32") || has("win95") || has("win64") || has("win16")) + " transfer files one at time +" call Decho("transfer files one at a time") + for fname in fnamelist +" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")") + call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath)) + if v:shell_error != 0 + call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80) +" call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath)) + return + endif + endfor + else + " transfer files with one command +" call Decho("transfer files with one command") + let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)")) +" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")") + call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath)) + if v:shell_error != 0 + call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localcopycmd<".g:netrw_localcopycmd."> to something that works",80) +" call Dret("s:NetrwObtain 0 : failed: ".g:netrw_localcopycmd." ".filelist." ".shellescape(topath)) + return endif endif - endif - let ichoice= ichoice + 1 -" call Decho("choice<" . choice . "> ichoice=".ichoice) - - " Determine method of write (ftp, rcp, etc) {{{4 - call s:NetrwMethod(choice) - if !exists("b:netrw_method") || b:netrw_method < 0 -" call Dfunc("netrw#NetWrite : unsupported method") - return + elseif !exists("b:netrw_curdir") + call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36) + else + call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37) endif - " ============= - " NetWrite: Perform Protocol-Based Write {{{3 - " ============================ - if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 - echo "(netrw) Processing your write request..." -" call Decho("(netrw) Processing your write request...") + else + " obtain files from remote b:netrw_curdir to local tgtdir +" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir) + if type(a:fname) == 1 + call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname) endif + call s:NetrwMethod(b:netrw_curdir) - "......................................... - " NetWrite: (rcp) NetWrite Method #1 {{{3 - if b:netrw_method == 1 -" call Decho("write via rcp (method #1)") - if s:netrw_has_nt_rcp == 1 - if exists("g:netrw_uid") && ( g:netrw_uid != "" ) - let uid_machine = g:netrw_machine .'.'. g:netrw_uid - else - let uid_machine = g:netrw_machine .'.'. $USERNAME - endif + if b:netrw_method == 4 + " obtain file using scp +" call Decho("obtain via scp (method#4)") + if exists("g:netrw_port") && g:netrw_port != "" + let useport= " ".g:netrw_scpport." ".g:netrw_port else - if exists("g:netrw_uid") && ( g:netrw_uid != "" ) - let uid_machine = g:netrw_uid .'@'. g:netrw_machine - else - let uid_machine = g:netrw_machine - endif + let useport= "" endif -" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1)) - exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1) - let b:netrw_lastfile = choice - - "......................................... - " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3 - elseif b:netrw_method == 2 -" call Decho("write via ftp+.netrc (method #2)") - let netrw_fname = b:netrw_fname - - " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead - let bhkeep = &l:bh - let curbuf = bufnr("%") - setlocal bh=hide - enew - -" call Decho("filter input window#".winnr()) - setlocal ff=unix - keepj put =g:netrw_ftpmode -" call Decho("filter input: ".getline('$')) - if exists("g:netrw_ftpextracmd") - keepj put =g:netrw_ftpextracmd -" call Decho("filter input: ".getline("$")) - endif - call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"') -" call Decho("filter input: ".getline("$")) - if exists("g:netrw_port") && g:netrw_port != "" -" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) - exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) + if b:netrw_fname =~ '/' + let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','') else -" call Decho("filter input window#".winnr()) -" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) - exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) + let path= "" endif - " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) - if getline(1) !~ "^$" - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,getline(1),14) + let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)')) +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)) + exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1) + + elseif b:netrw_method == 2 + " obtain file using ftp + .netrc +" call Decho("obtain via ftp+.netrc (method #2)") + call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars() + let tmpbufnr= bufnr("%") + setl ff=unix + if exists("g:netrw_ftpmode") && g:netrw_ftpmode != "" + keepj put =g:netrw_ftpmode +" call Decho("filter input: ".getline('$')) endif - let mod=1 - endif - " remove enew buffer (quietly) - let filtbuf= bufnr("%") - exe curbuf."b!" - let &l:bh = bhkeep - exe filtbuf."bw!" + if exists("b:netrw_fname") && b:netrw_fname != "" + call setline(line("$")+1,'cd "'.b:netrw_fname.'"') +" call Decho("filter input: ".getline('$')) + endif - let b:netrw_lastfile = choice + if exists("g:netrw_ftpextracmd") + keepj put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('$')) + endif + for fname in fnamelist + call setline(line("$")+1,'get "'.fname.'"') +" call Decho("filter input: ".getline('$')) + endfor + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) + exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) + else +" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) + endif + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying ' + let debugkeep= &debug + setl debug=msg + call netrw#ErrorMsg(s:ERROR,getline(1),4) + let &debug= debugkeep + endif - "......................................... - " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3 elseif b:netrw_method == 3 - " Construct execution string (three or more lines) which will be passed through filter -" call Decho("read via ftp+mipf (method #3)") - let netrw_fname = b:netrw_fname - let bhkeep = &l:bh - - " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead - let curbuf = bufnr("%") - setlocal bh=hide - enew - setlocal ff=unix + " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc) +" call Decho("obtain via ftp+mipf (method #3)") + call s:SaveBufVars()|sil keepjumps new|call s:RestoreBufVars() + let tmpbufnr= bufnr("%") + setl ff=unix if exists("g:netrw_port") && g:netrw_port != "" keepj put ='open '.g:netrw_machine.' '.g:netrw_port -" call Decho("filter input: ".getline('.')) +" call Decho("filter input: ".getline('$')) else keepj put ='open '.g:netrw_machine -" call Decho("filter input: ".getline('.')) +" call Decho("filter input: ".getline('$')) endif - if exists("g:netrw_ftp") && g:netrw_ftp == 1 - keepj put =g:netrw_uid -" call Decho("filter input: ".getline('.')) - keepj put ='\"'.s:netrw_passwd.'\"' -" call Decho("filter input: ".getline('.')) - else - keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' -" call Decho("filter input: ".getline('.')) + + if exists("g:netrw_uid") && g:netrw_uid != "" + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + keepj put =g:netrw_uid +" call Decho("filter input: ".getline('$')) + if exists("s:netrw_passwd") && s:netrw_passwd != "" + keepj put ='\"'.s:netrw_passwd.'\"' + endif +" call Decho("filter input: ".getline('$')) + elseif exists("s:netrw_passwd") + keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('$')) + endif endif - keepj put =g:netrw_ftpmode -" call Decho("filter input: ".getline('$')) + + if exists("g:netrw_ftpmode") && g:netrw_ftpmode != "" + keepj put =g:netrw_ftpmode +" call Decho("filter input: ".getline('$')) + endif + + if exists("b:netrw_fname") && b:netrw_fname != "" + keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"') +" call Decho("filter input: ".getline('$')) + endif + if exists("g:netrw_ftpextracmd") keepj put =g:netrw_ftpextracmd -" call Decho("filter input: ".getline("$")) +" call Decho("filter input: ".getline('$')) endif - keepj put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"' -" call Decho("filter input: ".getline('.')) - " save choice/id/password for future use - let b:netrw_lastfile = choice + + if exists("g:netrw_ftpextracmd") + keepj put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('$')) + endif + for fname in fnamelist + keepj call setline(line("$")+1,'get "'.fname.'"') + endfor +" call Decho("filter input: ".getline('$')) " perform ftp: " -i : turns off interactive prompting from ftp " -n unix : DON'T use <.netrc>, even though it exists " -n win32: quit being obnoxious about password keepj norm! 1Gdd -" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n") - exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n" +" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options) + exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) if getline(1) !~ "^$" - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,getline(1),15) +" call Decho("error<".getline(1).">") + if !exists("g:netrw_quiet") + keepj call netrw#ErrorMsg(s:ERROR,getline(1),5) endif - let mod=1 endif + elseif !exists("b:netrw_method") || b:netrw_method < 0 +" call Dfunc("netrw#NetrwObtain : unsupported method") + return + endif - " remove enew buffer (quietly) - let filtbuf= bufnr("%") - exe curbuf."b!" - let &l:bh= bhkeep - exe filtbuf."bw!" - - "......................................... - " NetWrite: (scp) NetWrite Method #4 {{{3 - elseif b:netrw_method == 4 -" call Decho("write via scp (method #4)") - if exists("g:netrw_port") && g:netrw_port != "" - let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port) - else - let useport= "" - endif -" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)) - exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1) - let b:netrw_lastfile = choice + " restore status line + if type(a:fname) == 1 && exists("s:netrw_users_stl") + keepj call s:SetupNetrwStatusLine(s:netrw_users_stl) + endif - "......................................... - " NetWrite: (http) NetWrite Method #5 {{{3 - elseif b:netrw_method == 5 -" call Decho("write via http (method #5)") - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"currently does not support writing using http:",16) - endif + endif - "......................................... - " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3 - elseif b:netrw_method == 6 -" call Decho("write via cadaver (method #6)") + " cleanup + if exists("tmpbufnr") + if bufnr("%") != tmpbufnr + exe tmpbufnr."bw!" + else + q! + endif + endif - " Construct execution string (four lines) which will be passed through filter - let netrw_fname = escape(b:netrw_fname,g:netrw_fname_escape) - let bhkeep = &l:bh +" call Dret("netrw#NetrwObtain") +endfun - " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead - let curbuf = bufnr("%") - setlocal bh=hide - enew +" --------------------------------------------------------------------- +" NetrwStatusLine: {{{2 +fun! NetrwStatusLine() - setlocal ff=unix - if exists("g:netrw_port") && g:netrw_port != "" - keepj put ='open '.g:netrw_machine.' '.g:netrw_port - else - keepj put ='open '.g:netrw_machine - endif - if exists("g:netrw_uid") && exists("s:netrw_passwd") - keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd - endif - keepj put ='put '.tmpfile.' '.netrw_fname +" vvv NetrwStatusLine() debugging vvv +" let g:stlmsg="" +" if !exists("w:netrw_explore_bufnr") +" let g:stlmsg="!X" +" elseif w:netrw_explore_bufnr != bufnr("%") +" let g:stlmsg="explore_bufnr!=".bufnr("%") +" endif +" if !exists("w:netrw_explore_line") +" let g:stlmsg=" !X" +" elseif w:netrw_explore_line != line(".") +" let g:stlmsg=" explore_line!={line(.)<".line(".").">" +" endif +" if !exists("w:netrw_explore_list") +" let g:stlmsg=" !X" +" endif +" ^^^ NetrwStatusLine() debugging ^^^ - " perform cadaver operation: - keepj norm! 1Gdd -" call Decho("executing: %!".g:netrw_dav_cmd) - exe s:netrw_silentxfer."%!".g:netrw_dav_cmd + if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr("%") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list") + " restore user's status line + let &stl = s:netrw_users_stl + let &laststatus = s:netrw_users_ls + if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif + if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif + return "" + else + return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen + endif +endfun - " remove enew buffer (quietly) - let filtbuf= bufnr("%") - exe curbuf."b!" - let &l:bh = bhkeep - exe filtbuf."bw!" +" --------------------------------------------------------------------- +" Netrw Transfer Functions: {{{1 +" =============================== - let b:netrw_lastfile = choice +" ------------------------------------------------------------------------ +" netrw#NetRead: responsible for reading a file over the net {{{2 +" mode: =0 read remote file and insert before current line +" =1 read remote file and insert after current line +" =2 replace with remote file +" =3 obtain file, but leave in temporary format +fun! netrw#NetRead(mode,...) +" call Dfunc("netrw#NetRead(mode=".a:mode.",...) a:0=".a:0." ".g:loaded_netrw.((a:0 > 0)? " a:1<".a:1.">" : "")) - "......................................... - " NetWrite: (rsync) NetWrite Method #7 {{{3 - elseif b:netrw_method == 7 -" call Decho("write via rsync (method #7)") -" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)) - exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1) - let b:netrw_lastfile = choice + " NetRead: save options {{{3 + call s:NetrwOptionSave("w:") + call s:NetrwSafeOptions() + call s:RestoreCursorline() - "......................................... - " NetWrite: (sftp) NetWrite Method #9 {{{3 - elseif b:netrw_method == 9 -" call Decho("read via sftp (method #9)") - let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) - if exists("g:netrw_uid") && ( g:netrw_uid != "" ) - let uid_machine = g:netrw_uid .'@'. g:netrw_machine - else - let uid_machine = g:netrw_machine - endif - - " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead - let bhkeep = &l:bh - let curbuf = bufnr("%") - setlocal bh=hide - enew - - setlocal ff=unix - call setline(1,'put "'.escape(tmpfile,'\').'" '.netrw_fname) -" call Decho("filter input: ".getline('.')) -" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1)) - exe s:netrw_silentxfer."%!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1) - let filtbuf= bufnr("%") - exe curbuf."b!" - let &l:bh = bhkeep - exe filtbuf."bw!" - let b:netrw_lastfile = choice - - "......................................... - " NetWrite: Complain {{{3 - else - call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17) - endif - endwhile - - " NetWrite: Cleanup: {{{3 -" call Decho("cleanup") - if s:FileReadable(tmpfile) -" call Decho("tmpfile<".tmpfile."> readable, will now delete it") - call s:NetrwDelete(tmpfile) - endif - call s:NetrwOptionRestore("w:") - - if a:firstline == 1 && a:lastline == line("$") - " restore modifiability; usually equivalent to set nomod - let &mod= mod - endif - - " restore equalalways -" call Dret("netrw#NetWrite") -endfun - -" --------------------------------------------------------------------- -" netrw#NetSource: source a remotely hosted vim script {{{2 -" uses NetRead to get a copy of the file into a temporarily file, -" then sources that file, -" then removes that file. -fun! netrw#NetSource(...) -" call Dfunc("netrw#NetSource() a:0=".a:0) - if a:0 > 0 && a:1 == '?' - " give help - echomsg 'NetSource Usage:' - echomsg ':Nsource dav://machine[:port]/path uses cadaver' - echomsg ':Nsource fetch://machine/path uses fetch' - echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>' - echomsg ':Nsource http://[user@]machine/path uses http wget' - echomsg ':Nsource rcp://[user@]machine/path uses rcp' - echomsg ':Nsource rsync://machine[:port]/path uses rsync' - echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp' - echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp' - sleep 4 + " NetRead: interpret mode into a readcmd {{{3 + if a:mode == 0 " read remote file before current line + let readcmd = "0r" + elseif a:mode == 1 " read file after current line + let readcmd = "r" + elseif a:mode == 2 " replace with remote file + let readcmd = "%r" + elseif a:mode == 3 " skip read of file (leave as temporary) + let readcmd = "t" else - let i= 1 - while i <= a:0 - call netrw#NetRead(3,a:{i}) -" call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">") - if s:FileReadable(s:netrw_tmpfile) -" call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile)) - exe "so ".fnameescape(s:netrw_tmpfile) -" call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")") - call delete(s:netrw_tmpfile) - unlet s:netrw_tmpfile - else - call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48) - endif - let i= i + 1 - endwhile + exe a:mode + let readcmd = "r" endif -" call Dret("netrw#NetSource") -endfun - -" =========================================== -" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2 -" readcmd == %r : replace buffer with newly read file -" == 0r : read file at top of buffer -" == r : read file after current line -" == t : leave file in temporary form (ie. don't read into buffer) -fun! s:NetrwGetFile(readcmd, tfile, method) -" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)") + let ichoice = (a:0 == 0)? 0 : 1 +" call Decho("readcmd<".readcmd."> ichoice=".ichoice) - " readcmd=='t': simply do nothing - if a:readcmd == 't' -" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) -" call Dret("NetrwGetFile : skip read of <".a:tfile.">") + " NetRead: get temporary filename {{{3 + let tmpfile= s:GetTempfile("") + if tmpfile == "" +" call Dret("netrw#NetRead : unable to get a tempfile!") return endif - " get name of remote filename (ie. url and all) - let rfile= bufname("%") -" call Decho("rfile<".rfile.">") - - if exists("*NetReadFixup") - " for the use of NetReadFixup (not otherwise used internally) - let line2= line("$") - endif - - if a:readcmd[0] == '%' - " get file into buffer -" call Decho("get file into buffer") + while ichoice <= a:0 - " rename the current buffer to the temp file (ie. tfile) - if g:netrw_cygwin - let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','') - else - let tfile= a:tfile - endif -" call Decho("exe sil! keepalt file ".fnameescape(tfile)) - exe "sil! keepalt file ".fnameescape(tfile) + " attempt to repeat with previous host-file-etc + if exists("b:netrw_lastfile") && a:0 == 0 +" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">") + let choice = b:netrw_lastfile + let ichoice= ichoice + 1 - " edit temporary file (ie. read the temporary file in) - if rfile =~ '\.zip$' -" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)") - call zip#Browse(tfile) - elseif rfile =~ '\.tar$' -" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)") - call tar#Browse(tfile) - elseif rfile =~ '\.tar\.gz$' -" call Decho("handling remote gzip-compressed tar file") - call tar#Browse(tfile) - elseif rfile =~ '\.tar\.bz2$' -" call Decho("handling remote bz2-compressed tar file") - call tar#Browse(tfile) - elseif rfile =~ '\.tar\.xz$' -" call Decho("handling remote xz-compressed tar file") - call tar#Browse(tfile) - elseif rfile =~ '\.txz$' -" call Decho("handling remote xz-compressed tar file (.txz)") - call tar#Browse(tfile) else -" call Decho("edit temporary file") - e! - endif - - " rename buffer back to remote filename -" call Decho("exe sil! keepalt file ".fnameescape(rfile)) - exe "sil! keepalt file ".fnameescape(rfile) - filetype detect -" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!") - let line1 = 1 - let line2 = line("$") + exe "let choice= a:" . ichoice +" call Decho("no lastfile: choice<" . choice . ">") - elseif s:FileReadable(a:tfile) - " read file after current line -" call Decho("read file<".a:tfile."> after current line") - let curline = line(".") - let lastline= line("$") -" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline) - exe a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile) - let line1= curline + 1 - let line2= line("$") - lastline + 1 + if match(choice,"?") == 0 + " give help + echomsg 'NetRead Usage:' + echomsg ':Nread machine:path uses rcp' + echomsg ':Nread "machine path" uses ftp with <.netrc>' + echomsg ':Nread "machine id password path" uses ftp' + echomsg ':Nread dav://machine[:port]/path uses cadaver' + echomsg ':Nread fetch://machine/path uses fetch' + echomsg ':Nread ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>' + echomsg ':Nread http://[user@]machine/path uses http wget' + echomsg ':Nread rcp://[user@]machine/path uses rcp' + echomsg ':Nread rsync://machine[:port]/path uses rsync' + echomsg ':Nread scp://[user@]machine[[:#]port]/path uses scp' + echomsg ':Nread sftp://[user@]machine[[:#]port]/path uses sftp' + sleep 4 + break - else - " not readable -" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) -" call Decho("tfile<".a:tfile."> not readable") - call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9) -" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable") - return - endif + elseif match(choice,'^"') != -1 + " Reconstruct Choice if choice starts with '"' +" call Decho("reconstructing choice") + if match(choice,'"$') != -1 + " case "..." + let choice= strpart(choice,1,strlen(choice)-2) + else + " case "... ... ..." + let choice = strpart(choice,1,strlen(choice)-1) + let wholechoice = "" - " User-provided (ie. optional) fix-it-up command - if exists("*NetReadFixup") -" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")") - call NetReadFixup(a:method, line1, line2) -" else " Decho -" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")") - endif + while match(choice,'"$') == -1 + let wholechoice = wholechoice . " " . choice + let ichoice = ichoice + 1 + if ichoice > a:0 + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",3) + endif +" call Dret("netrw#NetRead :2 getcwd<".getcwd().">") + return + endif + let choice= a:{ichoice} + endwhile + let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1) + endif + endif + endif - if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu - " update the Buffers menu - call s:UpdateBuffersMenu() - endif +" call Decho("choice<" . choice . ">") + let ichoice= ichoice + 1 -" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile)) + " NetRead: Determine method of read (ftp, rcp, etc) {{{3 + call s:NetrwMethod(choice) + if !exists("b:netrw_method") || b:netrw_method < 0 +" call Dfunc("netrw#NetRead : unsupported method") + return + endif + let tmpfile= s:GetTempfile(b:netrw_fname) " apply correct suffix - " make sure file is being displayed -" redraw! + " Check if NetrwBrowse() should be handling this request +" call Decho("checking if NetrwBrowse() should handle choice<".choice."> with netrw_list_cmd<".g:netrw_list_cmd.">") + if choice =~ "^.*[\/]$" && b:netrw_method != 5 && choice !~ '^https\=://' +" call Decho("yes, choice matches '^.*[\/]$'") + keepj call s:NetrwBrowse(0,choice) +" call Dret("netrw#NetRead :3 getcwd<".getcwd().">") + return + endif -" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) -" call Dret("NetrwGetFile") -endfun + " ============ + " NetRead: Perform Protocol-Based Read {{{3 + " =========================== + if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 + echo "(netrw) Processing your read request..." + endif -" ------------------------------------------------------------------------ -" s:NetrwMethod: determine method of transfer {{{2 -" Input: -" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file] -" Output: -" b:netrw_method= 1: rcp -" 2: ftp + <.netrc> -" 3: ftp + machine, id, password, and [path]filename -" 4: scp -" 5: http (wget) -" 6: dav -" 7: rsync -" 8: fetch -" 9: sftp -" g:netrw_machine= hostname -" b:netrw_fname = filename -" g:netrw_port = optional port number (for ftp) -" g:netrw_choice = copy of input url (choice) -fun! s:NetrwMethod(choice) -" call Dfunc("NetrwMethod(a:choice<".a:choice.">)") - - " record current g:netrw_machine, if any - " curmachine used if protocol == ftp and no .netrc - if exists("g:netrw_machine") - let curmachine= g:netrw_machine -" call Decho("curmachine<".curmachine.">") + "......................................... + " NetRead: (rcp) NetRead Method #1 {{{3 + if b:netrw_method == 1 " read with rcp +" call Decho("read via rcp (method #1)") + " ER: nothing done with g:netrw_uid yet? + " ER: on Win2K" rcp machine[.user]:file tmpfile + " ER: if machine contains '.' adding .user is required (use $USERNAME) + " ER: the tmpfile is full path: rcp sees C:\... as host C + if s:netrw_has_nt_rcp == 1 + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_machine .'.'. g:netrw_uid + else + " Any way needed it machine contains a '.' + let uid_machine = g:netrw_machine .'.'. $USERNAME + endif else - let curmachine= "N O T A HOST" + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_uid .'@'. g:netrw_machine + else + let uid_machine = g:netrw_machine + endif endif +" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)) + exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(uid_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1) + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice - " initialization - let b:netrw_method = 0 - let g:netrw_machine = "" - let b:netrw_fname = "" - let g:netrw_port = "" - let g:netrw_choice = a:choice - - " Patterns: - " mipf : a:machine a:id password filename Use ftp - " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd - " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd - " rcpurm : rcp://[user@]host/filename Use rcp - " rcphf : [user@]host:filename Use rcp - " scpurm : scp://[user@]host[[#:]port]/filename Use scp - " httpurm : http://[user@]host/filename Use wget - " davurm : dav[s]://host[:port]/path Use cadaver/curl - " rsyncurm : rsync://host[:port]/path Use rsync - " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http) - " sftpurm : sftp://[user@]host/filename Use scp - let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$' - let mf = '^\(\S\+\)\s\+\(\S\+\)$' - let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$' - let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$' - let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$' - let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$' - let httpurm = '^http://\([^/]\{-}\)\(/.*\)\=$' - let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$' - let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$' - let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$' - let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$' - -" call Decho("determine method:") - " Determine Method - " rcp://user@hostname/...path-to-file - if match(a:choice,rcpurm) == 0 -" call Decho("rcp://...") - let b:netrw_method = 1 - let userid = substitute(a:choice,rcpurm,'\1',"") - let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"") - let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"") - if userid != "" - let g:netrw_uid= userid - endif + "......................................... + " NetRead: (ftp + <.netrc>) NetRead Method #2 {{{3 + elseif b:netrw_method == 2 " read with ftp + <.netrc> +" call Decho("read via ftp+.netrc (method #2)") + let netrw_fname= b:netrw_fname + keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars() + let filtbuf= bufnr("%") + setl ff=unix + keepj put =g:netrw_ftpmode +" call Decho("filter input: ".getline(line("$"))) + if exists("g:netrw_ftpextracmd") + keepj put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline(line("$"))) + endif + call setline(line("$")+1,'get "'.netrw_fname.'" '.tmpfile) +" call Decho("filter input: ".getline(line("$"))) + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) + exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) + else +" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) + endif + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying ' + let debugkeep = &debug + setl debug=msg + keepj call netrw#ErrorMsg(s:ERROR,getline(1),4) + let &debug = debugkeep + endif + call s:SaveBufVars() + bd! + if bufname("%") == "" && getline("$") == "" && line('$') == 1 + " needed when one sources a file in a nolbl setting window via ftp + q! + endif + call s:RestoreBufVars() + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice - " scp://user@hostname/...path-to-file - elseif match(a:choice,scpurm) == 0 -" call Decho("scp://...") - let b:netrw_method = 4 - let g:netrw_machine = substitute(a:choice,scpurm,'\1',"") - let g:netrw_port = substitute(a:choice,scpurm,'\2',"") - let b:netrw_fname = substitute(a:choice,scpurm,'\3',"") + "......................................... + " NetRead: (ftp + machine,id,passwd,filename) NetRead Method #3 {{{3 + elseif b:netrw_method == 3 " read with ftp + machine, id, passwd, and fname + " Construct execution string (four lines) which will be passed through filter +" call Decho("read via ftp+mipf (method #3)") + let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) + keepj call s:SaveBufVars()|new|keepj call s:RestoreBufVars() + let filtbuf= bufnr("%") + setl ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + keepj put ='open '.g:netrw_machine.' '.g:netrw_port +" call Decho("filter input: ".getline('.')) + else + keepj put ='open '.g:netrw_machine +" call Decho("filter input: ".getline('.')) + endif - " http://user@hostname/...path-to-file - elseif match(a:choice,httpurm) == 0 -" call Decho("http://...") - let b:netrw_method = 5 - let g:netrw_machine= substitute(a:choice,httpurm,'\1',"") - let b:netrw_fname = substitute(a:choice,httpurm,'\2',"") + if exists("g:netrw_uid") && g:netrw_uid != "" + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + keepj put =g:netrw_uid +" call Decho("filter input: ".getline('.')) + if exists("s:netrw_passwd") + keepj put ='\"'.s:netrw_passwd.'\"' + endif +" call Decho("filter input: ".getline('.')) + elseif exists("s:netrw_passwd") + keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('.')) + endif + endif - " dav://hostname[:port]/..path-to-file.. - elseif match(a:choice,davurm) == 0 -" call Decho("dav://...") - let b:netrw_method= 6 - if a:choice =~ '^s' - let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"") - else - let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"") - endif - let b:netrw_fname = substitute(a:choice,davurm,'\3',"") + if exists("g:netrw_ftpmode") && g:netrw_ftpmode != "" + keepj put =g:netrw_ftpmode +" call Decho("filter input: ".getline('.')) + endif + if exists("g:netrw_ftpextracmd") + keepj put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline('.')) + endif + keepj put ='get \"'.netrw_fname.'\" '.tmpfile +" call Decho("filter input: ".getline('.')) - " rsync://user@hostname/...path-to-file - elseif match(a:choice,rsyncurm) == 0 -" call Decho("rsync://...") - let b:netrw_method = 7 - let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"") - let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"") + " perform ftp: + " -i : turns off interactive prompting from ftp + " -n unix : DON'T use <.netrc>, even though it exists + " -n win32: quit being obnoxious about password + keepj norm! 1Gdd +" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options) + exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" +" call Decho("error<".getline(1).">") + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,getline(1),5) + endif + endif + call s:SaveBufVars()|bd!|call s:RestoreBufVars() + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice - " ftp://[user@]hostname[[:#]port]/...path-to-file - elseif match(a:choice,ftpurm) == 0 -" call Decho("ftp://...") - let userid = substitute(a:choice,ftpurm,'\2',"") - let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"") - let g:netrw_port = substitute(a:choice,ftpurm,'\4',"") - let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"") -" call Decho("g:netrw_machine<".g:netrw_machine.">") - if userid != "" - let g:netrw_uid= userid - endif - if exists("s:netrw_passwd") && curmachine != g:netrw_machine - " if there's a change in hostname, require password re-entry - unlet s:netrw_passwd - endif - if exists("g:netrw_uid") && exists("s:netrw_passwd") - let b:netrw_method = 3 - else - if s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc - let b:netrw_method= 2 + "......................................... + " NetRead: (scp) NetRead Method #4 {{{3 + elseif b:netrw_method == 4 " read with scp +" call Decho("read via scp (method #4)") + if exists("g:netrw_port") && g:netrw_port != "" + let useport= " ".g:netrw_scpport." ".g:netrw_port else - if !exists("g:netrw_uid") || g:netrw_uid == "" - call NetUserPass() - elseif !exists("s:netrw_passwd") || s:netrw_passwd == "" - call NetUserPass(g:netrw_uid) - " else just use current g:netrw_uid and s:netrw_passwd + let useport= "" + endif +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)) + exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1) + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " NetRead: (http) NetRead Method #5 (wget) {{{3 + elseif b:netrw_method == 5 +" call Decho("read via http (method #5)") + if g:netrw_http_cmd == "" + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"neither the wget nor the fetch command is available",6) endif - let b:netrw_method= 3 +" call Dret("netrw#NetRead :4 getcwd<".getcwd().">") + return endif - endif - elseif match(a:choice,fetchurm) == 0 -" call Decho("fetch://...") - let b:netrw_method = 8 - let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"") - let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"") - let b:netrw_option = substitute(a:choice,fetchurm,'\4',"") - let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"") + if match(b:netrw_fname,"#") == -1 || exists("g:netrw_http_xcmd") + " using g:netrw_http_cmd (usually elinks, links, curl, wget, or fetch) +" call Decho('using '.g:netrw_http_cmd.' (# not in b:netrw_fname<'.b:netrw_fname.">)") + if exists("g:netrw_http_xcmd") +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1)) + exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)." ".g:netrw_http_xcmd." ".shellescape(tmpfile,1) + else +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.b:netrw_fname,1) + endif + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) - " Issue an ftp : "machine id password [path/]filename" - elseif match(a:choice,mipf) == 0 -" call Decho("(ftp) host id pass file") - let b:netrw_method = 3 - let g:netrw_machine = substitute(a:choice,mipf,'\1',"") - let g:netrw_uid = substitute(a:choice,mipf,'\2',"") - let s:netrw_passwd = substitute(a:choice,mipf,'\3',"") - let b:netrw_fname = substitute(a:choice,mipf,'\4',"") + else + " wget/curl/fetch plus a jump to an in-page marker (ie. http://abc/def.html#aMarker) +" call Decho("wget/curl plus jump (# in b:netrw_fname<".b:netrw_fname.">)") + let netrw_html= substitute(b:netrw_fname,"#.*$","","") + let netrw_tag = substitute(b:netrw_fname,"^.*#","","") +" call Decho("netrw_html<".netrw_html.">") +" call Decho("netrw_tag <".netrw_tag.">") +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1)) + exe s:netrw_silentxfer."!".g:netrw_http_cmd." ".shellescape(tmpfile,1)." ".shellescape("http://".g:netrw_machine.netrw_html,1) + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) +" call Decho('<\s*a\s*name=\s*"'.netrw_tag.'"/') + exe 'keepj norm! 1G/<\s*a\s*name=\s*"'.netrw_tag.'"/'."\" + endif + let b:netrw_lastfile = choice +" call Decho("(NetRead) setl ro") + setl ro - " Issue an ftp: "hostname [path/]filename" - elseif match(a:choice,mf) == 0 -" call Decho("(ftp) host file") - if exists("g:netrw_uid") && exists("s:netrw_passwd") - let b:netrw_method = 3 - let g:netrw_machine = substitute(a:choice,mf,'\1',"") - let b:netrw_fname = substitute(a:choice,mf,'\2',"") + "......................................... + " NetRead: (dav) NetRead Method #6 {{{3 + elseif b:netrw_method == 6 +" call Decho("read via cadaver (method #6)") - elseif s:FileReadable(expand("$HOME/.netrc")) - let b:netrw_method = 2 - let g:netrw_machine = substitute(a:choice,mf,'\1',"") - let b:netrw_fname = substitute(a:choice,mf,'\2',"") - endif + if !executable(g:netrw_dav_cmd) + call netrw#ErrorMsg(s:ERROR,g:netrw_dav_cmd." is not executable",73) +" call Dret("netrw#NetRead : ".g:netrw_dav_cmd." not executable") + return + endif + if g:netrw_dav_cmd =~ "curl" +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1)) + exe s:netrw_silentxfer."!".g:netrw_dav_cmd." ".shellescape("dav://".g:netrw_machine.b:netrw_fname,1)." ".shellescape(tmpfile,1) + else + " Construct execution string (four lines) which will be passed through filter + let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) + new + setl ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + keepj put ='open '.g:netrw_machine.' '.g:netrw_port + else + keepj put ='open '.g:netrw_machine + endif + if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != "" + keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd + endif + keepj put ='get '.netrw_fname.' '.tmpfile + keepj put ='quit' - " sftp://user@hostname/...path-to-file - elseif match(a:choice,sftpurm) == 0 -" call Decho("sftp://...") - let b:netrw_method = 9 - let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"") - let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"") + " perform cadaver operation: + keepj norm! 1Gdd +" call Decho("executing: %!".g:netrw_dav_cmd) + exe s:netrw_silentxfer."%!".g:netrw_dav_cmd + bd! + endif + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice - " Issue an rcp: hostname:filename" (this one should be last) - elseif match(a:choice,rcphf) == 0 -" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">") - let b:netrw_method = 1 - let userid = substitute(a:choice,rcphf,'\2',"") - let g:netrw_machine = substitute(a:choice,rcphf,'\3',"") - let b:netrw_fname = substitute(a:choice,rcphf,'\4',"") -" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">") -" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">") -" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">") -" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">") - if userid != "" - let g:netrw_uid= userid - endif + "......................................... + " NetRead: (rsync) NetRead Method #7 {{{3 + elseif b:netrw_method == 7 +" call Decho("read via rsync (method #7)") +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1)) + exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".shellescape(tmpfile,1) + let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method) + let b:netrw_lastfile = choice - else - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45) + "......................................... + " NetRead: (fetch) NetRead Method #8 {{{3 + " fetch://[user@]host[:http]/path + elseif b:netrw_method == 8 +" call Decho("read via fetch (method #8)") + if g:netrw_fetch_cmd == "" + if !exists("g:netrw_quiet") + keepj call netrw#ErrorMsg(s:ERROR,"fetch command not available",7) + endif +" call Dret("NetRead") + return + endif + if exists("g:netrw_option") && g:netrw_option == ":https\=" + let netrw_option= "http" + else + let netrw_option= "ftp" + endif +" call Decho("read via fetch for ".netrw_option) + + if exists("g:netrw_uid") && g:netrw_uid != "" && exists("s:netrw_passwd") && s:netrw_passwd != "" +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_uid.':'.s:netrw_passwd.'@'.g:netrw_machine."/".b:netrw_fname,1) + else +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_fetch_cmd." ".shellescape(tmpfile,1)." ".shellescape(netrw_option."://".g:netrw_machine."/".b:netrw_fname,1) + endif + + let result = s:NetrwGetFile(readcmd,tmpfile, b:netrw_method) + let b:netrw_lastfile = choice +" call Decho("(NetRead) setl ro") + setl ro + + "......................................... + " NetRead: (sftp) NetRead Method #9 {{{3 + elseif b:netrw_method == 9 +" call Decho("read via sftp (method #9)") +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile) + exe s:netrw_silentxfer."!".g:netrw_sftp_cmd." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)." ".tmpfile + let result = s:NetrwGetFile(readcmd, tmpfile, b:netrw_method) + let b:netrw_lastfile = choice + + "......................................... + " NetRead: Complain {{{3 + else + call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",8) endif - let b:netrw_method = -1 - endif + endwhile - " remove any leading [:#] from port number - if g:netrw_port != "" - let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','') + " NetRead: cleanup {{{3 + if exists("b:netrw_method") +" call Decho("cleanup b:netrw_method and b:netrw_fname") + unlet b:netrw_method + unlet b:netrw_fname + endif + if s:FileReadable(tmpfile) && tmpfile !~ '.tar.bz2$' && tmpfile !~ '.tar.gz$' && tmpfile !~ '.zip' && tmpfile !~ '.tar' && readcmd != 't' && tmpfile !~ '.tar.xz$' && tmpfile !~ '.txz' +" call Decho("cleanup by deleting tmpfile<".tmpfile.">") + keepj call s:NetrwDelete(tmpfile) endif + keepj call s:NetrwOptionRestore("w:") -" call Decho("a:choice <".a:choice.">") -" call Decho("b:netrw_method <".b:netrw_method.">") -" call Decho("g:netrw_machine<".g:netrw_machine.">") -" call Decho("g:netrw_port <".g:netrw_port.">") -" if exists("g:netrw_uid") "Decho -" call Decho("g:netrw_uid <".g:netrw_uid.">") -" endif "Decho -" if exists("s:netrw_passwd") "Decho -" call Decho("s:netrw_passwd <".s:netrw_passwd.">") -" endif "Decho -" call Decho("b:netrw_fname <".b:netrw_fname.">") -" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method) +" call Dret("netrw#NetRead :5 getcwd<".getcwd().">") endfun " ------------------------------------------------------------------------ -" NetReadFixup: this sort of function is typically written by the user {{{2 -" to handle extra junk that their system's ftp dumps -" into the transfer. This function is provided as an -" example and as a fix for a Windows 95 problem: in my -" experience, win95's ftp always dumped four blank lines -" at the end of the transfer. -if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp - fun! NetReadFixup(method, line1, line2) -" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")") +" netrw#NetWrite: responsible for writing a file over the net {{{2 +fun! netrw#NetWrite(...) range +" call Dfunc("netrw#NetWrite(a:0=".a:0.") ".g:loaded_netrw) - " sanity checks -- attempt to convert inputs to integers - let method = a:method + 0 - let line1 = a:line1 + 0 - let line2 = a:line2 + 0 - if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0 -" call Dret("NetReadFixup") - return - endif + " NetWrite: option handling {{{3 + let mod= 0 + call s:NetrwOptionSave("w:") + call s:NetrwSafeOptions() - if method == 3 " ftp (no <.netrc>) - let fourblanklines= line2 - 3 - if fourblanklines >= line1 - exe "sil keepj ".fourblanklines.",".line2."g/^\s*$/d" - call histdel("/",-1) - endif - endif + " NetWrite: Get Temporary Filename {{{3 + let tmpfile= s:GetTempfile("") + if tmpfile == "" +" call Dret("netrw#NetWrite : unable to get a tempfile!") + return + endif -" call Dret("NetReadFixup") - endfun -endif + if a:0 == 0 + let ichoice = 0 + else + let ichoice = 1 + endif -" --------------------------------------------------------------------- -" NetUserPass: set username and password for subsequent ftp transfer {{{2 -" Usage: :call NetUserPass() -- will prompt for userid and password -" :call NetUserPass("uid") -- will prompt for password -" :call NetUserPass("uid","password") -- sets global userid and password -fun! NetUserPass(...) + let curbufname= expand("%") +" call Decho("curbufname<".curbufname.">") + if &binary + " For binary writes, always write entire file. + " (line numbers don't really make sense for that). + " Also supports the writing of tar and zip files. +" call Decho("(write entire file) sil exe w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)) + exe "sil keepj w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile) + elseif g:netrw_cygwin + " write (selected portion of) file to temporary + let cygtmpfile= substitute(tmpfile,'/cygdrive/\(.\)','\1:','') +" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile)) + exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(cygtmpfile) + else + " write (selected portion of) file to temporary +" call Decho("(write selected portion) sil exe ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile)) + exe "sil keepj ".a:firstline."," . a:lastline . "w! ".fnameescape(v:cmdarg)." ".fnameescape(tmpfile) + endif - " get/set userid - if a:0 == 0 -" call Dfunc("NetUserPass(a:0<".a:0.">)") - if !exists("g:netrw_uid") || g:netrw_uid == "" - " via prompt - let g:netrw_uid= input('Enter username: ') + if curbufname == "" + " if the file is [No Name], and one attempts to Nwrite it, the buffer takes + " on the temporary file's name. Deletion of the temporary file during + " cleanup then causes an error message. + 0file! endif - else " from command line -" call Dfunc("NetUserPass(a:1<".a:1.">)") - let g:netrw_uid= a:1 - endif - " get password - if a:0 <= 1 " via prompt -" call Decho("a:0=".a:0." case <=1:") - let s:netrw_passwd= inputsecret("Enter Password: ") - else " from command line -" call Decho("a:0=".a:0." case >1: a:2<".a:2.">") - let s:netrw_passwd=a:2 - endif + " NetWrite: while choice loop: {{{3 + while ichoice <= a:0 -" call Dret("NetUserPass") -endfun + " Process arguments: {{{4 + " attempt to repeat with previous host-file-etc + if exists("b:netrw_lastfile") && a:0 == 0 +" call Decho("using b:netrw_lastfile<" . b:netrw_lastfile . ">") + let choice = b:netrw_lastfile + let ichoice= ichoice + 1 + else + exe "let choice= a:" . ichoice -" =========================================== -" Shared Browsing Support: {{{1 -" =========================================== + " Reconstruct Choice if choice starts with '"' + if match(choice,"?") == 0 + echomsg 'NetWrite Usage:"' + echomsg ':Nwrite machine:path uses rcp' + echomsg ':Nwrite "machine path" uses ftp with <.netrc>' + echomsg ':Nwrite "machine id password path" uses ftp' + echomsg ':Nwrite dav://[user@]machine/path uses cadaver' + echomsg ':Nwrite fetch://[user@]machine/path uses fetch' + echomsg ':Nwrite ftp://machine[#port]/path uses ftp (autodetects <.netrc>)' + echomsg ':Nwrite rcp://machine/path uses rcp' + echomsg ':Nwrite rsync://[user@]machine/path uses rsync' + echomsg ':Nwrite scp://[user@]machine[[:#]port]/path uses scp' + echomsg ':Nwrite sftp://[user@]machine/path uses sftp' + sleep 4 + break -" --------------------------------------------------------------------- -" s:BrowserMaps: {{{2 -fun! s:BrowserMaps(islocal) -" call Dfunc("s:BrowserMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">") - if a:islocal -" call Decho("make local maps") - nnoremap :call netrw#LocalBrowseCheck(NetrwBrowseChgDir(1,NetrwGetWord())) - nnoremap - :exe "norm! 0"call netrw#LocalBrowseCheck(NetrwBrowseChgDir(1,'../')) - nnoremap a :call NetrwHide(1) - nnoremap mb :call NetrwBookHistHandler(0,b:netrw_curdir) - nnoremap mc :call NetrwMarkFileCopy(1) - nnoremap md :call NetrwMarkFileDiff(1) - nnoremap me :call NetrwMarkFileEdit(1) - nnoremap mf :call NetrwMarkFile(1,NetrwGetWord()) - nnoremap mg :call NetrwMarkFileGrep(1) - nnoremap mh :call NetrwMarkHideSfx(1) - nnoremap mm :call NetrwMarkFileMove(1) - nnoremap mp :call NetrwMarkFilePrint(1) - nnoremap mr :call NetrwMarkFileRegexp(1) - nnoremap ms :call NetrwMarkFileSource(1) - nnoremap mT :call NetrwMarkFileTag(1) - nnoremap mt :call NetrwMarkFileTgt(1) - nnoremap mu :call NetrwUnMarkFile(1) - nnoremap mx :call NetrwMarkFileExe(1) - nnoremap mz :call NetrwMarkFileCompress(1) - nnoremap gb :call NetrwBookHistHandler(1,b:netrw_curdir) - nnoremap gh :call NetrwHidden(1) - nnoremap gp :call NetrwChgPerm(1,b:netrw_curdir) - nnoremap c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir) - nnoremap C :let g:netrw_chgwin= winnr() - nnoremap d :call NetrwMakeDir("") - nnoremap i :call NetrwListStyle(1) - nnoremap I :call NetrwBannerCtrl(1) - nnoremap o :call NetrwSplit(3) - nnoremap O :call NetrwObtain(1) - nnoremap p :call NetrwPreview(NetrwBrowseChgDir(1,NetrwGetWord(),1)) - nnoremap P :call NetrwPrevWinOpen(1) - nnoremap qb :call NetrwBookHistHandler(2,b:netrw_curdir) - nnoremap mB :call NetrwBookHistHandler(6,b:netrw_curdir) - nnoremap qf :call NetrwFileInfo(1,NetrwGetWord()) - nnoremap r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'exe "norm! 0"call NetrwRefresh(1,NetrwBrowseChgDir(1,'./')) - nnoremap s :call NetrwSortStyle(1) - nnoremap S :call NetSortSequence(1) - nnoremap t :call NetrwSplit(4) - nnoremap T :call NetrwSplit(4)norm! gT - nnoremap u :call NetrwBookHistHandler(4,expand("%")) - nnoremap U :call NetrwBookHistHandler(5,expand("%")) - nnoremap v :call NetrwSplit(5) - nnoremap x :call netrw#NetrwBrowseX(NetrwBrowseChgDir(1,NetrwGetWord(),0),0)" - nnoremap % :call NetrwOpenFile(1) - inoremap :call netrw#LocalBrowseCheck(NetrwBrowseChgDir(1,NetrwGetWord())) - inoremap - :exe "norm! 0"call netrw#LocalBrowseCheck(NetrwBrowseChgDir(1,'../')) - inoremap a :call NetrwHide(1) - inoremap mb :call NetrwBookHistHandler(0,b:netrw_curdir) - inoremap mc :call NetrwMarkFileCopy(1) - inoremap md :call NetrwMarkFileDiff(1) - inoremap me :call NetrwMarkFileEdit(1) - inoremap mf :call NetrwMarkFile(1,NetrwGetWord()) - inoremap mg :call NetrwMarkFileGrep(1) - inoremap mh :call NetrwMarkHideSfx(1) - inoremap mm :call NetrwMarkFileMove(1) - inoremap mp :call NetrwMarkFilePrint(1) - inoremap mr :call NetrwMarkFileRegexp(1) - inoremap ms :call NetrwMarkFileSource(1) - inoremap mT :call NetrwMarkFileTag(1) - inoremap mt :call NetrwMarkFileTgt(1) - inoremap mu :call NetrwUnMarkFile(1) - inoremap mx :call NetrwMarkFileExe(1) - inoremap mz :call NetrwMarkFileCompress(1) - inoremap gb :call NetrwBookHistHandler(1,b:netrw_curdir) - inoremap gh :call NetrwHidden(1) - inoremap gp :call NetrwChgPerm(1,b:netrw_curdir) - inoremap c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir) - inoremap C :let g:netrw_chgwin= winnr() - inoremap d :call NetrwMakeDir("") - inoremap i :call NetrwListStyle(1) - inoremap I :call NetrwBannerCtrl(1) - inoremap o :call NetrwSplit(3) - inoremap O :call NetrwObtain(1) - inoremap p :call NetrwPreview(NetrwBrowseChgDir(1,NetrwGetWord(),1)) - inoremap P :call NetrwPrevWinOpen(1) - inoremap qb :call NetrwBookHistHandler(2,b:netrw_curdir) - inoremap mB :call NetrwBookHistHandler(6,b:netrw_curdir) - inoremap qf :call NetrwFileInfo(1,NetrwGetWord()) - inoremap r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'exe "norm! 0"call NetrwRefresh(1,NetrwBrowseChgDir(1,'./')) - inoremap s :call NetrwSortStyle(1) - inoremap S :call NetSortSequence(1) - inoremap t :call NetrwSplit(4) - inoremap T :call NetrwSplit(4)norm! gT - inoremap u :call NetrwBookHistHandler(4,expand("%")) - inoremap U :call NetrwBookHistHandler(5,expand("%")) - inoremap v :call NetrwSplit(5) - inoremap x :call netrw#NetrwBrowseX(NetrwBrowseChgDir(1,NetrwGetWord(),0),0)" - inoremap % :call NetrwOpenFile(1) - if !hasmapto('NetrwHideEdit') - nmap NetrwHideEdit - imap NetrwHideEdit - endif - nnoremap NetrwHideEdit :call NetrwHideEdit(1) - if !hasmapto('NetrwRefresh') - nmap NetrwRefresh - imap NetrwRefresh + elseif match(choice,"^\"") != -1 + if match(choice,"\"$") != -1 + " case "..." + let choice=strpart(choice,1,strlen(choice)-2) + else + " case "... ... ..." + let choice = strpart(choice,1,strlen(choice)-1) + let wholechoice = "" + + while match(choice,"\"$") == -1 + let wholechoice= wholechoice . " " . choice + let ichoice = ichoice + 1 + if choice > a:0 + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"Unbalanced string in filename '". wholechoice ."'",13) + endif +" call Dret("netrw#NetWrite") + return + endif + let choice= a:{ichoice} + endwhile + let choice= strpart(wholechoice,1,strlen(wholechoice)-1) . " " . strpart(choice,0,strlen(choice)-1) + endif + endif endif - nnoremap NetrwRefresh :call NetrwRefresh(1,NetrwBrowseChgDir(1,'./')) - if s:didstarstar || !mapcheck("","n") - nnoremap :Nexplore - inoremap :Nexplore + let ichoice= ichoice + 1 +" call Decho("choice<" . choice . "> ichoice=".ichoice) + + " Determine method of write (ftp, rcp, etc) {{{4 + keepj call s:NetrwMethod(choice) + if !exists("b:netrw_method") || b:netrw_method < 0 +" call Dfunc("netrw#NetWrite : unsupported method") + return endif - if s:didstarstar || !mapcheck("","n") - nnoremap :Pexplore - inoremap :Pexplore + + " ============= + " NetWrite: Perform Protocol-Based Write {{{3 + " ============================ + if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 + echo "(netrw) Processing your write request..." +" call Decho("(netrw) Processing your write request...") endif - let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape) - if g:netrw_mousemaps == 1 - nnoremap :call NetrwLeftmouse(1) - nnoremap :call NetrwPrevWinOpen(1) - nnoremap :call NetrwMarkFile(1,NetrwGetWord()) - exe 'nnoremap :call NetrwLocalRm("'.mapsafecurdir.'")' - exe 'vnoremap :call NetrwLocalRm("'.mapsafecurdir.'")' - inoremap :call NetrwLeftmouse(1) - inoremap :call NetrwPrevWinOpen(1) - inoremap :call NetrwMarkFile(1,NetrwGetWord()) - exe 'inoremap :call NetrwLocalRm("'.mapsafecurdir.'")' + + "......................................... + " NetWrite: (rcp) NetWrite Method #1 {{{3 + if b:netrw_method == 1 +" call Decho("write via rcp (method #1)") + if s:netrw_has_nt_rcp == 1 + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_machine .'.'. g:netrw_uid + else + let uid_machine = g:netrw_machine .'.'. $USERNAME + endif + else + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_uid .'@'. g:netrw_machine + else + let uid_machine = g:netrw_machine + endif + endif +" call Decho("executing: !".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_rcp_cmd." ".s:netrw_rcpmode." ".shellescape(tmpfile,1)." ".shellescape(uid_machine.":".b:netrw_fname,1) + let b:netrw_lastfile = choice + + "......................................... + " NetWrite: (ftp + <.netrc>) NetWrite Method #2 {{{3 + elseif b:netrw_method == 2 +" call Decho("write via ftp+.netrc (method #2)") + let netrw_fname = b:netrw_fname + + " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead + let bhkeep = &l:bh + let curbuf = bufnr("%") + setl bh=hide + keepalt enew + +" call Decho("filter input window#".winnr()) + setl ff=unix + keepj put =g:netrw_ftpmode +" call Decho("filter input: ".getline('$')) + if exists("g:netrw_ftpextracmd") + keepj put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline("$")) + endif + keepj call setline(line("$")+1,'put "'.tmpfile.'" "'.netrw_fname.'"') +" call Decho("filter input: ".getline("$")) + if exists("g:netrw_port") && g:netrw_port != "" +" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) + exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) + else +" call Decho("filter input window#".winnr()) +" call Decho("executing: %!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) + endif + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" + if !exists("g:netrw_quiet") + keepj call netrw#ErrorMsg(s:ERROR,getline(1),14) + endif + let mod=1 + endif + + " remove enew buffer (quietly) + let filtbuf= bufnr("%") + exe curbuf."b!" + let &l:bh = bhkeep + exe filtbuf."bw!" + + let b:netrw_lastfile = choice + + "......................................... + " NetWrite: (ftp + machine, id, passwd, filename) NetWrite Method #3 {{{3 + elseif b:netrw_method == 3 + " Construct execution string (three or more lines) which will be passed through filter +" call Decho("read via ftp+mipf (method #3)") + let netrw_fname = b:netrw_fname + let bhkeep = &l:bh + + " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead + let curbuf = bufnr("%") + setl bh=hide + keepalt enew + setl ff=unix + + if exists("g:netrw_port") && g:netrw_port != "" + keepj put ='open '.g:netrw_machine.' '.g:netrw_port +" call Decho("filter input: ".getline('.')) + else + keepj put ='open '.g:netrw_machine +" call Decho("filter input: ".getline('.')) + endif + if exists("g:netrw_uid") && g:netrw_uid != "" + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + keepj put =g:netrw_uid +" call Decho("filter input: ".getline('.')) + if exists("s:netrw_passwd") && s:netrw_passwd != "" + keepj put ='\"'.s:netrw_passwd.'\"' + endif +" call Decho("filter input: ".getline('.')) + elseif exists("s:netrw_passwd") && s:netrw_passwd != "" + keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('.')) + endif + endif + keepj put =g:netrw_ftpmode +" call Decho("filter input: ".getline('$')) + if exists("g:netrw_ftpextracmd") + keepj put =g:netrw_ftpextracmd +" call Decho("filter input: ".getline("$")) + endif + keepj put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"' +" call Decho("filter input: ".getline('.')) + " save choice/id/password for future use + let b:netrw_lastfile = choice + + " perform ftp: + " -i : turns off interactive prompting from ftp + " -n unix : DON'T use <.netrc>, even though it exists + " -n win32: quit being obnoxious about password + keepj norm! 1Gdd +" call Decho("executing: %!".s:netrw_ftp_cmd." ".g:netrw_ftp_options) + exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options + " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) + if getline(1) !~ "^$" + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,getline(1),15) + endif + let mod=1 + endif + + " remove enew buffer (quietly) + let filtbuf= bufnr("%") + exe curbuf."b!" + let &l:bh= bhkeep + exe filtbuf."bw!" + + "......................................... + " NetWrite: (scp) NetWrite Method #4 {{{3 + elseif b:netrw_method == 4 +" call Decho("write via scp (method #4)") + if exists("g:netrw_port") && g:netrw_port != "" + let useport= " ".g:netrw_scpport." ".fnameescape(g:netrw_port) + else + let useport= "" + endif +" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_scp_cmd.useport." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1) + let b:netrw_lastfile = choice + + "......................................... + " NetWrite: (http) NetWrite Method #5 {{{3 + elseif b:netrw_method == 5 +" call Decho("write via http (method #5)") + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"currently does not support writing using http:",16) + endif + + "......................................... + " NetWrite: (dav) NetWrite Method #6 (cadaver) {{{3 + elseif b:netrw_method == 6 +" call Decho("write via cadaver (method #6)") + + " Construct execution string (four lines) which will be passed through filter + let netrw_fname = escape(b:netrw_fname,g:netrw_fname_escape) + let bhkeep = &l:bh + + " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead + let curbuf = bufnr("%") + setl bh=hide + keepalt enew + + setl ff=unix + if exists("g:netrw_port") && g:netrw_port != "" + keepj put ='open '.g:netrw_machine.' '.g:netrw_port + else + keepj put ='open '.g:netrw_machine + endif + if exists("g:netrw_uid") && exists("s:netrw_passwd") && g:netrw_uid != "" + keepj put ='user '.g:netrw_uid.' '.s:netrw_passwd + endif + keepj put ='put '.tmpfile.' '.netrw_fname + + " perform cadaver operation: + keepj norm! 1Gdd +" call Decho("executing: %!".g:netrw_dav_cmd) + exe s:netrw_silentxfer."%!".g:netrw_dav_cmd + + " remove enew buffer (quietly) + let filtbuf= bufnr("%") + exe curbuf."b!" + let &l:bh = bhkeep + exe filtbuf."bw!" + + let b:netrw_lastfile = choice + + "......................................... + " NetWrite: (rsync) NetWrite Method #7 {{{3 + elseif b:netrw_method == 7 +" call Decho("write via rsync (method #7)") +" call Decho("executing: !".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1)) + exe s:netrw_silentxfer."!".g:netrw_rsync_cmd." ".shellescape(tmpfile,1)." ".shellescape(g:netrw_machine.":".b:netrw_fname,1) + let b:netrw_lastfile = choice + + "......................................... + " NetWrite: (sftp) NetWrite Method #9 {{{3 + elseif b:netrw_method == 9 +" call Decho("write via sftp (method #9)") + let netrw_fname= escape(b:netrw_fname,g:netrw_fname_escape) + if exists("g:netrw_uid") && ( g:netrw_uid != "" ) + let uid_machine = g:netrw_uid .'@'. g:netrw_machine + else + let uid_machine = g:netrw_machine + endif + + " formerly just a "new...bd!", that changed the window sizes when equalalways. Using enew workaround instead + let bhkeep = &l:bh + let curbuf = bufnr("%") + setl bh=hide + keepalt enew + + setl ff=unix + call setline(1,'put "'.escape(tmpfile,'\').'" '.netrw_fname) +" call Decho("filter input: ".getline('.')) +" call Decho("executing: %!".g:netrw_sftp_cmd.' '.shellescape(uid_machine,1)) + let sftpcmd= substitute(g:netrw_sftp_cmd,"%TEMPFILE%",escape(tmpfile,'\'),"g") + exe s:netrw_silentxfer."%!".sftpcmd.' '.shellescape(uid_machine,1) + let filtbuf= bufnr("%") + exe curbuf."b!" + let &l:bh = bhkeep + exe filtbuf."bw!" + let b:netrw_lastfile = choice + + "......................................... + " NetWrite: Complain {{{3 + else + call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",17) + let leavemod= 1 endif - exe 'nnoremap :call NetrwLocalRm("'.mapsafecurdir.'")' - exe 'nnoremap D :call NetrwLocalRm("'.mapsafecurdir.'")' - exe 'nnoremap R :call NetrwLocalRename("'.mapsafecurdir.'")' - exe 'nnoremap m :call NetrwMakeDir("")' - exe 'vnoremap :call NetrwLocalRm("'.mapsafecurdir.'")' - exe 'vnoremap D :call NetrwLocalRm("'.mapsafecurdir.'")' - exe 'vnoremap R :call NetrwLocalRename("'.mapsafecurdir.'")' - exe 'inoremap :call NetrwLocalRm("'.mapsafecurdir.'")' - exe 'inoremap D :call NetrwLocalRm("'.mapsafecurdir.'")' - exe 'inoremap R :call NetrwLocalRename("'.mapsafecurdir.'")' - exe 'inoremap m :call NetrwMakeDir("")' - nnoremap :he netrw-quickhelp + endwhile - else " remote -" call Decho("make remote maps") - call s:RemotePathAnalysis(b:netrw_curdir) - nnoremap :call NetrwBrowse(0,NetrwBrowseChgDir(0,NetrwGetWord())) - nnoremap :call NetrwRefresh(0,NetrwBrowseChgDir(0,'./')) - nnoremap - :exe "norm! 0"call NetrwBrowse(0,NetrwBrowseChgDir(0,'../')) - nnoremap a :call NetrwHide(0) - nnoremap mb :call NetrwBookHistHandler(0,b:netrw_curdir) - nnoremap mc :call NetrwMarkFileCopy(0) - nnoremap md :call NetrwMarkFileDiff(0) - nnoremap me :call NetrwMarkFileEdit(0) - nnoremap mf :call NetrwMarkFile(0,NetrwGetWord()) - nnoremap mg :call NetrwMarkFileGrep(0) - nnoremap mh :call NetrwMarkHideSfx(0) - nnoremap mm :call NetrwMarkFileMove(0) - nnoremap mp :call NetrwMarkFilePrint(0) - nnoremap mr :call NetrwMarkFileRegexp(0) - nnoremap ms :call NetrwMarkFileSource(0) - nnoremap mT :call NetrwMarkFileTag(0) - nnoremap mt :call NetrwMarkFileTgt(0) - nnoremap mu :call NetrwUnMarkFile(0) - nnoremap mx :call NetrwMarkFileExe(0) - nnoremap mz :call NetrwMarkFileCompress(0) - nnoremap gb :call NetrwBookHistHandler(1,b:netrw_cur) - nnoremap gh :call NetrwHidden(0) - nnoremap gp :call NetrwChgPerm(0,b:netrw_curdir) - nnoremap C :let g:netrw_chgwin= winnr() - nnoremap i :call NetrwListStyle(0) - nnoremap I :call NetrwBannerCtrl(1) - nnoremap o :call NetrwSplit(0) - nnoremap O :call NetrwObtain(0) - nnoremap p :call NetrwPreview(NetrwBrowseChgDir(1,NetrwGetWord(),1)) - nnoremap P :call NetrwPrevWinOpen(0) - nnoremap qb :call NetrwBookHistHandler(2,b:netrw_curdir) - nnoremap mB :call NetrwBookHistHandler(6,b:netrw_curdir) - nnoremap qf :call NetrwFileInfo(0,NetrwGetWord()) - nnoremap r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'exe "norm! 0"call NetrwBrowse(0,NetrwBrowseChgDir(0,'./')) - nnoremap s :call NetrwSortStyle(0) - nnoremap S :call NetSortSequence(0) - nnoremap t :call NetrwSplit(1) - nnoremap T :call NetrwSplit(1)norm! gT - nnoremap u :call NetrwBookHistHandler(4,b:netrw_curdir) - nnoremap U :call NetrwBookHistHandler(5,b:netrw_curdir) - nnoremap v :call NetrwSplit(2) - nnoremap x :call netrw#NetrwBrowseX(NetrwBrowseChgDir(0,NetrwGetWord()),1) - nnoremap % :call NetrwOpenFile(0) - inoremap :call NetrwBrowse(0,NetrwBrowseChgDir(0,NetrwGetWord())) - inoremap :call NetrwRefresh(0,NetrwBrowseChgDir(0,'./')) - inoremap - :exe "norm! 0"call NetrwBrowse(0,NetrwBrowseChgDir(0,'../')) - inoremap a :call NetrwHide(0) - inoremap mb :call NetrwBookHistHandler(0,b:netrw_curdir) - inoremap mc :call NetrwMarkFileCopy(0) - inoremap md :call NetrwMarkFileDiff(0) - inoremap me :call NetrwMarkFileEdit(0) - inoremap mf :call NetrwMarkFile(0,NetrwGetWord()) - inoremap mg :call NetrwMarkFileGrep(0) - inoremap mh :call NetrwMarkHideSfx(0) - inoremap mm :call NetrwMarkFileMove(0) - inoremap mp :call NetrwMarkFilePrint(0) - inoremap mr :call NetrwMarkFileRegexp(0) - inoremap ms :call NetrwMarkFileSource(0) - inoremap mT :call NetrwMarkFileTag(0) - inoremap mt :call NetrwMarkFileTgt(0) - inoremap mu :call NetrwUnMarkFile(0) - inoremap mx :call NetrwMarkFileExe(0) - inoremap mz :call NetrwMarkFileCompress(0) - inoremap gb :call NetrwBookHistHandler(1,b:netrw_cur) - inoremap gh :call NetrwHidden(0) - inoremap gp :call NetrwChgPerm(0,b:netrw_curdir) - inoremap C :let g:netrw_chgwin= winnr() - inoremap i :call NetrwListStyle(0) - inoremap I :call NetrwBannerCtrl(1) - inoremap o :call NetrwSplit(0) - inoremap O :call NetrwObtain(0) - inoremap p :call NetrwPreview(NetrwBrowseChgDir(1,NetrwGetWord(),1)) - inoremap P :call NetrwPrevWinOpen(0) - inoremap qb :call NetrwBookHistHandler(2,b:netrw_curdir) - inoremap mB :call NetrwBookHistHandler(6,b:netrw_curdir) - inoremap qf :call NetrwFileInfo(0,NetrwGetWord()) - inoremap r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'exe "norm! 0"call NetrwBrowse(0,NetrwBrowseChgDir(0,'./')) - inoremap s :call NetrwSortStyle(0) - inoremap S :call NetSortSequence(0) - inoremap t :call NetrwSplit(1) - inoremap T :call NetrwSplit(1)norm! gT - inoremap u :call NetrwBookHistHandler(4,b:netrw_curdir) - inoremap U :call NetrwBookHistHandler(5,b:netrw_curdir) - inoremap v :call NetrwSplit(2) - inoremap x :call netrw#NetrwBrowseX(NetrwBrowseChgDir(0,NetrwGetWord()),1) - inoremap % :call NetrwOpenFile(0) - if !hasmapto('NetrwHideEdit') - nmap NetrwHideEdit - imap NetrwHideEdit + " NetWrite: Cleanup: {{{3 +" call Decho("cleanup") + if s:FileReadable(tmpfile) +" call Decho("tmpfile<".tmpfile."> readable, will now delete it") + call s:NetrwDelete(tmpfile) + endif + call s:NetrwOptionRestore("w:") + + if a:firstline == 1 && a:lastline == line("$") + " restore modifiability; usually equivalent to set nomod + let &mod= mod +" call Decho("(NetWrite) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") + elseif !exists("leavemod") + " indicate that the buffer has not been modified since last written +" call Decho("(NetWrite) set nomod") + set nomod +" call Decho("(NetWrite) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") + endif + +" call Dret("netrw#NetWrite") +endfun + +" --------------------------------------------------------------------- +" netrw#NetSource: source a remotely hosted vim script {{{2 +" uses NetRead to get a copy of the file into a temporarily file, +" then sources that file, +" then removes that file. +fun! netrw#NetSource(...) +" call Dfunc("netrw#NetSource() a:0=".a:0) + if a:0 > 0 && a:1 == '?' + " give help + echomsg 'NetSource Usage:' + echomsg ':Nsource dav://machine[:port]/path uses cadaver' + echomsg ':Nsource fetch://machine/path uses fetch' + echomsg ':Nsource ftp://[user@]machine[:port]/path uses ftp autodetects <.netrc>' + echomsg ':Nsource http[s]://[user@]machine/path uses http wget' + echomsg ':Nsource rcp://[user@]machine/path uses rcp' + echomsg ':Nsource rsync://machine[:port]/path uses rsync' + echomsg ':Nsource scp://[user@]machine[[:#]port]/path uses scp' + echomsg ':Nsource sftp://[user@]machine[[:#]port]/path uses sftp' + sleep 4 + else + let i= 1 + while i <= a:0 + call netrw#NetRead(3,a:{i}) +" call Decho("(netrw#NetSource) s:netread_tmpfile<".s:netrw_tmpfile.">") + if s:FileReadable(s:netrw_tmpfile) +" call Decho("(netrw#NetSource) exe so ".fnameescape(s:netrw_tmpfile)) + exe "so ".fnameescape(s:netrw_tmpfile) +" call Decho("(netrw#NetSource) delete(".s:netrw_tmpfile.")") + call delete(s:netrw_tmpfile) + unlet s:netrw_tmpfile + else + call netrw#ErrorMsg(s:ERROR,"unable to source <".a:{i}.">!",48) + endif + let i= i + 1 + endwhile + endif +" call Dret("netrw#NetSource") +endfun + +" =========================================== +" s:NetrwGetFile: Function to read temporary file "tfile" with command "readcmd". {{{2 +" readcmd == %r : replace buffer with newly read file +" == 0r : read file at top of buffer +" == r : read file after current line +" == t : leave file in temporary form (ie. don't read into buffer) +fun! s:NetrwGetFile(readcmd, tfile, method) +" call Dfunc("NetrwGetFile(readcmd<".a:readcmd.">,tfile<".a:tfile."> method<".a:method.">)") + + " readcmd=='t': simply do nothing + if a:readcmd == 't' +" call Decho("(NetrwGetFile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") +" call Dret("NetrwGetFile : skip read of <".a:tfile.">") + return + endif + + " get name of remote filename (ie. url and all) + let rfile= bufname("%") +" call Decho("rfile<".rfile.">") + + if exists("*NetReadFixup") + " for the use of NetReadFixup (not otherwise used internally) + let line2= line("$") + endif + + if a:readcmd[0] == '%' + " get file into buffer +" call Decho("get file into buffer") + + " rename the current buffer to the temp file (ie. tfile) + if g:netrw_cygwin + let tfile= substitute(a:tfile,'/cygdrive/\(.\)','\1:','') + else + let tfile= a:tfile endif - nnoremap NetrwHideEdit :call NetrwHideEdit(0) - if !hasmapto('NetrwRefresh') - nmap NetrwRefresh - imap NetrwRefresh +" call Decho("exe sil! keepalt file ".fnameescape(tfile)) + exe "sil! keepalt file ".fnameescape(tfile) + + " edit temporary file (ie. read the temporary file in) + if rfile =~ '\.zip$' +" call Decho("handling remote zip file with zip#Browse(tfile<".tfile.">)") + call zip#Browse(tfile) + elseif rfile =~ '\.tar$' +" call Decho("handling remote tar file with tar#Browse(tfile<".tfile.">)") + call tar#Browse(tfile) + elseif rfile =~ '\.tar\.gz$' +" call Decho("handling remote gzip-compressed tar file") + call tar#Browse(tfile) + elseif rfile =~ '\.tar\.bz2$' +" call Decho("handling remote bz2-compressed tar file") + call tar#Browse(tfile) + elseif rfile =~ '\.tar\.xz$' +" call Decho("handling remote xz-compressed tar file") + call tar#Browse(tfile) + elseif rfile =~ '\.txz$' +" call Decho("handling remote xz-compressed tar file (.txz)") + call tar#Browse(tfile) + else +" call Decho("edit temporary file") + e! endif - let mapsafepath = escape(s:path, s:netrw_map_escape) - let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape) + " rename buffer back to remote filename +" call Decho("exe sil! keepalt file ".fnameescape(rfile)) + exe "sil! keepj keepalt file ".fnameescape(rfile) - nnoremap NetrwRefresh :call NetrwRefresh(0,NetrwBrowseChgDir(0,'./')) - if g:netrw_mousemaps == 1 - nnoremap :call NetrwLeftmouse(0) - nnoremap :call NetrwPrevWinOpen(0) - nnoremap :call NetrwMarkFile(0,NetrwGetWord()) - exe 'nnoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' - exe 'vnoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' - inoremap :call NetrwLeftmouse(0) - inoremap :call NetrwPrevWinOpen(0) - inoremap :call NetrwMarkFile(0,NetrwGetWord()) - exe 'inoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' - endif - exe 'nnoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' - exe 'nnoremap d :call NetrwMakeDir("'.mapsafeusermach.'")' - exe 'nnoremap D :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' - exe 'nnoremap R :call NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")' - exe 'vnoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' - exe 'vnoremap D :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' - exe 'vnoremap R :call NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")' - exe 'inoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' - exe 'inoremap d :call NetrwMakeDir("'.mapsafeusermach.'")' - exe 'inoremap D :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' - exe 'inoremap R :call NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")' - nnoremap :he netrw-quickhelp - inoremap :he netrw-quickhelp + " Detect filetype of local version of remote file. + " Note that isk must not include a "/" for scripts.vim + " to process this detection correctly. +" call Decho("detect filetype of local version of remote file") + let iskkeep= &l:isk + setl isk-=/ + let &l:isk= iskkeep +" call Dredir("renamed buffer back to remote filename<".rfile."> : expand(%)<".expand("%").">","ls!") + let line1 = 1 + let line2 = line("$") + + elseif s:FileReadable(a:tfile) + " read file after current line +" call Decho("read file<".a:tfile."> after current line") + let curline = line(".") + let lastline= line("$") +" call Decho("exe<".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile)."> line#".curline) + exe "keepj ".a:readcmd." ".fnameescape(v:cmdarg)." ".fnameescape(a:tfile) + let line1= curline + 1 + let line2= line("$") - lastline + 1 + + else + " not readable +" call Decho("(NetrwGetFile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") +" call Decho("tfile<".a:tfile."> not readable") + keepj call netrw#ErrorMsg(s:WARNING,"file <".a:tfile."> not readable",9) +" call Dret("NetrwGetFile : tfile<".a:tfile."> not readable") + return endif - call s:SetRexDir(a:islocal,b:netrw_curdir) -" call Dret("s:BrowserMaps") -endfun -" --------------------------------------------------------------------- -" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2 -fun! s:ExplorePatHls(pattern) -" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)") - let repat= substitute(a:pattern,'^**/\{1,2}','','') -" call Decho("repat<".repat.">") - let repat= escape(repat,'][.\') -" call Decho("repat<".repat.">") - let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>' -" call Dret("s:ExplorePatHls repat<".repat.">") - return repat + " User-provided (ie. optional) fix-it-up command + if exists("*NetReadFixup") +" call Decho("calling NetReadFixup(method<".a:method."> line1=".line1." line2=".line2.")") + keepj call NetReadFixup(a:method, line1, line2) +" else " Decho +" call Decho("NetReadFixup() not called, doesn't exist (line1=".line1." line2=".line2.")") + endif + + if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu + " update the Buffers menu + keepj call s:UpdateBuffersMenu() + endif + +" call Decho("readcmd<".a:readcmd."> cmdarg<".v:cmdarg."> tfile<".a:tfile."> readable=".s:FileReadable(a:tfile)) + + " make sure file is being displayed +" redraw! + +" call Decho("(NetrwGetFile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") +" call Dret("NetrwGetFile") endfun -" --------------------------------------------------------------------- -" s:NetrwBookHistHandler: {{{2 -" 0: (user: ) bookmark current directory -" 1: (user: ) change to the bookmarked directory -" 2: (user: ) list bookmarks -" 3: (browsing) record current directory history -" 4: (user: ) go up (previous) bookmark -" 5: (user: ) go down (next) bookmark -" 6: (user: ) delete bookmark -fun! s:NetrwBookHistHandler(chg,curdir) -" call Dfunc("s:NetrwBookHistHandler(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." histcnt=".g:netrw_dirhist_cnt." histmax=".g:netrw_dirhistmax) +" ------------------------------------------------------------------------ +" s:NetrwMethod: determine method of transfer {{{2 +" Input: +" choice = url [protocol:]//[userid@]hostname[:port]/[path-to-file] +" Output: +" b:netrw_method= 1: rcp +" 2: ftp + <.netrc> +" 3: ftp + machine, id, password, and [path]filename +" 4: scp +" 5: http[s] (wget) +" 6: dav +" 7: rsync +" 8: fetch +" 9: sftp +" g:netrw_machine= hostname +" b:netrw_fname = filename +" g:netrw_port = optional port number (for ftp) +" g:netrw_choice = copy of input url (choice) +fun! s:NetrwMethod(choice) +" call Dfunc("NetrwMethod(a:choice<".a:choice.">)") - if a:chg == 0 - " bookmark the current directory -" call Decho("(user: ) bookmark the current directory") - if !exists("g:netrw_bookmarklist") - let g:netrw_bookmarklist= [] - endif - if index(g:netrw_bookmarklist,a:curdir) == -1 - " curdir not currently in g:netrw_bookmarklist, so include it - call add(g:netrw_bookmarklist,a:curdir) - call sort(g:netrw_bookmarklist) + " sanity check: choice should have at least three slashes in it + if strlen(substitute(a:choice,'[^/]','','g')) < 3 + call netrw#ErrorMsg(s:ERROR,"not a netrw-style url; netrw uses protocol://[user@]hostname[:port]/[path])",78) + let b:netrw_method = -1 +" call Dret("NetrwMethod : incorrect url format<".a:choice.">") + return endif - echo "bookmarked the current directory" - elseif a:chg == 1 - " change to the bookmarked directory -" call Decho("(user: <".v:count."mb>) change to the bookmarked directory") - if exists("g:netrw_bookmarklist[v:count-1]") - exe "e ".fnameescape(g:netrw_bookmarklist[v:count-1]) + " record current g:netrw_machine, if any + " curmachine used if protocol == ftp and no .netrc + if exists("g:netrw_machine") + let curmachine= g:netrw_machine +" call Decho("curmachine<".curmachine.">") else - echomsg "Sorry, bookmark#".v:count." doesn't exist!" + let curmachine= "N O T A HOST" endif - - elseif a:chg == 2 -" redraw! - let didwork= 0 - " list user's bookmarks -" call Decho("(user: ) list user's bookmarks") - if exists("g:netrw_bookmarklist") -" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks') - let cnt= 1 - for bmd in g:netrw_bookmarklist -" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1]) - echo "Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1] - let didwork = 1 - let cnt = cnt + 1 - endfor + if exists("g:netrw_port") + let netrw_port= g:netrw_port endif - " list directory history - let cnt = g:netrw_dirhist_cnt - let first = 1 - let histcnt = 0 - while ( first || cnt != g:netrw_dirhist_cnt ) -" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt) - let histcnt= histcnt + 1 - if exists("g:netrw_dirhist_{cnt}") -" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt}) - echo "Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt} - let didwork= 1 - endif - let first = 0 - let cnt = ( cnt - 1 ) % g:netrw_dirhistmax - if cnt < 0 - let cnt= cnt + g:netrw_dirhistmax - endif - endwhile - if didwork - call inputsave()|call input("Press to continue")|call inputrestore() + " insure that netrw_ftp_cmd starts off every method determination + " with the current g:netrw_ftp_cmd + let s:netrw_ftp_cmd= g:netrw_ftp_cmd + + " initialization + let b:netrw_method = 0 + let g:netrw_machine = "" + let b:netrw_fname = "" + let g:netrw_port = "" + let g:netrw_choice = a:choice + + " Patterns: + " mipf : a:machine a:id password filename Use ftp + " mf : a:machine filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd + " ftpurm : ftp://[user@]host[[#:]port]/filename Use ftp + <.netrc> or g:netrw_uid s:netrw_passwd + " rcpurm : rcp://[user@]host/filename Use rcp + " rcphf : [user@]host:filename Use rcp + " scpurm : scp://[user@]host[[#:]port]/filename Use scp + " httpurm : http[s]://[user@]host/filename Use wget + " davurm : dav[s]://host[:port]/path Use cadaver/curl + " rsyncurm : rsync://host[:port]/path Use rsync + " fetchurm : fetch://[user@]host[:http]/filename Use fetch (defaults to ftp, override for http) + " sftpurm : sftp://[user@]host/filename Use scp + let mipf = '^\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)\s\+\(\S\+\)$' + let mf = '^\(\S\+\)\s\+\(\S\+\)$' +" let ftpurm = '^ftp://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$' +" let rcpurm = '^rcp://\%(\([^/@]\{-}\)@\)\=\([^/]\{-}\)/\(.*\)$' +" let fetchurm = '^fetch://\(\([^/@]\{-}\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$' + let ftpurm = '^ftp://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\([#:]\d\+\)\=/\(.*\)$' + let rcpurm = '^rcp://\%(\([^/]*\)@\)\=\([^/]\{-}\)/\(.*\)$' + let rcphf = '^\(\(\h\w*\)@\)\=\(\h\w*\):\([^@]\+\)$' + let scpurm = '^scp://\([^/#:]\+\)\%([#:]\(\d\+\)\)\=/\(.*\)$' + let httpurm = '^https\=://\([^/]\{-}\)\(/.*\)\=$' + let davurm = '^davs\=://\([^/]\+\)/\(.*/\)\([-_.~[:alnum:]]\+\)$' + let rsyncurm = '^rsync://\([^/]\{-}\)/\(.*\)\=$' + let fetchurm = '^fetch://\(\([^/]*\)@\)\=\([^/#:]\{-}\)\(:http\)\=/\(.*\)$' + let sftpurm = '^sftp://\([^/]\{-}\)/\(.*\)\=$' + +" call Decho("determine method:") + " Determine Method + " Method#1: rcp://user@hostname/...path-to-file {{{3 + if match(a:choice,rcpurm) == 0 +" call Decho("rcp://...") + let b:netrw_method = 1 + let userid = substitute(a:choice,rcpurm,'\1',"") + let g:netrw_machine = substitute(a:choice,rcpurm,'\2',"") + let b:netrw_fname = substitute(a:choice,rcpurm,'\3',"") + if userid != "" + let g:netrw_uid= userid endif - elseif a:chg == 3 - " saves most recently visited directories (when they differ) -" call Decho("(browsing) record curdir history") - if !exists("g:netrw_dirhist_cnt") || !exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}") || g:netrw_dirhist_{g:netrw_dirhist_cnt} != a:curdir - let g:netrw_dirhist_cnt = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax - let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir -" call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">") + " Method#4: scp://user@hostname/...path-to-file {{{3 + elseif match(a:choice,scpurm) == 0 +" call Decho("scp://...") + let b:netrw_method = 4 + let g:netrw_machine = substitute(a:choice,scpurm,'\1',"") + let g:netrw_port = substitute(a:choice,scpurm,'\2',"") + let b:netrw_fname = substitute(a:choice,scpurm,'\3',"") + + " Method#5: http[s]://user@hostname/...path-to-file {{{3 + elseif match(a:choice,httpurm) == 0 +" call Decho("http://...") + let b:netrw_method = 5 + let g:netrw_machine= substitute(a:choice,httpurm,'\1',"") + let b:netrw_fname = substitute(a:choice,httpurm,'\2',"") + + " Method#6: dav://hostname[:port]/..path-to-file.. {{{3 + elseif match(a:choice,davurm) == 0 +" call Decho("dav://...") + let b:netrw_method= 6 + if a:choice =~ 'davs:' + let g:netrw_machine= 'https://'.substitute(a:choice,davurm,'\1/\2',"") + else + let g:netrw_machine= 'http://'.substitute(a:choice,davurm,'\1/\2',"") endif + let b:netrw_fname = substitute(a:choice,davurm,'\3',"") - elseif a:chg == 4 - " u: change to the previous directory stored on the history list -" call Decho("(user: ) chg to prev dir from history") - let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax - if g:netrw_dirhist_cnt < 0 - let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax - endif - if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}") -" call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">") - if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") - setlocal ma noro -" call Decho("setlocal ma noro") - keepj %d - setlocal nomod -" call Decho("setlocal nomod") - endif -" " call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})) - exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}) - else - let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax - echo "Sorry, no predecessor directory exists yet" + " Method#7: rsync://user@hostname/...path-to-file {{{3 + elseif match(a:choice,rsyncurm) == 0 +" call Decho("rsync://...") + let b:netrw_method = 7 + let g:netrw_machine= substitute(a:choice,rsyncurm,'\1',"") + let b:netrw_fname = substitute(a:choice,rsyncurm,'\2',"") + + " Methods 2,3: ftp://[user@]hostname[[:#]port]/...path-to-file {{{3 + elseif match(a:choice,ftpurm) == 0 +" call Decho("ftp://...") + let userid = substitute(a:choice,ftpurm,'\2',"") + let g:netrw_machine= substitute(a:choice,ftpurm,'\3',"") + let g:netrw_port = substitute(a:choice,ftpurm,'\4',"") + let b:netrw_fname = substitute(a:choice,ftpurm,'\5',"") +" call Decho("g:netrw_machine<".g:netrw_machine.">") + if userid != "" + let g:netrw_uid= userid endif - elseif a:chg == 5 - " U: change to the subsequent directory stored on the history list -" call Decho("(user: ) chg to next dir from history") - let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax - if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}") -" call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">") - if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") - setlocal ma noro -" call Decho("setlocal ma noro") - keepj %d -" call Decho("removed all lines from buffer (%d)") - setlocal nomod -" call Decho("setlocal nomod") + if curmachine != g:netrw_machine + if exists("s:netwr_hup[".g:netrw_machine."]") + call NetUserPass("ftp:".g:netrw_machine) + elseif exists("s:netrw_passwd") + " if there's a change in hostname, require password re-entry + unlet s:netrw_passwd endif -" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})) - exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}) - else - let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax - if g:netrw_dirhist_cnt < 0 - let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax + if exists("netrw_port") + unlet netrw_port endif - echo "Sorry, no successor directory exists yet" - endif - - elseif a:chg == 6 - " delete the v:count'th bookmark -" call Decho("delete bookmark#".v:count."<".g:netrw_bookmarklist[v:count-1].">") - let savefile= s:NetrwHome()."/.netrwbook" - if filereadable(savefile) - call s:NetrwBookHistSave() " done here to merge bookmarks first - call delete(savefile) endif - call remove(g:netrw_bookmarklist,v:count-1) - endif - call s:NetrwBookmarkMenu() -" call Dret("s:NetrwBookHistHandler") -endfun -" --------------------------------------------------------------------- -" s:NetrwBookHistRead: this function reads bookmarks and history {{{2 -" Sister function: s:NetrwBookHistSave() -fun! s:NetrwBookHistRead() -" call Dfunc("s:NetrwBookHistRead()") - if !exists("s:netrw_initbookhist") - let home = s:NetrwHome() - let savefile= home."/.netrwbook" - if filereadable(savefile) -" call Decho("sourcing .netrwbook") - exe "so ".savefile - endif - let savefile= home."/.netrwhist" - if filereadable(savefile) -" call Decho("sourcing .netrwhist") - exe "so ".savefile + if exists("g:netrw_uid") && exists("s:netrw_passwd") + let b:netrw_method = 3 + else + let host= substitute(g:netrw_machine,'\..*$','','') + if exists("s:netrw_hup[host]") + call NetUserPass("ftp:".host) + + elseif (has("win32") || has("win95") || has("win64") || has("win16")) && s:netrw_ftp_cmd =~ '-[sS]:' +" call Decho("has -s: : s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">") +" call Decho(" g:netrw_ftp_cmd<".g:netrw_ftp_cmd.">") + if g:netrw_ftp_cmd =~ '-[sS]:\S*MACHINE\>' + let s:netrw_ftp_cmd= substitute(g:netrw_ftp_cmd,'\',g:netrw_machine,'') +" call Decho("s:netrw_ftp_cmd<".s:netrw_ftp_cmd.">") + endif + let b:netrw_method= 2 + elseif s:FileReadable(expand("$HOME/.netrc")) && !g:netrw_ignorenetrc +" call Decho("using <".expand("$HOME/.netrc")."> (readable)") + let b:netrw_method= 2 + else + if !exists("g:netrw_uid") || g:netrw_uid == "" + call NetUserPass() + elseif !exists("s:netrw_passwd") || s:netrw_passwd == "" + call NetUserPass(g:netrw_uid) + " else just use current g:netrw_uid and s:netrw_passwd + endif + let b:netrw_method= 3 + endif endif - let s:netrw_initbookhist= 1 - au VimLeave * call s:NetrwBookHistSave() - endif -" call Dret("s:NetrwBookHistRead") -endfun -" --------------------------------------------------------------------- -" s:NetrwBookHistSave: this function saves bookmarks and history {{{2 -" Sister function: s:NetrwBookHistRead() -" I used to do this via viminfo but that appears to -" be unreliable for long-term storage -" COMBAK: does $HOME work under windows??? -fun! s:NetrwBookHistSave() -" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax) - let savefile= s:NetrwHome()."/.netrwhist" - 1split - call s:NetrwEnew() - setlocal cino= com= cpo-=aA fo=nroql2 tw=0 report=10000 noswf - setlocal nocin noai noci magic nospell nohid wig= noaw - setlocal ma noro write - if exists("&acd") | setlocal noacd | endif - silent %d + " Method#8: fetch {{{3 + elseif match(a:choice,fetchurm) == 0 +" call Decho("fetch://...") + let b:netrw_method = 8 + let g:netrw_userid = substitute(a:choice,fetchurm,'\2',"") + let g:netrw_machine= substitute(a:choice,fetchurm,'\3',"") + let b:netrw_option = substitute(a:choice,fetchurm,'\4',"") + let b:netrw_fname = substitute(a:choice,fetchurm,'\5',"") - " save .netrwhist -- no attempt to merge - silent! file .netrwhist - call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax) - call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt) - let lastline = line("$") - let cnt = 1 - while cnt <= g:netrw_dirhist_cnt - call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'") - let cnt= cnt + 1 - endwhile - exe "sil! w! ".savefile + " Method#3: Issue an ftp : "machine id password [path/]filename" {{{3 + elseif match(a:choice,mipf) == 0 +" call Decho("(ftp) host id pass file") + let b:netrw_method = 3 + let g:netrw_machine = substitute(a:choice,mipf,'\1',"") + let g:netrw_uid = substitute(a:choice,mipf,'\2',"") + let s:netrw_passwd = substitute(a:choice,mipf,'\3',"") + let b:netrw_fname = substitute(a:choice,mipf,'\4',"") + call NetUserPass(g:netrw_machine,g:netrw_uid,s:netrw_passwd) - sil keepj %d - if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] - " merge and write .netrwbook - let savefile= s:NetrwHome()."/.netrwbook" + " Method#3: Issue an ftp: "hostname [path/]filename" {{{3 + elseif match(a:choice,mf) == 0 +" call Decho("(ftp) host file") + if exists("g:netrw_uid") && exists("s:netrw_passwd") + let b:netrw_method = 3 + let g:netrw_machine = substitute(a:choice,mf,'\1',"") + let b:netrw_fname = substitute(a:choice,mf,'\2',"") - if filereadable(savefile) - let booklist= deepcopy(g:netrw_bookmarklist) - exe "sil keepj so ".savefile - for bdm in booklist - if index(g:netrw_bookmarklist,bdm) == -1 - call add(g:netrw_bookmarklist,bdm) - endif - endfor - call sort(g:netrw_bookmarklist) - exe "sil! w! ".savefile + elseif s:FileReadable(expand("$HOME/.netrc")) + let b:netrw_method = 2 + let g:netrw_machine = substitute(a:choice,mf,'\1',"") + let b:netrw_fname = substitute(a:choice,mf,'\2',"") endif - " construct and save .netrwbook - call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist)) - exe "sil! w! ".savefile - endif - let bgone= bufnr("%") - q! - exe bgone."bwipe!" - -" call Dret("s:NetrwBookHistSave") -endfun + " Method#9: sftp://user@hostname/...path-to-file {{{3 + elseif match(a:choice,sftpurm) == 0 +" call Decho("sftp://...") + let b:netrw_method = 9 + let g:netrw_machine= substitute(a:choice,sftpurm,'\1',"") + let b:netrw_fname = substitute(a:choice,sftpurm,'\2',"") -" --------------------------------------------------------------------- -" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2 -" list of the contents of a local or remote directory. It is assumed that the -" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted -" with the requested remote hostname first. -fun! s:NetrwBrowse(islocal,dirname) - if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif -" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%")."> win#".winnr()) -" call Decho("tab#".tabpagenr()." win#".winnr()) -" call Dredir("ls!") - if !exists("s:netrw_initbookhist") - call s:NetrwBookHistRead() - endif + " Method#1: Issue an rcp: hostname:filename" (this one should be last) {{{3 + elseif match(a:choice,rcphf) == 0 +" call Decho("(rcp) [user@]host:file) rcphf<".rcphf.">") + let b:netrw_method = 1 + let userid = substitute(a:choice,rcphf,'\2',"") + let g:netrw_machine = substitute(a:choice,rcphf,'\3',"") + let b:netrw_fname = substitute(a:choice,rcphf,'\4',"") +" call Decho('\1<'.substitute(a:choice,rcphf,'\1',"").">") +" call Decho('\2<'.substitute(a:choice,rcphf,'\2',"").">") +" call Decho('\3<'.substitute(a:choice,rcphf,'\3',"").">") +" call Decho('\4<'.substitute(a:choice,rcphf,'\4',"").">") + if userid != "" + let g:netrw_uid= userid + endif - " simplify the dirname (especially for ".."s in dirnames) - if a:dirname !~ '^\a\+://' - let dirname= simplify(a:dirname) + " Cannot Determine Method {{{3 else - let dirname= a:dirname - endif - - if exists("s:netrw_skipbrowse") - unlet s:netrw_skipbrowse -" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) -" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse) - return - endif - if !exists("*shellescape") - call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69) -" call Dret("s:NetrwBrowse : missing shellescape()") - return - endif - if !exists("*fnameescape") - call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70) -" call Dret("s:NetrwBrowse : missing fnameescape()") - return + if !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:WARNING,"cannot determine method (format: protocol://[user@]hostname[:port]/[path])",45) + endif + let b:netrw_method = -1 endif + "}}}3 - call s:NetrwOptionSave("w:") - - " re-instate any marked files - if exists("s:netrwmarkfilelist_{bufnr('%')}") -" call Decho("clearing marked files") - exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/" + if g:netrw_port != "" + " remove any leading [:#] from port number + let g:netrw_port = substitute(g:netrw_port,'[#:]\+','','') + elseif exists("netrw_port") + " retain port number as implicit for subsequent ftp operations + let g:netrw_port= netrw_port endif - if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep -" call Decho("handle w:netrw_acdkeep:") -" call Decho("keepjumps lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")") - exe 'keepj lcd '.fnameescape(dirname) - call s:NetrwSafeOptions() -" call Decho("getcwd<".getcwd().">") - - elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"' - " looks like a regular file, attempt transfer -" call Decho("attempt transfer as regular file<".dirname.">") +" call Decho("a:choice <".a:choice.">") +" call Decho("b:netrw_method <".b:netrw_method.">") +" call Decho("g:netrw_machine<".g:netrw_machine.">") +" call Decho("g:netrw_port <".g:netrw_port.">") +" if exists("g:netrw_uid") "Decho +" call Decho("g:netrw_uid <".g:netrw_uid.">") +" endif "Decho +" if exists("s:netrw_passwd") "Decho +" call Decho("s:netrw_passwd <".s:netrw_passwd.">") +" endif "Decho +" call Decho("b:netrw_fname <".b:netrw_fname.">") +" call Dret("NetrwMethod : b:netrw_method=".b:netrw_method." g:netrw_port=".g:netrw_port) +endfun - " remove any filetype indicator from end of dirname, except for the {{{3 - " "this is a directory" indicator (/). - " There shouldn't be one of those here, anyway. - let path= substitute(dirname,'[*=@|]\r\=$','','e') -" call Decho("new path<".path.">") - call s:RemotePathAnalysis(dirname) +" ------------------------------------------------------------------------ +" NetReadFixup: this sort of function is typically written by the user {{{2 +" to handle extra junk that their system's ftp dumps +" into the transfer. This function is provided as an +" example and as a fix for a Windows 95 problem: in my +" experience, win95's ftp always dumped four blank lines +" at the end of the transfer. +if has("win95") && exists("g:netrw_win95ftp") && g:netrw_win95ftp + fun! NetReadFixup(method, line1, line2) +" call Dfunc("NetReadFixup(method<".a:method."> line1=".a:line1." line2=".a:line2.")") - " remote-read the requested file into current buffer {{{3 - keepj mark ' - call s:NetrwEnew(dirname) - call s:NetrwSafeOptions() - setlocal ma noro -" call Decho("setlocal ma noro") - let b:netrw_curdir= dirname -" call Decho("exe sil! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path)." (bt=".&bt.")") - exe "sil! keepalt file ".fnameescape(s:method."://".s:user.s:machine."/".s:path) - exe "sil! keepalt doau BufReadPre ".fnameescape(s:fname) - silent call netrw#NetRead(2,s:method."://".s:user.s:machine."/".s:path) - if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz' && s:path !~ '.tar.xz' && s:path !~ '.txz' - " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error - exe "sil keepalt doau BufReadPost ".fnameescape(s:fname) + " sanity checks -- attempt to convert inputs to integers + let method = a:method + 0 + let line1 = a:line1 + 0 + let line2 = a:line2 + 0 + if type(method) != 0 || type(line1) != 0 || type(line2) != 0 || method < 0 || line1 <= 0 || line2 <= 0 +" call Dret("NetReadFixup") + return endif - " save certain window-oriented variables into buffer-oriented variables {{{3 - call s:SetBufWinVars() - call s:NetrwOptionRestore("w:") - setlocal ma nomod + if method == 3 " ftp (no <.netrc>) + let fourblanklines= line2 - 3 + if fourblanklines >= line1 + exe "sil keepj ".fourblanklines.",".line2."g/^\s*$/d" + call histdel("/",-1) + endif + endif -" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) -" call Dret("s:NetrwBrowse : file<".s:fname.">") - return - endif +" call Dret("NetReadFixup") + endfun +endif - " use buffer-oriented WinVars if buffer ones exist but window ones don't {{{3 - call s:UseBufWinVars() +" --------------------------------------------------------------------- +" NetUserPass: set username and password for subsequent ftp transfer {{{2 +" Usage: :call NetUserPass() -- will prompt for userid and password +" :call NetUserPass("uid") -- will prompt for password +" :call NetUserPass("uid","password") -- sets global userid and password +" :call NetUserPass("ftp:host") -- looks up userid and password using hup dictionary +" :call NetUserPass("host","uid","password") -- sets hup dictionary with host, userid, password +fun! NetUserPass(...) - " set up some variables {{{3 - let b:netrw_browser_active = 1 - let dirname = dirname - let s:last_sort_by = g:netrw_sort_by +" call Dfunc("NetUserPass() a:0=".a:0) - " set up menu {{{3 - call s:NetrwMenu(1) + if !exists('s:netrw_hup') + let s:netrw_hup= {} + endif - " set up buffer {{{3 - let reusing= s:NetrwGetBuffer(a:islocal,dirname) - " maintain markfile highlighting - if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != "" -" call Decho("bufnr(%)=".bufnr('%')) -" call Decho("exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/") - exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/" - else -" call Decho("2match none") - 2match none - endif - if reusing - call s:NetrwOptionRestore("w:") - setlocal noma nomod nowrap -" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) -" call Dret("s:NetrwBrowse : re-using buffer") - return - endif + if a:0 == 0 + " case: no input arguments - " set b:netrw_curdir to the new directory name {{{3 -" call Decho("set b:netrw_curdir to the new directory name: (buf#".bufnr("%").")") - let b:netrw_curdir= dirname - if b:netrw_curdir =~ '[/\\]$' - let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e') - endif - if b:netrw_curdir == '' - if has("amiga") - " On the Amiga, the empty string connotes the current directory - let b:netrw_curdir= getcwd() - else - " under unix, when the root directory is encountered, the result - " from the preceding substitute is an empty string. - let b:netrw_curdir= '/' - endif + " change host and username if not previously entered; get new password + if !exists("g:netrw_machine") + let g:netrw_machine= input('Enter hostname: ') endif - if !a:islocal && b:netrw_curdir !~ '/$' - let b:netrw_curdir= b:netrw_curdir.'/' + if !exists("g:netrw_uid") || g:netrw_uid == "" + " get username (user-id) via prompt + let g:netrw_uid= input('Enter username: ') endif -" call Decho("b:netrw_curdir<".b:netrw_curdir.">") - - " ------------ - " (local only) {{{3 - " ------------ - if a:islocal -" call Decho("local only:") - - " Set up ShellCmdPost handling. Append current buffer to browselist - call s:LocalFastBrowser() + " get password via prompting + let s:netrw_passwd= inputsecret("Enter Password: ") - " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3 - if !g:netrw_keepdir -" call Decho("handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) -" call Decho("l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist")) - if !exists("&l:acd") || !&l:acd -" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir)) - try - exe 'keepj lcd '.fnameescape(b:netrw_curdir) - catch /^Vim\%((\a\+)\)\=:E472/ - call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61) - if exists("w:netrw_prvdir") - let b:netrw_curdir= w:netrw_prvdir - else - call s:NetrwOptionRestore("w:") - setlocal noma nomod nowrap - let b:netrw_curdir= dirname -" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) -" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">") - return - endif - endtry - endif + " set up hup database + let host = substitute(g:netrw_machine,'\..*$','','') + if !exists('s:netrw_hup[host]') + let s:netrw_hup[host]= {} + endif + let s:netrw_hup[host].uid = g:netrw_uid + let s:netrw_hup[host].passwd = s:netrw_passwd + + elseif a:0 == 1 + " case: one input argument + + if a:1 =~ '^ftp:' + " get host from ftp:... url + " access userid and password from hup (host-user-passwd) dictionary + let host = substitute(a:1,'^ftp:','','') + let host = substitute(host,'\..*','','') + if exists("s:netrw_hup[host]") + let g:netrw_uid = s:netrw_hup[host].uid + let s:netrw_passwd = s:netrw_hup[host].passwd +" call Decho("get s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">") +" call Decho("get s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">") + else + let g:netrw_uid = input("Enter UserId: ") + let s:netrw_passwd = inputsecret("Enter Password: ") endif - " -------------------------------- - " remote handling: {{{3 - " -------------------------------- else -" call Decho("remote only:") - - " analyze dirname and g:netrw_list_cmd {{{4 -" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> dirname<".dirname.">") - if dirname =~ "^NetrwTreeListing\>" - let dirname= b:netrw_curdir -" call Decho("(dirname was ".dirname.") dirname<".dirname.">") - elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") - let dirname= substitute(b:netrw_curdir,'\\','/','g') - if dirname !~ '/$' - let dirname= dirname.'/' - endif - let b:netrw_curdir = dirname -" call Decho("(liststyle is TREELIST) dirname<".dirname.">") + " case: one input argument, not an url. Using it as a new user-id. + if exists("g:netrw_machine") + let host= substitute(g:netrw_machine,'\..*$','','') else - let dirname = substitute(dirname,'\\','/','g') -" call Decho("(normal) dirname<".dirname.">") + let g:netrw_machine= input('Enter hostname: ') endif + let g:netrw_uid = a:1 +" call Decho("set g:netrw_uid= <".g:netrw_uid.">") + if exists("g:netrw_passwd") + " ask for password if one not previously entered + let s:netrw_passwd= g:netrw_passwd + else + let s:netrw_passwd = inputsecret("Enter Password: ") + endif + endif - let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$' - if dirname !~ dirpat - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20) - endif - call s:NetrwOptionRestore("w:") - setlocal noma nomod nowrap -" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) -" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">") - return +" call Decho("host<".host.">") + if exists("host") + if !exists('s:netrw_hup[host]') + let s:netrw_hup[host]= {} endif - let b:netrw_curdir= dirname -" call Decho("b:netrw_curdir<".b:netrw_curdir."> (remote)") - endif " (additional remote handling) + let s:netrw_hup[host].uid = g:netrw_uid + let s:netrw_hup[host].passwd = s:netrw_passwd + endif - " ----------------------- - " Directory Listing: {{{3 - " ----------------------- - call s:BrowserMaps(a:islocal) - call s:PerformListing(a:islocal) + elseif a:0 == 2 + let g:netrw_uid = a:1 + let s:netrw_passwd = a:2 - " The s:LocalBrowseShellCmdRefresh() function is called by an autocmd - " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed). - " However, s:NetrwBrowse() causes the ShellCmdPost event itself to fire once; setting - " the variable below avoids that second refresh of the screen. The s:LocalBrowseShellCmdRefresh() - " function gets called due to that autocmd; it notices that the following variable is set - " and skips the refresh and sets s:locbrowseshellcmd to zero. Oct 13, 2008 - let s:locbrowseshellcmd= 1 + elseif a:0 == 3 + " enter hostname, user-id, and password into the hup dictionary + let host = substitute(a:1,'^\a\+:','','') + let host = substitute(host,'\..*$','','') + if !exists('s:netrw_hup[host]') + let s:netrw_hup[host]= {} + endif + let s:netrw_hup[host].uid = a:2 + let s:netrw_hup[host].passwd = a:3 + let g:netrw_uid = s:netrw_hup[host].uid + let s:netrw_passwd = s:netrw_hup[host].passwd +" call Decho("set s:netrw_hup[".host."].uid <".s:netrw_hup[host].uid.">") +" call Decho("set s:netrw_hup[".host."].passwd<".s:netrw_hup[host].passwd.">") + endif -" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) -" call Dret("s:NetrwBrowse : did PerformListing") - return +" call Dret("NetUserPass : uid<".g:netrw_uid."> passwd<".s:netrw_passwd.">") endfun +" =========================================== +" Shared Browsing Support: {{{1 +" =========================================== + " --------------------------------------------------------------------- -" s:NetrwFileInfo: supports qf (query for file information) {{{2 -fun! s:NetrwFileInfo(islocal,fname) -" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)") - if a:islocal - if (has("unix") || has("macunix")) && executable("/bin/ls") - if exists("b:netrw_curdir") -" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>') - if b:netrw_curdir =~ '/$' - echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname)) - else - echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname)) - endif - else -" call Decho('using ls '.a:fname." using cwd<".getcwd().">") - echo system("/bin/ls -lsad ".shellescape(a:fname)) - endif - else - " use vim functions to return information about file below cursor -" call Decho("using vim functions to query for file info") - if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]' - let fname= substitute(a:fname,".$","","") - else - let fname= a:fname +" s:NetrwMaps: {{{2 +fun! s:NetrwMaps(islocal) +" call Dfunc("s:NetrwMaps(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">") + + " set up Rexplore and [ 2-leftmouse-click -or- c-leftmouse ] +" call Decho("(NetrwMaps) set up Rexplore command") + com! Rexplore if exists("w:netrw_rexlocal")|call s:NetrwRexplore(w:netrw_rexlocal,exists("w:netrw_rexdir")? w:netrw_rexdir : ".")|else|call netrw#ErrorMsg(s:WARNING,"not a former netrw window",79)|endif + if g:netrw_mousemaps && g:netrw_retmap +" call Decho("(NetrwMaps) set up Rexplore 2-leftmouse") + if !hasmapto("NetrwReturn") + if maparg("<2-leftmouse>","n") == "" || maparg("<2-leftmouse>","n") =~ '^-$' +" call Decho("(NetrwMaps) making map for 2-leftmouse") + nmap <2-leftmouse> NetrwReturn + elseif maparg("","n") == "" +" call Decho("(NetrwMaps) making map for c-leftmouse") + nmap NetrwReturn endif - let t = getftime(fname) - let sz = getfsize(fname) - echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)) -" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))) endif - else - echo "sorry, \"qf\" not supported yet for remote files" + nno NetrwReturn :Rexplore +" call Decho("(NetrwMaps) made NetrwReturn map") endif -" call Dret("s:NetrwFileInfo") -endfun - -" --------------------------------------------------------------------- -" s:NetrwGetBuffer: {{{2 -" returns 0=cleared buffer -" 1=re-used buffer -fun! s:NetrwGetBuffer(islocal,dirname) -" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle) - let dirname= a:dirname - " re-use buffer if possible {{{3 -" call Decho("--re-use a buffer if possible--") - if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST - " find NetrwTreeList buffer if there is one -" call Decho("find NetrwTreeList buffer if there is one") - if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0 -" call Decho(" re-use w:netrw_treebufnr=".w:netrw_treebufnr) - let eikeep= &ei - set ei=all - exe "sil! b ".w:netrw_treebufnr - let &ei= eikeep -" call Dret("s:NetrwGetBuffer : bufnum#".w:netrw_treebufnr."") - return + if a:islocal +" call Decho("(NetrwMaps) make local maps") + " local normal-mode maps + nnoremap a :call NetrwHide(1) + nnoremap % :call NetrwOpenFile(1) + nnoremap c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir) + nnoremap C :let g:netrw_chgwin= winnr() + nnoremap :call netrw#LocalBrowseCheck(NetrwBrowseChgDir(1,NetrwGetWord())) + nnoremap d :call NetrwMakeDir("") + nnoremap - :exe "norm! 0"call netrw#LocalBrowseCheck(NetrwBrowseChgDir(1,'../')) + nnoremap gb :call NetrwBookHistHandler(1,b:netrw_curdir) + nnoremap gd :call NetrwForceChgDir(1,NetrwGetWord()) + nnoremap gf :call NetrwForceFile(1,NetrwGetWord()) + nnoremap gh :call NetrwHidden(1) + nnoremap gp :call NetrwChgPerm(1,b:netrw_curdir) + nnoremap I :call NetrwBannerCtrl(1) + nnoremap i :call NetrwListStyle(1) + nnoremap mb :call NetrwBookHistHandler(0,b:netrw_curdir) + nnoremap mB :call NetrwBookHistHandler(6,b:netrw_curdir) + nnoremap mc :call NetrwMarkFileCopy(1) + nnoremap md :call NetrwMarkFileDiff(1) + nnoremap me :call NetrwMarkFileEdit(1) + nnoremap mf :call NetrwMarkFile(1,NetrwGetWord()) + nnoremap mF :call NetrwUnmarkList(bufnr("%"),b:netrw_curdir) + nnoremap mg :call NetrwMarkFileGrep(1) + nnoremap mh :call NetrwMarkHideSfx(1) + nnoremap mm :call NetrwMarkFileMove(1) + nnoremap mp :call NetrwMarkFilePrint(1) + nnoremap mr :call NetrwMarkFileRegexp(1) + nnoremap ms :call NetrwMarkFileSource(1) + nnoremap mt :call NetrwMarkFileTgt(1) + nnoremap mT :call NetrwMarkFileTag(1) + nnoremap mu :call NetrwUnMarkFile(1) + nnoremap mx :call NetrwMarkFileExe(1) + nnoremap mX :call NetrwMarkFileVimCmd(1) + nnoremap mz :call NetrwMarkFileCompress(1) + nnoremap O :call NetrwObtain(1) + nnoremap o :call NetrwSplit(3) + nnoremap p :call NetrwPreview(NetrwBrowseChgDir(1,NetrwGetWord(),1)) + nnoremap P :call NetrwPrevWinOpen(1) + nnoremap qb :call NetrwBookHistHandler(2,b:netrw_curdir) + nnoremap qf :call NetrwFileInfo(1,NetrwGetWord()) + nnoremap qF :call NetrwMarkFileQFEL(1,getqflist()) + nnoremap r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'exe "norm! 0"call NetrwRefresh(1,NetrwBrowseChgDir(1,'./')) + nnoremap s :call NetrwSortStyle(1) + nnoremap S :call NetSortSequence(1) + nnoremap t :call NetrwSplit(4) + nnoremap Tb :call NetrwSetTgt('b',v:count1) + nnoremap Th :call NetrwSetTgt('h',v:count) + nnoremap u :call NetrwBookHistHandler(4,expand("%")) + nnoremap U :call NetrwBookHistHandler(5,expand("%")) + nnoremap v :call NetrwSplit(5) + nnoremap x :call netrw#NetrwBrowseX(NetrwBrowseChgDir(1,NetrwGetWord(),0),0)" + nnoremap X :call NetrwLocalExecute(expand(""))" + " local insert-mode maps + inoremap a :call NetrwHide(1) + inoremap c :exe "keepjumps lcd ".fnameescape(b:netrw_curdir) + inoremap C :let g:netrw_chgwin= winnr() + inoremap % :call NetrwOpenFile(1) + inoremap - :exe "norm! 0"call netrw#LocalBrowseCheck(NetrwBrowseChgDir(1,'../')) + inoremap :call netrw#LocalBrowseCheck(NetrwBrowseChgDir(1,NetrwGetWord())) + inoremap d :call NetrwMakeDir("") + inoremap gb :call NetrwBookHistHandler(1,b:netrw_curdir) + inoremap gh :call NetrwHidden(1) + inoremap gp :call NetrwChgPerm(1,b:netrw_curdir) + inoremap I :call NetrwBannerCtrl(1) + inoremap i :call NetrwListStyle(1) + inoremap mb :call NetrwBookHistHandler(0,b:netrw_curdir) + inoremap mB :call NetrwBookHistHandler(6,b:netrw_curdir) + inoremap mc :call NetrwMarkFileCopy(1) + inoremap md :call NetrwMarkFileDiff(1) + inoremap me :call NetrwMarkFileEdit(1) + inoremap mf :call NetrwMarkFile(1,NetrwGetWord()) + inoremap mg :call NetrwMarkFileGrep(1) + inoremap mh :call NetrwMarkHideSfx(1) + inoremap mm :call NetrwMarkFileMove(1) + inoremap mp :call NetrwMarkFilePrint(1) + inoremap mr :call NetrwMarkFileRegexp(1) + inoremap ms :call NetrwMarkFileSource(1) + inoremap mT :call NetrwMarkFileTag(1) + inoremap mt :call NetrwMarkFileTgt(1) + inoremap mu :call NetrwUnMarkFile(1) + inoremap mx :call NetrwMarkFileExe(1) + inoremap mX :call NetrwMarkFileVimCmd(1) + inoremap mz :call NetrwMarkFileCompress(1) + inoremap O :call NetrwObtain(1) + inoremap o :call NetrwSplit(3) + inoremap p :call NetrwPreview(NetrwBrowseChgDir(1,NetrwGetWord(),1)) + inoremap P :call NetrwPrevWinOpen(1) + inoremap qb :call NetrwBookHistHandler(2,b:netrw_curdir) + inoremap qf :call NetrwFileInfo(1,NetrwGetWord()) + inoremap qF :call NetrwMarkFileQFEL(1,getqflist()) + inoremap r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'exe "norm! 0"call NetrwRefresh(1,NetrwBrowseChgDir(1,'./')) + inoremap s :call NetrwSortStyle(1) + inoremap S :call NetSortSequence(1) + inoremap t :call NetrwSplit(4) + inoremap Tb :call NetrwSetTgt('b',v:count1) + inoremap Th :call NetrwSetTgt('h',v:count) + inoremap u :call NetrwBookHistHandler(4,expand("%")) + inoremap U :call NetrwBookHistHandler(5,expand("%")) + inoremap v :call NetrwSplit(5) + inoremap x :call netrw#NetrwBrowseX(NetrwBrowseChgDir(1,NetrwGetWord(),0),0)" + if !hasmapto('NetrwHideEdit') + nmap NetrwHideEdit + imap NetrwHideEdit endif - let bufnum= -1 -" call Decho(" liststyle=TREE but w:netrw_treebufnr doesn't exist") - - else - " find buffer number of buffer named precisely the same as dirname {{{3 -" call Decho("--find buffer numnber of buffer named precisely the same as dirname--") -" call Dredir("ls!") - - " get dirname and associated buffer number - let bufnum = bufnr(escape(dirname,'\')) -" call Decho(" find buffer<".dirname.">'s number ") -" call Decho(" bufnr(dirname<".escape(dirname,'\').">)=".bufnum) - - if bufnum < 0 && dirname !~ '/$' - " try appending a trailing / -" call Decho(" try appending a trailing / to dirname<".dirname.">") - let bufnum= bufnr(escape(dirname.'/','\')) - if bufnum > 0 - let dirname= dirname.'/' - endif + nnoremap NetrwHideEdit :call NetrwHideEdit(1) + if !hasmapto('NetrwRefresh') + nmap NetrwRefresh + imap NetrwRefresh endif - - if bufnum < 0 && dirname =~ '/$' - " try removing a trailing / -" call Decho(" try removing a trailing / from dirname<".dirname.">") - let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\')) - if bufnum > 0 - let dirname= substitute(dirname,'/$','','') - endif + nnoremap NetrwRefresh :call NetrwRefresh(1,NetrwBrowseChgDir(1,'./')) + if s:didstarstar || !mapcheck("","n") + nnoremap :Nexplore + inoremap :Nexplore endif - -" call Decho(" findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)") - " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches) - if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.' - " handle approximate matches -" call Decho(" handling approx match: bufnum#".bufnum."<".bufname(bufnum)."> approx-dirname<".dirname.">") - let ibuf = 1 - let buflast = bufnr("$") -" call Decho(" findbuf2: buflast=bufnr($)=".buflast) - while ibuf <= buflast - let bname= substitute(bufname(ibuf),'\\','/','g') - let bname= substitute(bname,'.\zs/$','','') -" call Decho(" findbuf3: while [ibuf=",ibuf."]<=[buflast=".buflast."]: dirname<".dirname."> bname=bufname(".ibuf.")<".bname.">") - if bname != '' && dirname =~ '/'.bname.'/\=$' && dirname !~ '^/' - " bname is not empty - " dirname ends with bname, - " dirname doesn't start with /, so its not a absolute path -" call Decho(" findbuf3a: passes test 1 : dirname<".dirname.'> =~ /'.bname.'/\=$ && dirname !~ ^/') - break - endif - if bname =~ '^'.dirname.'/\=$' - " bname begins with dirname -" call Decho(' findbuf3b: passes test 2 : bname<'.bname.'>=~^'.dirname.'/\=$') - break - endif - if dirname =~ '^'.bname.'/$' -" call Decho(' findbuf3c: passes test 3 : dirname<'.dirname.'>=~^'.bname.'/$') - break - endif - if bname != '' && dirname =~ '/'.bname.'$' && bname == bufname("%") && line("$") == 1 -" call Decho(' findbuf3d: passes test 4 : dirname<'.dirname.'>=~ /'.bname.'$') - break - endif - let ibuf= ibuf + 1 - endwhile - if ibuf > buflast - let bufnum= -1 - else - let bufnum= ibuf - endif -" call Decho(" findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")") + if s:didstarstar || !mapcheck("","n") + nnoremap :Pexplore + inoremap :Pexplore endif - endif - - " get enew buffer and name it -or- re-use buffer {{{3 - sil! keepj mark ' - if bufnum < 0 || !bufexists(bufnum) -" call Decho("--get enew buffer and name it (bufexists([bufnum=".bufnum."])=".bufexists(bufnum).")") - call s:NetrwEnew(dirname) -" call Decho(" got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)") - " name the buffer - if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST - " Got enew buffer; transform into a NetrwTreeListing -" call Decho("--transform enew buffer#".bufnr("%")." into a NetrwTreeListing --") - if !exists("s:netrw_treelistnum") - let s:netrw_treelistnum= 1 - else - let s:netrw_treelistnum= s:netrw_treelistnum + 1 - endif - let w:netrw_treebufnr= bufnr("%") -" call Decho(" exe sil! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum)) - exe 'sil! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum) - set bt=nofile noswf - nnoremap [ :silent call TreeListMove('[') - nnoremap ] :silent call TreeListMove(']') - nnoremap [[ :silent call TreeListMove('[') - nnoremap ]] :silent call TreeListMove(']') -" call Decho(" tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr) - else -" let v:errmsg= "" " Decho - let escdirname= fnameescape(dirname) -" call Decho(" errmsg<".v:errmsg."> bufnr(escdirname<".escdirname.">)=".bufnr(escdirname)." bufname()<".bufname(bufnr(escdirname)).">") -" call Decho(' exe sil! keepalt file '.escdirname) -" let v:errmsg= "" " Decho - exe 'sil! keepalt file '.escdirname -" call Decho(" errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">") + let mapsafecurdir = escape(b:netrw_curdir, s:netrw_map_escape) + if g:netrw_mousemaps == 1 + nmap NetrwLeftmouse + nno NetrwLeftmouse :call NetrwLeftmouse(1) + nmap NetrwRightdrag + nno NetrwRightdrag :call NetrwRightdrag(1) + nmap NetrwMiddlemouse + nno NetrwMiddlemouse :call NetrwPrevWinOpen(1) + nmap NetrwSLeftmouse + nno NetrwSLeftmouse :call NetrwMarkFile(1,NetrwGetWord()) + nmap <2-leftmouse> Netrw2Leftmouse + nmap Netrw2Leftmouse - + imap ILeftmouse + ino ILeftmouse :call NetrwLeftmouse(1) + imap IMiddlemouse + ino IMiddlemouse :call NetrwPrevWinOpen(1) + imap ISLeftmouse + ino ISLeftmouse :call NetrwMarkFile(1,NetrwGetWord()) + exe 'nnoremap :call NetrwLocalRm("'.mapsafecurdir.'")' + exe 'vnoremap :call NetrwLocalRm("'.mapsafecurdir.'")' + exe 'inoremap :call NetrwLocalRm("'.mapsafecurdir.'")' endif -" call Decho(" named enew buffer#".bufnr("%")."<".bufname("%").">") + exe 'nnoremap :call NetrwLocalRm("'.mapsafecurdir.'")' + exe 'nnoremap D :call NetrwLocalRm("'.mapsafecurdir.'")' + exe 'nnoremap R :call NetrwLocalRename("'.mapsafecurdir.'")' + exe 'nnoremap m :call NetrwMakeDir("")' + exe 'vnoremap :call NetrwLocalRm("'.mapsafecurdir.'")' + exe 'vnoremap D :call NetrwLocalRm("'.mapsafecurdir.'")' + exe 'vnoremap R :call NetrwLocalRename("'.mapsafecurdir.'")' + exe 'inoremap :call NetrwLocalRm("'.mapsafecurdir.'")' + exe 'inoremap D :call NetrwLocalRm("'.mapsafecurdir.'")' + exe 'inoremap R :call NetrwLocalRename("'.mapsafecurdir.'")' + exe 'inoremap m :call NetrwMakeDir("")' + nnoremap :he netrw-quickhelp - else " Re-use the buffer -" call Decho("--re-use buffer#".bufnum." (bufexists([bufnum=".bufnum."])=".bufexists(bufnum).")") - let eikeep= &ei - set ei=all - if getline(2) =~ '^" Netrw Directory Listing' -" call Decho(" re-use buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: keepalt b ".bufnum) - exe "sil! keepalt b ".bufnum - else -" call Decho(" reusing buffer#".bufnum."<".((bufnum > 0)? bufname(bufnum) : "")."> using: b ".bufnum) - exe "sil! b ".bufnum - endif - if bufname("%") == '.' -" call Decho("exe sil! keepalt file ".fnameescape(getcwd())) - exe "sil! keepalt file ".fnameescape(getcwd()) + else " remote +" call Decho("(NetrwMaps) make remote maps") + call s:RemotePathAnalysis(b:netrw_curdir) + " remote normal-mode maps + nnoremap :call NetrwBrowse(0,NetrwBrowseChgDir(0,NetrwGetWord())) + nnoremap :call NetrwRefresh(0,NetrwBrowseChgDir(0,'./')) + nnoremap - :exe "norm! 0"call NetrwBrowse(0,NetrwBrowseChgDir(0,'../')) + nnoremap a :call NetrwHide(0) + nnoremap mb :call NetrwBookHistHandler(0,b:netrw_curdir) + nnoremap mc :call NetrwMarkFileCopy(0) + nnoremap md :call NetrwMarkFileDiff(0) + nnoremap me :call NetrwMarkFileEdit(0) + nnoremap mf :call NetrwMarkFile(0,NetrwGetWord()) + nnoremap mF :call NetrwUnmarkList(bufnr("%"),b:netrw_curdir) + nnoremap mg :call NetrwMarkFileGrep(0) + nnoremap mh :call NetrwMarkHideSfx(0) + nnoremap mm :call NetrwMarkFileMove(0) + nnoremap mp :call NetrwMarkFilePrint(0) + nnoremap mr :call NetrwMarkFileRegexp(0) + nnoremap ms :call NetrwMarkFileSource(0) + nnoremap mt :call NetrwMarkFileTgt(0) + nnoremap mT :call NetrwMarkFileTag(0) + nnoremap mu :call NetrwUnMarkFile(0) + nnoremap mx :call NetrwMarkFileExe(0) + nnoremap mX :call NetrwMarkFileVimCmd(0) + nnoremap mz :call NetrwMarkFileCompress(0) + nnoremap gb :call NetrwBookHistHandler(1,b:netrw_curdir) + nnoremap gd :call NetrwForceChgDir(0,NetrwGetWord()) + nnoremap gf :call NetrwForceFile(0,NetrwGetWord()) + nnoremap gh :call NetrwHidden(0) + nnoremap gp :call NetrwChgPerm(0,b:netrw_curdir) + nnoremap C :let g:netrw_chgwin= winnr() + nnoremap i :call NetrwListStyle(0) + nnoremap I :call NetrwBannerCtrl(1) + nnoremap o :call NetrwSplit(0) + nnoremap O :call NetrwObtain(0) + nnoremap p :call NetrwPreview(NetrwBrowseChgDir(1,NetrwGetWord(),1)) + nnoremap P :call NetrwPrevWinOpen(0) + nnoremap qb :call NetrwBookHistHandler(2,b:netrw_curdir) + nnoremap mB :call NetrwBookHistHandler(6,b:netrw_curdir) + nnoremap qf :call NetrwFileInfo(0,NetrwGetWord()) + nnoremap qF :call NetrwMarkFileQFEL(0,getqflist()) + nnoremap r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'exe "norm! 0"call NetrwBrowse(0,NetrwBrowseChgDir(0,'./')) + nnoremap s :call NetrwSortStyle(0) + nnoremap S :call NetSortSequence(0) + nnoremap t :call NetrwSplit(1) + nnoremap Tb :call NetrwSetTgt('b',v:count1) + nnoremap Th :call NetrwSetTgt('h',v:count) + nnoremap u :call NetrwBookHistHandler(4,b:netrw_curdir) + nnoremap U :call NetrwBookHistHandler(5,b:netrw_curdir) + nnoremap v :call NetrwSplit(2) + nnoremap x :call netrw#NetrwBrowseX(NetrwBrowseChgDir(0,NetrwGetWord()),1) + nnoremap % :call NetrwOpenFile(0) + " remote insert-mode maps + inoremap :call NetrwBrowse(0,NetrwBrowseChgDir(0,NetrwGetWord())) + inoremap :call NetrwRefresh(0,NetrwBrowseChgDir(0,'./')) + inoremap - :exe "norm! 0"call NetrwBrowse(0,NetrwBrowseChgDir(0,'../')) + inoremap a :call NetrwHide(0) + inoremap mb :call NetrwBookHistHandler(0,b:netrw_curdir) + inoremap mc :call NetrwMarkFileCopy(0) + inoremap md :call NetrwMarkFileDiff(0) + inoremap me :call NetrwMarkFileEdit(0) + inoremap mf :call NetrwMarkFile(0,NetrwGetWord()) + inoremap mg :call NetrwMarkFileGrep(0) + inoremap mh :call NetrwMarkHideSfx(0) + inoremap mm :call NetrwMarkFileMove(0) + inoremap mp :call NetrwMarkFilePrint(0) + inoremap mr :call NetrwMarkFileRegexp(0) + inoremap ms :call NetrwMarkFileSource(0) + inoremap mt :call NetrwMarkFileTgt(0) + inoremap mT :call NetrwMarkFileTag(0) + inoremap mu :call NetrwUnMarkFile(0) + inoremap mx :call NetrwMarkFileExe(0) + inoremap mX :call NetrwMarkFileVimCmd(0) + inoremap mz :call NetrwMarkFileCompress(0) + inoremap gb :call NetrwBookHistHandler(1,b:netrw_curdir) + inoremap gh :call NetrwHidden(0) + inoremap gp :call NetrwChgPerm(0,b:netrw_curdir) + inoremap C :let g:netrw_chgwin= winnr() + inoremap i :call NetrwListStyle(0) + inoremap I :call NetrwBannerCtrl(1) + inoremap o :call NetrwSplit(0) + inoremap O :call NetrwObtain(0) + inoremap p :call NetrwPreview(NetrwBrowseChgDir(1,NetrwGetWord(),1)) + inoremap P :call NetrwPrevWinOpen(0) + inoremap qb :call NetrwBookHistHandler(2,b:netrw_curdir) + inoremap mB :call NetrwBookHistHandler(6,b:netrw_curdir) + inoremap qf :call NetrwFileInfo(0,NetrwGetWord()) + inoremap qF :call NetrwMarkFileQFEL(0,getqflist()) + inoremap r :let g:netrw_sort_direction= (g:netrw_sort_direction =~ 'n')? 'r' : 'n'exe "norm! 0"call NetrwBrowse(0,NetrwBrowseChgDir(0,'./')) + inoremap s :call NetrwSortStyle(0) + inoremap S :call NetSortSequence(0) + inoremap t :call NetrwSplit(1) + inoremap Tb :call NetrwSetTgt('b',v:count1) + inoremap Th :call NetrwSetTgt('h',v:count) + inoremap u :call NetrwBookHistHandler(4,b:netrw_curdir) + inoremap U :call NetrwBookHistHandler(5,b:netrw_curdir) + inoremap v :call NetrwSplit(2) + inoremap x :call netrw#NetrwBrowseX(NetrwBrowseChgDir(0,NetrwGetWord()),1) + inoremap % :call NetrwOpenFile(0) + if !hasmapto('NetrwHideEdit') + nmap NetrwHideEdit + imap NetrwHideEdit endif - let &ei= eikeep - if line("$") <= 1 - call s:NetrwListSettings(a:islocal) -" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it") - return 0 - elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST -" call Decho("--re-use tree listing--") -" call Decho(" clear buffer<".expand("%")."> with :%d") - sil keepj %d - call s:NetrwListSettings(a:islocal) -" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh") - return 0 - else -" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%")) - return 1 + nnoremap NetrwHideEdit :call NetrwHideEdit(0) + if !hasmapto('NetrwRefresh') + nmap NetrwRefresh + imap NetrwRefresh endif - endif - " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3 - " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast) - " slow 0 D D Deleting a buffer implies it will not be re-used (slow) - " med 1 D H - " fast 2 H H -" call Decho("--do netrw settings: make this buffer#".bufnr("%")." not-a-file, modifiable, not line-numbered, etc--") - let fname= expand("%") - call s:NetrwListSettings(a:islocal) -" call Decho("exe sil! keepalt file ".fnameescape(fname)) - exe "sil! keepalt file ".fnameescape(fname) + let mapsafepath = escape(s:path, s:netrw_map_escape) + let mapsafeusermach = escape(s:user.s:machine, s:netrw_map_escape) + + nnoremap NetrwRefresh :call NetrwRefresh(0,NetrwBrowseChgDir(0,'./')) + if g:netrw_mousemaps == 1 + nmap NetrwLeftmouse + nno NetrwLeftmouse :call NetrwLeftmouse(0) + nmap NetrwLeftdrag + nno NetrwLeftdrag :call NetrwLeftdrag(0) + nmap NetrwMiddlemouse + nno NetrwMiddlemouse :call NetrwPrevWinOpen(0) + nmap NetrwSLeftmouse + nno NetrwSLeftmouse :call NetrwMarkFile(0,NetrwGetWord()) + nmap <2-leftmouse> Netrw2Leftmouse + nmap Netrw2Leftmouse - + imap ILeftmouse + ino ILeftmouse :call NetrwLeftmouse(0) + imap IMiddlemouse + ino IMiddlemouse :call NetrwPrevWinOpen(0) + imap ISLeftmouse + ino ISLeftmouse :call NetrwMarkFile(0,NetrwGetWord()) + exe 'nnoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'vnoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'inoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + endif + exe 'nnoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'nnoremap d :call NetrwMakeDir("'.mapsafeusermach.'")' + exe 'nnoremap D :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'nnoremap R :call NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'vnoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'vnoremap D :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'vnoremap R :call NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'inoremap :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'inoremap d :call NetrwMakeDir("'.mapsafeusermach.'")' + exe 'inoremap D :call NetrwRemoteRm("'.mapsafeusermach.'","'.mapsafepath.'")' + exe 'inoremap R :call NetrwRemoteRename("'.mapsafeusermach.'","'.mapsafepath.'")' + nnoremap :he netrw-quickhelp + inoremap :he netrw-quickhelp + endif - " delete all lines from buffer {{{3 -" call Decho("--delete all lines from buffer--") -" call Decho(" clear buffer<".expand("%")."> with :%d") - sil! keepalt keepj %d + keepj call s:SetRexDir(a:islocal,b:netrw_curdir) -" call Dret("s:NetrwGetBuffer 0 : buf#".bufnr("%")) - return 0 +" call Dret("s:NetrwMaps") endfun " --------------------------------------------------------------------- -" s:NetrwGetcwd: get the current directory. {{{2 -" Change backslashes to forward slashes, if any. -" If doesc is true, escape certain troublesome characters -fun! s:NetrwGetcwd(doesc) -" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")") - let curdir= substitute(getcwd(),'\\','/','ge') - if curdir !~ '[\/]$' - let curdir= curdir.'/' - endif - if a:doesc - let curdir= fnameescape(curdir) - endif -" call Dret("NetrwGetcwd <".curdir.">") - return curdir +" s:ExplorePatHls: converts an Explore pattern into a regular expression search pattern {{{2 +fun! s:ExplorePatHls(pattern) +" call Dfunc("s:ExplorePatHls(pattern<".a:pattern.">)") + let repat= substitute(a:pattern,'^**/\{1,2}','','') +" call Decho("repat<".repat.">") + let repat= escape(repat,'][.\') +" call Decho("repat<".repat.">") + let repat= '\<'.substitute(repat,'\*','\\(\\S\\+ \\)*\\S\\+','g').'\>' +" call Dret("s:ExplorePatHls repat<".repat.">") + return repat endfun " --------------------------------------------------------------------- -" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2 -fun! s:NetrwGetWord() -" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol(".")) - call s:UseBufWinVars() - - " insure that w:netrw_liststyle is set up - if !exists("w:netrw_liststyle") - if exists("g:netrw_liststyle") - let w:netrw_liststyle= g:netrw_liststyle - else - let w:netrw_liststyle= s:THINLIST - endif -" call Decho("w:netrw_liststyle=".w:netrw_liststyle) +" s:NetrwBookHistHandler: {{{2 +" 0: (user: ) bookmark current directory +" 1: (user: ) change to the bookmarked directory +" 2: (user: ) list bookmarks +" 3: (browsing) record current directory history +" 4: (user: ) go up (previous) bookmark +" 5: (user: ) go down (next) bookmark +" 6: (user: ) delete bookmark +fun! s:NetrwBookHistHandler(chg,curdir) +" call Dfunc("s:NetrwBookHistHandler(chg=".a:chg." curdir<".a:curdir.">) cnt=".v:count." histcnt=".g:netrw_dirhist_cnt." histmax=".g:netrw_dirhistmax) + if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0 +" " call Dret("s:NetrwBookHistHandler - suppressed due to g:netrw_dirhistmax") + return endif - if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt - " Active Banner support -" call Decho("active banner handling") - keepj norm! 0 - let dirname= "./" - let curline= getline('.') - - if curline =~ '"\s*Sorted by\s' - keepj norm s - let s:netrw_skipbrowse= 1 - echo 'Pressing "s" also works' - - elseif curline =~ '"\s*Sort sequence:' - let s:netrw_skipbrowse= 1 - echo 'Press "S" to edit sorting sequence' - - elseif curline =~ '"\s*Quick Help:' - keepj norm ? - let s:netrw_skipbrowse= 1 - echo 'Pressing "?" also works' - - elseif curline =~ '"\s*\%(Hiding\|Showing\):' - keepj norm a - let s:netrw_skipbrowse= 1 - echo 'Pressing "a" also works' - - elseif line("$") > w:netrw_bannercnt - exe 'sil keepj '.w:netrw_bannercnt + let ykeep= @@ + if a:chg == 0 + " bookmark the current directory +" call Decho("(user: ) bookmark the current directory") + if !exists("g:netrw_bookmarklist") + let g:netrw_bookmarklist= [] endif + if index(g:netrw_bookmarklist,a:curdir) == -1 + " curdir not currently in g:netrw_bookmarklist, so include it + call add(g:netrw_bookmarklist,a:curdir) + call sort(g:netrw_bookmarklist) + endif + echo "bookmarked the current directory" - elseif w:netrw_liststyle == s:THINLIST -" call Decho("thin column handling") - keepj norm! 0 - let dirname= getline('.') - - elseif w:netrw_liststyle == s:LONGLIST -" call Decho("long column handling") - keepj norm! 0 - let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e') + elseif a:chg == 1 + " change to the bookmarked directory +" call Decho("(user: <".v:count."gb>) change to the bookmarked directory") + if exists("g:netrw_bookmarklist[v:count-1]") +" call Decho("(user: <".v:count."gb>) bookmarklist=".string(g:netrw_bookmarklist)) + exe "keepj e ".fnameescape(g:netrw_bookmarklist[v:count-1]) + else + echomsg "Sorry, bookmark#".v:count." doesn't exist!" + endif - elseif w:netrw_liststyle == s:TREELIST -" call Decho("treelist handling") - let dirname= substitute(getline('.'),'^\(| \)*','','e') + elseif a:chg == 2 +" redraw! + let didwork= 0 + " list user's bookmarks +" call Decho("(user: ) list user's bookmarks") + if exists("g:netrw_bookmarklist") +" call Decho('list '.len(g:netrw_bookmarklist).' bookmarks') + let cnt= 1 + for bmd in g:netrw_bookmarklist +" call Decho("Netrw Bookmark#".cnt.": ".g:netrw_bookmarklist[cnt-1]) + echo printf("Netrw Bookmark#%-2d: %s",cnt,g:netrw_bookmarklist[cnt-1]) + let didwork = 1 + let cnt = cnt + 1 + endfor + endif - else -" call Decho("obtain word from wide listing") - let dirname= getline('.') + " list directory history + let cnt = g:netrw_dirhist_cnt + let first = 1 + let histcnt = 0 + if g:netrw_dirhistmax > 0 + while ( first || cnt != g:netrw_dirhist_cnt ) +" call Decho("first=".first." cnt=".cnt." dirhist_cnt=".g:netrw_dirhist_cnt) + if exists("g:netrw_dirhist_{cnt}") +" call Decho("Netrw History#".histcnt.": ".g:netrw_dirhist_{cnt}) + echo printf("Netrw History#%-2d: %s",histcnt,g:netrw_dirhist_{cnt}) + let didwork= 1 + endif + let histcnt = histcnt + 1 + let first = 0 + let cnt = ( cnt - 1 ) % g:netrw_dirhistmax + if cnt < 0 + let cnt= cnt + g:netrw_dirhistmax + endif + endwhile + else + let g:netrw_dirhist_cnt= 0 + endif + if didwork + call inputsave()|call input("Press to continue")|call inputrestore() + endif - if !exists("b:netrw_cpf") - let b:netrw_cpf= 0 - exe 'silent keepjumps '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif' - call histdel("/",-1) -" call Decho("computed cpf=".b:netrw_cpf) + elseif a:chg == 3 + " saves most recently visited directories (when they differ) +" call Decho("(browsing) record curdir history") + if !exists("g:netrw_dirhist_cnt") || !exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}") || g:netrw_dirhist_{g:netrw_dirhist_cnt} != a:curdir + if g:netrw_dirhistmax > 0 + let g:netrw_dirhist_cnt = ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax + let g:netrw_dirhist_{g:netrw_dirhist_cnt} = a:curdir + endif +" call Decho("save dirhist#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">") endif -" call Decho("buf#".bufnr("%")."<".bufname("%").">") - let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf -" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt) -" call Decho("1: dirname<".dirname.">") - if filestart == 0 - keepj norm! 0ma + elseif a:chg == 4 + " u: change to the previous directory stored on the history list +" call Decho("(user: ) chg to prev dir from history") + if g:netrw_dirhistmax > 0 + let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - v:count1 ) % g:netrw_dirhistmax + if g:netrw_dirhist_cnt < 0 + let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax + endif else - call cursor(line("."),filestart+1) - keepj norm! ma + let g:netrw_dirhist_cnt= 0 endif - let rega= @a - let eofname= filestart + b:netrw_cpf + 1 - if eofname <= col("$") - call cursor(line("."),filestart+b:netrw_cpf+1) - keepj norm! "ay`a + if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}") +" call Decho("changedir u#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") + setl ma noro +" call Decho("(NetrwBookHistHandler) setl ma noro") + sil! keepj %d + setl nomod +" call Decho("(NetrwBookHistHandler) setl nomod") +" call Decho("(NetrwBookHistHandler) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") + endif +" " call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})) + exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}) else - keepj norm! "ay$ + if g:netrw_dirhistmax > 0 + let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + v:count1 ) % g:netrw_dirhistmax + else + let g:netrw_dirhist_cnt= 0 + endif + echo "Sorry, no predecessor directory exists yet" endif - let dirname = @a - let @a = rega -" call Decho("2: dirname<".dirname.">") - let dirname= substitute(dirname,'\s\+$','','e') -" call Decho("3: dirname<".dirname.">") - endif - - " symlinks are indicated by a trailing "@". Remove it before further processing. - let dirname= substitute(dirname,"@$","","") - - " executables are indicated by a trailing "*". Remove it before further processing. - let dirname= substitute(dirname,"\*$","","") -" call Dret("s:NetrwGetWord <".dirname.">") - return dirname -endfun + elseif a:chg == 5 + " U: change to the subsequent directory stored on the history list +" call Decho("(user: ) chg to next dir from history") + if g:netrw_dirhistmax > 0 + let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt + 1 ) % g:netrw_dirhistmax + if exists("g:netrw_dirhist_{g:netrw_dirhist_cnt}") +" call Decho("changedir U#".g:netrw_dirhist_cnt."<".g:netrw_dirhist_{g:netrw_dirhist_cnt}.">") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") +" call Decho("(NetrwBookHistHandler) setl ma noro") + setl ma noro + sil! keepj %d +" call Decho("removed all lines from buffer (%d)") +" call Decho("(NetrwBookHistHandler) setl nomod") + setl nomod +" call Decho("(set nomod) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") + endif +" call Decho("exe e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt})) + exe "keepj e! ".fnameescape(g:netrw_dirhist_{g:netrw_dirhist_cnt}) + else + let g:netrw_dirhist_cnt= ( g:netrw_dirhist_cnt - 1 ) % g:netrw_dirhistmax + if g:netrw_dirhist_cnt < 0 + let g:netrw_dirhist_cnt= g:netrw_dirhist_cnt + g:netrw_dirhistmax + endif + echo "Sorry, no successor directory exists yet" + endif + else + let g:netrw_dirhist_cnt= 0 + echo "Sorry, no successor directory exists yet (g:netrw_dirhistmax is ".g:netrw_dirhistmax.")" + endif -" --------------------------------------------------------------------- -" s:NetrwListSettings: make standard settings for a netrw listing {{{2 -fun! s:NetrwListSettings(islocal) -" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")") - let fname= bufname("%") -" call Decho("setlocal bt=nofile nobl ma nonu nowrap noro") - setlocal bt=nofile nobl ma nonu nowrap noro -" call Decho("exe sil! keepalt file ".fnameescape(fname)) - exe "sil! keepalt file ".fnameescape(fname) - if g:netrw_use_noswf - setlocal noswf - endif -" call Dredir("ls!") -" call Decho("exe setlocal ts=".g:netrw_maxfilenamelen) - exe "setlocal ts=".g:netrw_maxfilenamelen - setlocal isk+=.,~,- - if g:netrw_fastbrowse > a:islocal - setlocal bh=hide - else - setlocal bh=delete + elseif a:chg == 6 + " delete the v:count'th bookmark +" call Decho("delete bookmark#".v:count."<".g:netrw_bookmarklist[v:count-1].">") + let savefile= s:NetrwHome()."/.netrwbook" + if filereadable(savefile) +" call Decho("merge bookmarks (active and file)") + keepj call s:NetrwBookHistSave() " done here to merge bookmarks first +" call Decho("bookmark delete savefile<".savefile.">") + keepj call delete(savefile) + endif +" call Decho("remove g:netrw_bookmarklist[".(v:count-1)."]") + keepj call remove(g:netrw_bookmarklist,v:count-1) +" call Decho("resulting g:netrw_bookmarklist=".string(g:netrw_bookmarklist)) endif -" call Dret("s:NetrwListSettings") + call s:NetrwBookmarkMenu() + call s:NetrwTgtMenu() + let @@= ykeep +" call Dret("s:NetrwBookHistHandler") endfun " --------------------------------------------------------------------- -" s:NetrwListStyle: {{{2 -" islocal=0: remote browsing -" =1: local browsing -fun! s:NetrwListStyle(islocal) -" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle) - let fname = s:NetrwGetWord() - if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif - let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST -" call Decho("fname<".fname.">") -" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle) -" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">") - - if w:netrw_liststyle == s:THINLIST - " use one column listing -" call Decho("use one column list") - let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') - - elseif w:netrw_liststyle == s:LONGLIST - " use long list -" call Decho("use long list") - let g:netrw_list_cmd = g:netrw_list_cmd." -l" +" s:NetrwBookHistRead: this function reads bookmarks and history {{{2 +" Sister function: s:NetrwBookHistSave() +fun! s:NetrwBookHistRead() +" call Dfunc("s:NetrwBookHistRead()") + if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0 +" " call Dret("s:NetrwBookHistRead - suppressed due to g:netrw_dirhistmax") + return + endif + let ykeep= @@ + if !exists("s:netrw_initbookhist") + let home = s:NetrwHome() + let savefile= home."/.netrwbook" + if filereadable(savefile) +" call Decho("sourcing .netrwbook") + exe "keepalt keepj so ".savefile + endif + if g:netrw_dirhistmax > 0 + let savefile= home."/.netrwhist" + if filereadable(savefile) +" call Decho("sourcing .netrwhist") + exe "keepalt keepj so ".savefile + endif + let s:netrw_initbookhist= 1 + au VimLeave * call s:NetrwBookHistSave() + endif + endif + let @@= ykeep +" call Dret("s:NetrwBookHistRead") +endfun - elseif w:netrw_liststyle == s:WIDELIST - " give wide list -" call Decho("use wide list") - let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') +" --------------------------------------------------------------------- +" s:NetrwBookHistSave: this function saves bookmarks and history {{{2 +" Sister function: s:NetrwBookHistRead() +" I used to do this via viminfo but that appears to +" be unreliable for long-term storage +fun! s:NetrwBookHistSave() +" call Dfunc("s:NetrwBookHistSave() dirhistmax=".g:netrw_dirhistmax) + if !exists("g:netrw_dirhistmax") || g:netrw_dirhistmax <= 0 +" call Dret("s:NetrwBookHistSave : dirhistmax=".g:netrw_dirhistmax) + return + endif - elseif w:netrw_liststyle == s:TREELIST -" call Decho("use tree list") - let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') + let savefile= s:NetrwHome()."/.netrwhist" + 1split + call s:NetrwEnew() + setl cino= com= cpo-=a cpo-=A fo=nroql2 tw=0 report=10000 noswf + setl nocin noai noci magic nospell nohid wig= noaw + setl ma noro write + if exists("+acd") | setl noacd | endif + sil! keepj keepalt %d - else - call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46) - let g:netrw_liststyle = s:THINLIST - let w:netrw_liststyle = g:netrw_liststyle - let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') - endif - setlocal ma noro -" call Decho("setlocal ma noro") + " save .netrwhist -- no attempt to merge + sil! keepalt file .netrwhist + call setline(1,"let g:netrw_dirhistmax =".g:netrw_dirhistmax) + call setline(2,"let g:netrw_dirhist_cnt =".g:netrw_dirhist_cnt) + let lastline = line("$") + let cnt = 1 + while cnt <= g:netrw_dirhist_cnt + call setline((cnt+lastline),'let g:netrw_dirhist_'.cnt."='".g:netrw_dirhist_{cnt}."'") + let cnt= cnt + 1 + endwhile + exe "sil! w! ".savefile - " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh -" call Decho("clear buffer<".expand("%")."> with :%d") - sil! keepj %d - " following prevents tree listing buffer from being marked "modified" - setlocal nomod + sil keepj %d + if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] + " merge and write .netrwbook + let savefile= s:NetrwHome()."/.netrwbook" - " refresh the listing -" call Decho("refresh the listing") - let svpos= netrw#NetrwSavePosn() - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) - call s:NetrwCursorline() + if filereadable(savefile) + let booklist= deepcopy(g:netrw_bookmarklist) + exe "sil keepj keepalt so ".savefile + for bdm in booklist + if index(g:netrw_bookmarklist,bdm) == -1 + call add(g:netrw_bookmarklist,bdm) + endif + endfor + call sort(g:netrw_bookmarklist) + exe "sil! w! ".savefile + endif - " keep cursor on the filename - sil! keepj $ - let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc') -" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A')) - if result <= 0 && exists("w:netrw_bannercnt") - exe "sil! keepj ".w:netrw_bannercnt + " construct and save .netrwbook + call setline(1,"let g:netrw_bookmarklist= ".string(g:netrw_bookmarklist)) + exe "sil! w! ".savefile endif + let bgone= bufnr("%") + q! + exe "keepalt ".bgone."bwipe!" -" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : "")) +" call Dret("s:NetrwBookHistSave") endfun " --------------------------------------------------------------------- -" s:NetrwBannerCtrl: toggles the display of the banner {{{2 -fun! s:NetrwBannerCtrl(islocal) -" call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner) - - " toggle the banner (enable/suppress) - let g:netrw_banner= !g:netrw_banner +" s:NetrwBrowse: This function uses the command in g:netrw_list_cmd to provide a {{{2 +" list of the contents of a local or remote directory. It is assumed that the +" g:netrw_list_cmd has a string, USEPORT HOSTNAME, that needs to be substituted +" with the requested remote hostname first. +fun! s:NetrwBrowse(islocal,dirname) + if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif +" call Dfunc("s:NetrwBrowse(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".w:netrw_liststyle." ".g:loaded_netrw." buf#".bufnr("%")."<".bufname("%")."> win#".winnr()) +" call Decho("(NetrwBrowse) tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")." modified=".&modified." modifiable=".&modifiable." readonly=".&readonly) + " s:NetrwBrowse: initialize history {{{3 + if !exists("s:netrw_initbookhist") + keepj call s:NetrwBookHistRead() + endif - " refresh the listing - let svpos= netrw#NetrwSavePosn() - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + " s:NetrwBrowse: simplify the dirname (especially for ".."s in dirnames) {{{3 + if a:dirname !~ '^\a\+://' + let dirname= simplify(a:dirname) + else + let dirname= a:dirname + endif - " keep cursor on the filename - let fname= s:NetrwGetWord() - sil keepj $ - let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc') -" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A')) - if result <= 0 && exists("w:netrw_bannercnt") - exe "keepj ".w:netrw_bannercnt + if exists("s:netrw_skipbrowse") + unlet s:netrw_skipbrowse +" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") +" call Dret("s:NetrwBrowse : s:netrw_skipbrowse=".s:netrw_skipbrowse) + return endif -" call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner) -endfun -" --------------------------------------------------------------------- -" s:NetrwBookmarkMenu: Uses menu priorities {{{2 -" .2.[cnt] for bookmarks, and -" .3.[cnt] for history -" (see s:NetrwMenu()) -fun! s:NetrwBookmarkMenu() - if !exists("s:netrw_menucnt") + " s:NetrwBrowse: sanity checks: {{{3 + if !exists("*shellescape") + keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing shellescape()",69) +" call Dret("s:NetrwBrowse : missing shellescape()") + return + endif + if !exists("*fnameescape") + keepj call netrw#ErrorMsg(s:ERROR,"netrw can't run -- your vim is missing fnameescape()",70) +" call Dret("s:NetrwBrowse : missing fnameescape()") return endif -" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt) - " the following test assures that gvim is running, has menus available, and has menus enabled. - if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu - if exists("g:NetrwTopLvlMenu") -" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)") - exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks' - exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete' - endif - if !exists("s:netrw_initbookhist") - call s:NetrwBookHistRead() - endif + " s:NetrwBrowse: save options: {{{3 + call s:NetrwOptionSave("w:") - " show bookmarked places - if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] - let cnt= 1 - for bmd in g:netrw_bookmarklist -" call Decho('silent! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.bmd.' :e '.bmd) - let bmd= escape(bmd,g:netrw_menu_escape) + " s:NetrwBrowse: re-instate any marked files {{{3 + if exists("s:netrwmarkfilelist_{bufnr('%')}") +" call Decho("(NetrwBrowse) clearing marked files") + exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/" + endif - " show bookmarks for goto menu - exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.bmd.' :e '.bmd."\" + if a:islocal && exists("w:netrw_acdkeep") && w:netrw_acdkeep + " s:NetrwBrowse: set up "safe" options for local directory/file {{{3 +" call Decho("(NetrwBrowse) handle w:netrw_acdkeep:") +" call Decho("(NetrwBrowse) keepjumps lcd ".fnameescape(dirname)." (due to w:netrw_acdkeep=".w:netrw_acdkeep." - acd=".&acd.")") + exe 'keepj lcd '.fnameescape(dirname) + call s:NetrwSafeOptions() +" call Decho("(NetrwBrowse) getcwd<".getcwd().">") - " show bookmarks for deletion menu - exe 'sil! menu '.g:NetrwMenuPriority.".8.2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete.'.bmd.' '.cnt."mB" - let cnt= cnt + 1 - endfor + elseif !a:islocal && dirname !~ '[\/]$' && dirname !~ '^"' + " s:NetrwBrowse: looks like a remote regular file, attempt transfer {{{3 +" call Decho("(NetrwBrowse) attempt transfer as regular file<".dirname.">") + + " remove any filetype indicator from end of dirname, except for the + " "this is a directory" indicator (/). + " There shouldn't be one of those here, anyway. + let path= substitute(dirname,'[*=@|]\r\=$','','e') +" call Decho("(NetrwBrowse) new path<".path.">") + call s:RemotePathAnalysis(dirname) + " s:NetrwBrowse: remote-read the requested file into current buffer {{{3 + keepj mark ' + call s:NetrwEnew(dirname) + call s:NetrwSafeOptions() + setl ma noro +" call Decho("(NetrwBrowse) setl ma noro") + let b:netrw_curdir = dirname + let url = s:method."://".s:user.s:machine.(s:port ? ":".s:port : "")."/".s:path +" call Decho("(NetrwBrowse) exe sil! keepalt file ".fnameescape(url)." (bt=".&bt.")") + exe "sil! keepj keepalt file ".fnameescape(url) + exe "sil! keepj keepalt doau BufReadPre ".fnameescape(s:fname) + sil call netrw#NetRead(2,url) + if s:path !~ '.tar.bz2$' && s:path !~ '.tar.gz' && s:path !~ '.tar.xz' && s:path !~ '.txz' + " netrw.vim and tar.vim have already handled decompression of the tarball; avoiding gzip.vim error + exe "sil keepj keepalt doau BufReadPost ".fnameescape(s:fname) endif - " show directory browsing history - let cnt = g:netrw_dirhist_cnt - let first = 1 - let histcnt = 0 - while ( first || cnt != g:netrw_dirhist_cnt ) - let histcnt = histcnt + 1 - let priority = g:netrw_dirhist_cnt + histcnt - if exists("g:netrw_dirhist_{cnt}") - let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape) -" call Decho('silent! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir) - exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\" - endif - let first = 0 - let cnt = ( cnt - 1 ) % g:netrw_dirhistmax - if cnt < 0 - let cnt= cnt + g:netrw_dirhistmax - endif - endwhile + " s:NetrwBrowse: save certain window-oriented variables into buffer-oriented variables {{{3 + call s:SetBufWinVars() + call s:NetrwOptionRestore("w:") +" call Decho("(NetrwBrowse) setl ma nomod") + setl ma nomod +" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") +" call Dret("s:NetrwBrowse : file<".s:fname.">") + return endif -" call Dret("NetrwBookmarkMenu") -endfun -" --------------------------------------------------------------------- -" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2 -" directory and a new directory name. Also, if the -" "new directory name" is actually a file, -" NetrwBrowseChgDir() edits the file. -fun! s:NetrwBrowseChgDir(islocal,newdir,...) -" call Dfunc("s:NetrwBrowseChgDir(islocal=".a:islocal."> newdir<".a:newdir.">) a:0=".a:0." curpos<".string(getpos("."))."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "").">") + " use buffer-oriented WinVars if buffer variables exist but associated window variables don't {{{3 + call s:UseBufWinVars() - if !exists("b:netrw_curdir") - " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called - " and the current window is the NetrwMessage window. -" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!") -" call Decho("getcwd<".getcwd().">") -" call Dredir("ls!") -" call Dret("s:NetrwBrowseChgDir") - return - endif + " set up some variables {{{3 + let b:netrw_browser_active = 1 + let dirname = dirname + let s:last_sort_by = g:netrw_sort_by - call s:NetrwOptionSave("s:") - call s:NetrwSafeOptions() - let nbcd_curpos = netrw#NetrwSavePosn() - let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos - if (has("win32") || has("win95") || has("win64") || has("win16")) - let dirname = substitute(b:netrw_curdir,'\\','/','ge') - else - let dirname= b:netrw_curdir - endif - let newdir = a:newdir - let dolockout = 0 + " set up menu {{{3 + keepj call s:NetrwMenu(1) - " set up o/s-dependent directory recognition pattern - if has("amiga") - let dirpat= '[\/:]$' + " get/set-up buffer {{{3 + let reusing= s:NetrwGetBuffer(a:islocal,dirname) + " maintain markfile highlighting + if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != "" +" call Decho("(NetrwBrowse) bufnr(%)=".bufnr('%')) +" call Decho("(NetrwBrowse) exe 2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/") + exe "2match netrwMarkFile /".s:netrwmarkfilemtch_{bufnr("%")}."/" else - let dirpat= '[\/]$' +" call Decho("(NetrwBrowse) 2match none") + 2match none endif -" call Decho("dirname<".dirname."> dirpat<".dirpat.">") - - if dirname !~ dirpat - " apparently vim is "recognizing" that it is in a directory and - " is removing the trailing "/". Bad idea, so I put it back. - let dirname= dirname.'/' -" call Decho("adjusting dirname<".dirname.">") + if reusing && line("$") > 1 + call s:NetrwOptionRestore("w:") +" call Decho("(NetrwBrowse) setl noma nomod nowrap") + setl noma nomod nowrap +" call Decho("(NetrwBrowse) (set noma nomod nowrap) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") +" call Dret("s:NetrwBrowse : re-using buffer") + return endif - if newdir !~ dirpat - " ------------ - " edit a file: - " ------------ -" call Decho('case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">") - if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)' - let dirname= s:NetrwTreeDir() - if dirname =~ '/$' - let dirname= dirname.newdir - else - let dirname= s:NetrwTreeDir()."/".newdir - endif -" call Decho("dirname<".dirname.">") -" call Decho("tree listing") - elseif newdir =~ '^\(/\|\a:\)' - let dirname= newdir + " set b:netrw_curdir to the new directory name {{{3 +" call Decho("(NetrwBrowse) set b:netrw_curdir to the new directory name: (buf#".bufnr("%").")") + let b:netrw_curdir= dirname + if b:netrw_curdir =~ '[/\\]$' + let b:netrw_curdir= substitute(b:netrw_curdir,'[/\\]$','','e') + endif + if b:netrw_curdir == '' + if has("amiga") + " On the Amiga, the empty string connotes the current directory + let b:netrw_curdir= getcwd() else - let dirname= s:ComposePath(dirname,newdir) + " under unix, when the root directory is encountered, the result + " from the preceding substitute is an empty string. + let b:netrw_curdir= '/' endif -" call Decho("handling a file: dirname<".dirname."> (a:0=".a:0.")") - " this lets NetrwBrowseX avoid the edit - if a:0 < 1 -" call Decho("set up windows for editing<".fnameescape(dirname)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist")) - call s:NetrwOptionRestore("s:") - if !exists("s:didsplit") - if g:netrw_browse_split == 1 - new - if !&ea - wincmd _ - endif - elseif g:netrw_browse_split == 2 - rightb vert new - if !&ea - wincmd | - endif - elseif g:netrw_browse_split == 3 - tabnew - elseif g:netrw_browse_split == 4 - if s:NetrwPrevWinOpen(2) == 3 -" call Dret("s:NetrwBrowseChgDir") + endif + if !a:islocal && b:netrw_curdir !~ '/$' + let b:netrw_curdir= b:netrw_curdir.'/' + endif +" call Decho("(NetrwBrowse) b:netrw_curdir<".b:netrw_curdir.">") + + " ------------ + " (local only) {{{3 + " ------------ + if a:islocal +" call Decho("(NetrwBrowse) local only:") + + " Set up ShellCmdPost handling. Append current buffer to browselist + call s:LocalFastBrowser() + + " handle g:netrw_keepdir: set vim's current directory to netrw's notion of the current directory {{{3 + if !g:netrw_keepdir +" call Decho("(NetrwBrowse) handle g:netrw_keepdir=".g:netrw_keepdir.": getcwd<".getcwd()."> acd=".&acd) +" call Decho("(NetrwBrowse) l:acd".(exists("&l:acd")? "=".&l:acd : " doesn't exist")) + if !exists("&l:acd") || !&l:acd +" call Decho('exe keepjumps lcd '.fnameescape(b:netrw_curdir)) + try + exe 'keepj lcd '.fnameescape(b:netrw_curdir) + catch /^Vim\%((\a\+)\)\=:E472/ + call netrw#ErrorMsg(s:ERROR,"unable to change directory to <".b:netrw_curdir."> (permissions?)",61) + if exists("w:netrw_prvdir") + let b:netrw_curdir= w:netrw_prvdir + else + call s:NetrwOptionRestore("w:") +" call Decho("(NetrwBrowse) setl noma nomod nowrap") + setl noma nomod nowrap +" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") + let b:netrw_curdir= dirname +" call Dret("s:NetrwBrowse : reusing buffer#".(exists("bufnum")? bufnum : 'N/A')."<".dirname."> getcwd<".getcwd().">") return endif - else - " handling a file, didn't split, so remove menu -" call Decho("handling a file+didn't split, so remove menu") - call s:NetrwMenu(0) - " optional change to window - if g:netrw_chgwin >= 1 - exe "keepjumps ".g:netrw_chgwin."wincmd w" - endif - endif + endtry endif + endif - " the point where netrw actually edits the (local) file - " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will - if a:islocal -" call Decho("edit local file: exe e! ".fnameescape(dirname)) - exe "e! ".fnameescape(dirname) - else -" call Decho("remote file: NetrwBrowse will edit it") - endif - let dolockout= 1 + " -------------------------------- + " remote handling: {{{3 + " -------------------------------- + else +" call Decho("(NetrwBrowse) remote only:") - " handle g:Netrw_funcref -- call external-to-netrw functions - " This code will handle g:Netrw_funcref as an individual function reference - " or as a list of function references. It will ignore anything that's not - " a function reference. See :help Funcref for information about function references. - if exists("g:Netrw_funcref") -" call Decho("handle optional Funcrefs") - if type(g:Netrw_funcref) == 2 -" call Decho("handling a g:Netrw_funcref") - call g:Netrw_funcref() - elseif type(g:Netrw_funcref) == 3 -" call Decho("handling a list of g:Netrw_funcrefs") - for Fncref in g:Netrw_funcref - if type(FncRef) == 2 - call FncRef() - endif - endfor - endif + " analyze dirname and g:netrw_list_cmd {{{3 +" call Decho("(NetrwBrowse) b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist")."> dirname<".dirname.">") + if dirname =~ "^NetrwTreeListing\>" + let dirname= b:netrw_curdir +" call Decho("(NetrwBrowse) (dirname was ) dirname<".dirname.">") + elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir") + let dirname= substitute(b:netrw_curdir,'\\','/','g') + if dirname !~ '/$' + let dirname= dirname.'/' endif + let b:netrw_curdir = dirname +" call Decho("(NetrwBrowse) (liststyle is TREELIST) dirname<".dirname.">") + else + let dirname = substitute(dirname,'\\','/','g') +" call Decho("(NetrwBrowse) (normal) dirname<".dirname.">") endif - elseif newdir =~ '^/' - " --------------------------------- - " just go to the new directory spec - " --------------------------------- -" call Decho('case "just go to new directory spec": newdir<'.newdir.'>') - let dirname= newdir - call s:SetRexDir(a:islocal,dirname) - call s:NetrwOptionRestore("s:") + let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/]\+\)/\(.*\)$' + if dirname !~ dirpat + if !exists("g:netrw_quiet") + keepj call netrw#ErrorMsg(s:ERROR,"netrw doesn't understand your dirname<".dirname.">",20) + endif + keepj call s:NetrwOptionRestore("w:") +" call Decho("(NetrwBrowse) setl noma nomod nowrap") + setl noma nomod nowrap +" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") +" call Dret("s:NetrwBrowse : badly formatted dirname<".dirname.">") + return + endif + let b:netrw_curdir= dirname +" call Decho("(NetrwBrowse) b:netrw_curdir<".b:netrw_curdir."> (remote)") + endif " (additional remote handling) - elseif newdir == './' - " -------------------------- - " refresh the directory list - " -------------------------- -" call Decho('case "refresh directory listing": newdir == "./"') - call s:SetRexDir(a:islocal,dirname) + " ----------------------- + " Directory Listing: {{{3 + " ----------------------- + keepj call s:NetrwMaps(a:islocal) + keepj call s:PerformListing(a:islocal) + if v:version >= 700 && has("balloon_eval") && &beval == 0 && &l:bexpr == "" && !exists("g:netrw_nobeval") + let &l:bexpr= "netrw#NetrwBalloonHelp()" +" call Decho("(NetrwBrowse) set up balloon help: l:bexpr=".&l:bexpr) + set beval + endif + call s:NetrwOptionRestore("w:") - elseif newdir == '../' - " ------------------- - " go up one directory - " ------------------- -" call Decho('case "go up one directory": newdir == "../"') + " The s:LocalBrowseShellCmdRefresh() function is called by an autocmd + " installed by s:LocalFastBrowser() when g:netrw_fastbrowse <= 1 (ie. slow, medium speed). + " However, s:NetrwBrowse() causes the ShellCmdPost event itself to fire once; setting + " the variable below avoids that second refresh of the screen. The s:LocalBrowseShellCmdRefresh() + " function gets called due to that autocmd; it notices that the following variable is set + " and skips the refresh and sets s:locbrowseshellcmd to zero. Oct 13, 2008 + let s:locbrowseshellcmd= 1 - if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") - " force a refresh -" call Decho("clear buffer<".expand("%")."> with :%d") - setlocal noro ma -" call Decho("setlocal noro ma") - keepj %d - endif +" call Decho("(NetrwBrowse) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") +" call Dret("s:NetrwBrowse : did PerformListing ft<".&ft.">") + return +endfun - if has("amiga") - " amiga -" call Decho('case "go up one directory": newdir == "../" and amiga') - if a:islocal - let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','') - let dirname= substitute(dirname,'/$','','') +" --------------------------------------------------------------------- +" s:NetrwFileInfo: supports qf (query for file information) {{{2 +fun! s:NetrwFileInfo(islocal,fname) +" call Dfunc("s:NetrwFileInfo(islocal=".a:islocal." fname<".a:fname.">)") + let ykeep= @@ + if a:islocal + if (has("unix") || has("macunix")) && executable("/bin/ls") + if exists("b:netrw_curdir") +" call Decho('using ls with b:netrw_curdir<'.b:netrw_curdir.'>') + if b:netrw_curdir =~ '/$' + echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir.a:fname)) + else + echo system("/bin/ls -lsad ".shellescape(b:netrw_curdir."/".a:fname)) + endif else - let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','') +" call Decho('using ls '.a:fname." using cwd<".getcwd().">") + echo system("/bin/ls -lsad ".shellescape(a:fname)) endif -" call Decho("amiga: dirname<".dirname."> (go up one dir)") - else - " unix or cygwin -" call Decho('case "go up one directory": newdir == "../" and unix or cygwin') - if a:islocal - let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','') - if dirname == "" - let dirname= '/' - endif + " use vim functions to return information about file below cursor +" call Decho("using vim functions to query for file info") + if !isdirectory(a:fname) && !filereadable(a:fname) && a:fname =~ '[*@/]' + let fname= substitute(a:fname,".$","","") else - let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','') + let fname= a:fname endif -" call Decho("unix: dirname<".dirname."> (go up one dir)") + let t = getftime(fname) + let sz = getfsize(fname) + echo a:fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname)) +" call Decho(fname.": ".sz." ".strftime(g:netrw_timefmt,getftime(fname))) endif - call s:SetRexDir(a:islocal,dirname) + else + echo "sorry, \"qf\" not supported yet for remote files" + endif + let @@= ykeep +" call Dret("s:NetrwFileInfo") +endfun - elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") -" call Decho('case liststyle is TREELIST and w:netrw_treedict exists') - " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh) - setlocal noro ma -" call Decho("setlocal noro ma") - if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")) -" call Decho("clear buffer<".expand("%")."> with :%d") - keepj %d +" --------------------------------------------------------------------- +" s:NetrwGetBuffer: {{{2 +" returns 0=cleared buffer +" 1=re-used buffer +fun! s:NetrwGetBuffer(islocal,dirname) +" call Dfunc("s:NetrwGetBuffer(islocal=".a:islocal." dirname<".a:dirname.">) liststyle=".g:netrw_liststyle) +" call Decho("(NetrwGetBuffer) modiable=".&mod." modifiable=".&ma." readonly=".&ro) + let dirname= a:dirname + + " re-use buffer if possible {{{3 +" call Decho("(NetrwGetBuffer) --re-use a buffer if possible--") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST + " find NetrwTreeList buffer if there is one +" call Decho("(NetrwGetBuffer) case liststyle=treelist: find NetrwTreeList buffer if there is one") + if exists("w:netrw_treebufnr") && w:netrw_treebufnr > 0 +" call Decho("(NetrwGetBuffer) re-using w:netrw_treebufnr=".w:netrw_treebufnr) + setl mod + sil! keepj %d + let eikeep= &ei + set ei=all + exe "sil! keepalt b ".w:netrw_treebufnr + let &ei= eikeep +" call Dret("s:NetrwGetBuffer 0 : bufnum#".w:netrw_treebufnr."") + return 0 endif - let treedir = s:NetrwTreeDir() - let s:treecurpos = nbcd_curpos - let haskey= 0 -" call Decho("w:netrw_treedict<".string(w:netrw_treedict).">") + let bufnum= -1 +" call Decho("(NetrwGetBuffer) liststyle=TREE but w:netrw_treebufnr doesn't exist") - " search treedict for tree dir as-is - if has_key(w:netrw_treedict,treedir) -" call Decho('....searched for treedir<'.treedir.'> : found it!') - let haskey= 1 - else -" call Decho('....searched for treedir<'.treedir.'> : not found') + else + " find buffer number of buffer named precisely the same as dirname {{{3 +" call Decho("(NetrwGetBuffer) case listtyle not treelist: find buffer numnber of buffer named precisely the same as dirname--") + + " get dirname and associated buffer number + let bufnum = bufnr(escape(dirname,'\')) +" call Decho("(NetrwGetBuffer) find buffer<".dirname.">'s number ") +" call Decho("(NetrwGetBuffer) bufnr(dirname<".escape(dirname,'\').">)=".bufnum) + + if bufnum < 0 && dirname !~ '/$' + " try appending a trailing / +" call Decho("(NetrwGetBuffer) try appending a trailing / to dirname<".dirname.">") + let bufnum= bufnr(escape(dirname.'/','\')) + if bufnum > 0 + let dirname= dirname.'/' + endif endif - " search treedict for treedir with a / appended - if !haskey && treedir !~ '/$' - if has_key(w:netrw_treedict,treedir."/") - let treedir= treedir."/" -" call Decho('....searched.for treedir<'.treedir.'> found it!') - let haskey = 1 + if bufnum < 0 && dirname =~ '/$' + " try removing a trailing / +" call Decho("(NetrwGetBuffer) try removing a trailing / from dirname<".dirname.">") + let bufnum= bufnr(escape(substitute(dirname,'/$','',''),'\')) + if bufnum > 0 + let dirname= substitute(dirname,'/$','','') + endif + endif + +" call Decho("(NetrwGetBuffer) findbuf1: bufnum=bufnr('".dirname."')=".bufnum." bufname(".bufnum.")<".bufname(bufnum)."> (initial)") + " note: !~ was used just below, but that means using ../ to go back would match (ie. abc/def/ and abc/ matches) + if bufnum > 0 && bufname(bufnum) != dirname && bufname(bufnum) != '.' + " handle approximate matches +" call Decho("(NetrwGetBuffer) handling approx match: bufnum#".bufnum.">0 AND bufname<".bufname(bufnum).">!=dirname<".dirname."> AND bufname(".bufnum.")!='.'") + let ibuf = 1 + let buflast = bufnr("$") +" call Decho("(NetrwGetBuffer) findbuf2: buflast=bufnr($)=".buflast) + while ibuf <= buflast + let bname= substitute(bufname(ibuf),'\\','/','g') + let bname= substitute(bname,'.\zs/$','','') +" call Decho("(NetrwGetBuffer) findbuf3: while [ibuf=",ibuf."]<=[buflast=".buflast."]: dirname<".dirname."> bname=bufname(".ibuf.")<".bname.">") + if bname != '' && dirname =~ '/'.bname.'/\=$' && dirname !~ '^/' + " bname is not empty + " dirname ends with bname, + " dirname doesn't start with /, so its not a absolute path +" call Decho("(NetrwGetBuffer) findbuf3a: passes test 1 : dirname<".dirname.'> =~ /'.bname.'/\=$ && dirname !~ ^/') + break + endif + if bname =~ '^'.dirname.'/\=$' + " bname begins with dirname +" call Decho(' findbuf3b: passes test 2 : bname<'.bname.'>=~^'.dirname.'/\=$') + break + endif + if dirname =~ '^'.bname.'/$' +" call Decho(' findbuf3c: passes test 3 : dirname<'.dirname.'>=~^'.bname.'/$') + break + endif + if bname != '' && dirname =~ '/'.bname.'$' && bname == bufname("%") && line("$") == 1 +" call Decho(' findbuf3d: passes test 4 : dirname<'.dirname.'>=~ /'.bname.'$') + break + endif + let ibuf= ibuf + 1 + endwhile + if ibuf > buflast + let bufnum= -1 else -" call Decho('....searched for treedir<'.treedir.'/> : not found') + let bufnum= ibuf endif +" call Decho("(NetrwGetBuffer) findbuf4: bufnum=".bufnum." (ibuf=".ibuf." buflast=".buflast.")") endif + endif - " search treedict for treedir with any trailing / elided - if !haskey && treedir =~ '/$' - let treedir= substitute(treedir,'/$','','') - if has_key(w:netrw_treedict,treedir) -" call Decho('....searched.for treedir<'.treedir.'> found it!') - let haskey = 1 + " get enew buffer and name it -or- re-use buffer {{{3 +" call Decho("(NetrwGetBuffer) get enew buffer and name it OR re-use buffer") + sil! keepj keepalt mark ' + if bufnum < 0 || !bufexists(bufnum) +" call Decho("(NetrwGetBuffer) --get enew buffer and name it (bufnum#".bufnum."<0 OR bufexists(".bufnum.")=".bufexists(bufnum)."==0)") + call s:NetrwEnew(dirname) +" call Decho("(NetrwGetBuffer) got enew buffer#".bufnr("%")." (altbuf<".expand("#").">)") + " name the buffer + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST + " Got enew buffer; transform into a NetrwTreeListing +" call Decho("(NetrwGetBuffer) --transform enew buffer#".bufnr("%")." into a NetrwTreeListing --") + if !exists("s:netrw_treelistnum") + let s:netrw_treelistnum= 1 else -" call Decho('....searched for treedir<'.treedir.'> : not found') + let s:netrw_treelistnum= s:netrw_treelistnum + 1 endif + let w:netrw_treebufnr= bufnr("%") +" call Decho("(NetrwGetBuffer) exe sil! keepalt file NetrwTreeListing ".fnameescape(s:netrw_treelistnum)) + exe 'sil! keepalt file NetrwTreeListing\ '.fnameescape(s:netrw_treelistnum) + set bt=nofile noswf + nnoremap [ :sil call TreeListMove('[') + nnoremap ] :sil call TreeListMove(']') + nnoremap [[ :sil call TreeListMove('[') + nnoremap ]] :sil call TreeListMove(']') +" call Decho("(NetrwGetBuffer) tree listing#".s:netrw_treelistnum." bufnr=".w:netrw_treebufnr) + else +" let v:errmsg= "" " Decho + let escdirname= fnameescape(dirname) +" call Decho("(NetrwGetBuffer) errmsg<".v:errmsg."> bufnr(escdirname<".escdirname.">)=".bufnr(escdirname)." bufname()<".bufname(bufnr(escdirname)).">") +" call Decho(' exe sil! keepalt file '.escdirname) +" let v:errmsg= "" " Decho + exe 'sil! keepalt file '.escdirname +" call Decho("(NetrwGetBuffer) errmsg<".v:errmsg."> bufnr(".escdirname.")=".bufnr(escdirname)."<".bufname(bufnr(escdirname)).">") endif +" call Decho("(NetrwGetBuffer) named enew buffer#".bufnr("%")."<".bufname("%").">") - if haskey - " close tree listing for selected subdirectory -" call Decho("closing selected subdirectory<".dirname.">") - call remove(w:netrw_treedict,treedir) -" call Decho("removed entry<".treedir."> from treedict") -" call Decho("yielding treedict<".string(w:netrw_treedict).">") - let dirname= w:netrw_treetop + else " Re-use the buffer +" call Decho("(NetrwGetBuffer) --re-use buffer#".bufnum." (bufnum#".bufnum.">=0 AND bufexists(".bufnum.")=".bufexists(bufnum)."!=0)") + let eikeep= &ei + set ei=all + if getline(2) =~ '^" Netrw Directory Listing' +" call Decho("(NetrwGetBuffer) getline(2)<".getline(2).'> matches "Netrw Directory Listing" : using keepalt b '.bufnum) + exe "sil! keepalt b ".bufnum else - " go down one directory - let dirname= substitute(treedir,'/*$','/','') -" call Decho("go down one dir: treedir<".treedir.">") +" call Decho("(NetrwGetBuffer) getline(2)<".getline(2).'> does not match "Netrw Directory Listing" : using b '.bufnum) + exe "sil! keepalt b ".bufnum endif - call s:SetRexDir(a:islocal,dirname) - let s:treeforceredraw = 1 - - else - " go down one directory - let dirname= s:ComposePath(dirname,newdir) -" call Decho("go down one dir: dirname<".dirname."> newdir<".newdir.">") - call s:SetRexDir(a:islocal,dirname) - endif - - call s:NetrwOptionRestore("s:") - if dolockout -" call Decho("filewritable(dirname<".dirname.">)=".filewritable(dirname)) - if filewritable(dirname) -" call Decho("doing modification lockout settings: ma nomod noro") - setlocal ma nomod noro + if bufname("%") == '.' +" call Decho("(NetrwGetBuffer) exe sil! keepalt file ".fnameescape(getcwd())) + exe "sil! keepalt file ".fnameescape(getcwd()) + endif + let &ei= eikeep + if line("$") <= 1 + keepj call s:NetrwListSettings(a:islocal) +" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but its empty, so refresh it") + return 0 + elseif g:netrw_fastbrowse == 0 || (a:islocal && g:netrw_fastbrowse == 1) + keepj call s:NetrwListSettings(a:islocal) + sil keepj %d +" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but refreshing due to g:netrw_fastbrowse=".g:netrw_fastbrowse) + return 0 + elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST +" call Decho("(NetrwGetBuffer) --re-use tree listing--") +" call Decho("(NetrwGetBuffer) clear buffer<".expand("%")."> with :%d") + sil keepj %d + keepj call s:NetrwListSettings(a:islocal) +" call Dret("s:NetrwGetBuffer 0 : re-using buffer#".bufnr("%").", but treelist mode always needs a refresh") + return 0 else -" call Decho("doing modification lockout settings: ma nomod ro") - setlocal ma nomod ro +" call Dret("s:NetrwGetBuffer 1 : buf#".bufnr("%")) + return 1 endif -" call Decho("setlocal ma nomod noro") endif -" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">") - return dirname + " do netrw settings: make this buffer not-a-file, modifiable, not line-numbered, etc {{{3 + " fastbrowse Local Remote Hiding a buffer implies it may be re-used (fast) + " slow 0 D D Deleting a buffer implies it will not be re-used (slow) + " med 1 D H + " fast 2 H H +" call Decho("(NetrwGetBuffer) --do netrw settings: make this buffer#".bufnr("%")." not-a-file, modifiable, not line-numbered, etc--") + let fname= expand("%") + keepj call s:NetrwListSettings(a:islocal) +" call Decho("(NetrwGetBuffer) exe sil! keepalt file ".fnameescape(fname)) + exe "sil! keepj keepalt file ".fnameescape(fname) + + " delete all lines from buffer {{{3 +" call Decho("(NetrwGetBuffer) --delete all lines from buffer--") +" call Decho("(NetrwGetBuffer) clear buffer<".expand("%")."> with :%d") + sil! keepalt keepj %d + +" call Dret("s:NetrwGetBuffer 0 : tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly) + return 0 endfun " --------------------------------------------------------------------- -" s:NetrwBrowseX: (implements "x") executes a special "viewer" script or program for the {{{2 -" given filename; typically this means given their extension. -" 0=local, 1=remote -fun! netrw#NetrwBrowseX(fname,remote) -" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")") - - " special core dump handler - if a:fname =~ '/core\(\.\d\+\)\=$' - if exists("g:Netrw_corehandler") - if type(g:Netrw_corehandler) == 2 - " g:Netrw_corehandler is a function reference (see :help Funcref) -" call Decho("g:Netrw_corehandler is a funcref") - call g:Netrw_corehandler(a:fname) - elseif type(g:netrw_corehandler) == 3) - " g:Netrw_corehandler is a List of function references (see :help Funcref) -" call Decho("g:Netrw_corehandler is a List") - for Fncref in g:Netrw_corehandler - if type(FncRef) == 2 - call FncRef(a:fname) - endif - endfor - endif -" call Dret("NetrwBrowseX : coredump handler invoked") - return - endif +" s:NetrwGetcwd: get the current directory. {{{2 +" Change backslashes to forward slashes, if any. +" If doesc is true, escape certain troublesome characters +fun! s:NetrwGetcwd(doesc) +" call Dfunc("NetrwGetcwd(doesc=".a:doesc.")") + let curdir= substitute(getcwd(),'\\','/','ge') + if curdir !~ '[\/]$' + let curdir= curdir.'/' endif - - " set up the filename - " (lower case the extension, make a local copy of a remote file) - let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e') - if has("win32") || has("win95") || has("win64") || has("win16") - let exten= substitute(exten,'^.*$','\L&\E','') + if a:doesc + let curdir= fnameescape(curdir) endif -" call Decho("exten<".exten.">") +" call Dret("NetrwGetcwd <".curdir.">") + return curdir +endfun - " seems kde systems often have gnome-open due to dependencies, even though - " gnome-open's subsidiary display tools are largely absent. Kde systems - " usually have "kdeinit" running, though... (tnx Mikolaj Machowski) - if !exists("s:haskdeinit") - if has("unix") - let s:haskdeinit= system("ps -e") =~ 'kdeinit' - if v:shell_error - let s:haskdeinit = 0 - endif +" --------------------------------------------------------------------- +" s:NetrwGetWord: it gets the directory/file named under the cursor {{{2 +fun! s:NetrwGetWord() +" call Dfunc("s:NetrwGetWord() line#".line(".")." liststyle=".g:netrw_liststyle." virtcol=".virtcol(".")) + call s:UseBufWinVars() + + " insure that w:netrw_liststyle is set up + if !exists("w:netrw_liststyle") + if exists("g:netrw_liststyle") + let w:netrw_liststyle= g:netrw_liststyle else - let s:haskdeinit= 0 + let w:netrw_liststyle= s:THINLIST endif -" call Decho("setting s:haskdeinit=".s:haskdeinit) +" call Decho("w:netrw_liststyle=".w:netrw_liststyle) endif - if a:remote == 1 - " create a local copy -" call Decho("a:remote=".a:remote.": create a local copy of <".a:fname.">") - setlocal bh=delete - call netrw#NetRead(3,a:fname) - " attempt to rename tempfile - let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','') - let newname= substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','') -" call Decho("basename<".basename.">") -" call Decho("newname <".newname.">") - if rename(s:netrw_tmpfile,newname) == 0 - " renaming succeeded - let fname= newname - else - " renaming failed - let fname= s:netrw_tmpfile + if exists("w:netrw_bannercnt") && line(".") < w:netrw_bannercnt + " Active Banner support +" call Decho("active banner handling") + keepj norm! 0 + let dirname= "./" + let curline= getline('.') + + if curline =~ '"\s*Sorted by\s' + keepj norm s + let s:netrw_skipbrowse= 1 + echo 'Pressing "s" also works' + + elseif curline =~ '"\s*Sort sequence:' + let s:netrw_skipbrowse= 1 + echo 'Press "S" to edit sorting sequence' + + elseif curline =~ '"\s*Quick Help:' + keepj norm ? + let s:netrw_skipbrowse= 1 + echo 'Pressing "?" also works' + + elseif curline =~ '"\s*\%(Hiding\|Showing\):' + keepj norm a + let s:netrw_skipbrowse= 1 + echo 'Pressing "a" also works' + + elseif line("$") > w:netrw_bannercnt + exe 'sil keepj '.w:netrw_bannercnt endif + + elseif w:netrw_liststyle == s:THINLIST +" call Decho("thin column handling") + keepj norm! 0 + let dirname= getline('.') + + elseif w:netrw_liststyle == s:LONGLIST +" call Decho("long column handling") + keepj norm! 0 + let dirname= substitute(getline('.'),'^\(\%(\S\+ \)*\S\+\).\{-}$','\1','e') + + elseif w:netrw_liststyle == s:TREELIST +" call Decho("treelist handling") + let dirname= substitute(getline('.'),'^\(| \)*','','e') + else - let fname= a:fname - " special ~ handler for local - if fname =~ '^\~' && expand("$HOME") != "" -" call Decho('invoking special ~ handler') - let fname= substitute(fname,'^\~',expand("$HOME"),'') +" call Decho("obtain word from wide listing") + let dirname= getline('.') + + if !exists("b:netrw_cpf") + let b:netrw_cpf= 0 + exe 'sil keepj '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif' + call histdel("/",-1) +" call Decho("computed cpf=".b:netrw_cpf) endif - endif -" call Decho("fname<".fname.">") -" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten)) - " set up redirection - if &srr =~ "%s" - if (has("win32") || has("win95") || has("win64") || has("win16")) - let redir= substitute(&srr,"%s","nul","") +" call Decho("buf#".bufnr("%")."<".bufname("%").">") + let filestart = (virtcol(".")/b:netrw_cpf)*b:netrw_cpf +" call Decho("filestart= ([virtcol=".virtcol(".")."]/[b:netrw_cpf=".b:netrw_cpf."])*b:netrw_cpf=".filestart." bannercnt=".w:netrw_bannercnt) +" call Decho("1: dirname<".dirname.">") + if filestart == 0 + keepj norm! 0ma else - let redir= substitute(&srr,"%s","/dev/null","") + call cursor(line("."),filestart+1) + keepj norm! ma endif - elseif (has("win32") || has("win95") || has("win64") || has("win16")) - let redir= &srr . "nul" - else - let redir= &srr . "/dev/null" - endif -" call Decho("redir{".redir."} srr{".&srr."}") - - " extract any viewing options. Assumes that they're set apart by quotes. - if exists("g:netrw_browsex_viewer") -" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">") - if g:netrw_browsex_viewer =~ '\s' - let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','') - let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." " - let oviewer = '' - let cnt = 1 - while !executable(viewer) && viewer != oviewer - let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','') - let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." " - let cnt = cnt + 1 - let oviewer = viewer -" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">") - endwhile + let rega= @a + let eofname= filestart + b:netrw_cpf + 1 + if eofname <= col("$") + call cursor(line("."),filestart+b:netrw_cpf+1) + keepj norm! "ay`a else - let viewer = g:netrw_browsex_viewer - let viewopt = "" + keepj norm! "ay$ endif -" call Decho("viewer<".viewer."> viewopt<".viewopt.">") + let dirname = @a + let @a = rega +" call Decho("2: dirname<".dirname.">") + let dirname= substitute(dirname,'\s\+$','','e') +" call Decho("3: dirname<".dirname.">") endif - " execute the file handler - if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-' -" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">") - let ret= netrwFileHandlers#Invoke(exten,fname) + " symlinks are indicated by a trailing "@". Remove it before further processing. + let dirname= substitute(dirname,"@$","","") - elseif exists("g:netrw_browsex_viewer") && executable(viewer) -" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">") -" call Decho("exe silent !".viewer." ".viewopt.shellescape(fname,1).redir) - exe "silent !".viewer." ".viewopt.shellescape(fname,1).redir - let ret= v:shell_error + " executables are indicated by a trailing "*". Remove it before further processing. + let dirname= substitute(dirname,"\*$","","") + +" call Dret("s:NetrwGetWord <".dirname.">") + return dirname +endfun + +" --------------------------------------------------------------------- +" s:NetrwListSettings: make standard settings for a netrw listing {{{2 +fun! s:NetrwListSettings(islocal) +" call Dfunc("s:NetrwListSettings(islocal=".a:islocal.")") + let fname= bufname("%") +" call Decho("(NetrwListSettings) setl bt=nofile nobl ma nonu nowrap noro") + setl bt=nofile nobl ma nonu nowrap noro +" call Decho("(NetrwListSettings) exe sil! keepalt file ".fnameescape(fname)) + exe "sil! keepalt file ".fnameescape(fname) + if g:netrw_use_noswf + setl noswf + endif +" call Decho("(NetrwListSettings) exe setl ts=".(g:netrw_maxfilenamelen+1)) + exe "setl ts=".(g:netrw_maxfilenamelen+1) + setl isk+=.,~,- + if g:netrw_fastbrowse > a:islocal + setl bh=hide + else + setl bh=delete + endif +" call Dret("s:NetrwListSettings") +endfun + +" --------------------------------------------------------------------- +" s:NetrwListStyle: {{{2 +" islocal=0: remote browsing +" =1: local browsing +fun! s:NetrwListStyle(islocal) +" call Dfunc("NetrwListStyle(islocal=".a:islocal.") w:netrw_liststyle=".w:netrw_liststyle) + let ykeep = @@ + let fname = s:NetrwGetWord() + if !exists("w:netrw_liststyle")|let w:netrw_liststyle= g:netrw_liststyle|endif + let w:netrw_liststyle = (w:netrw_liststyle + 1) % s:MAXLIST +" call Decho("fname<".fname.">") +" call Decho("chgd w:netrw_liststyle to ".w:netrw_liststyle) +" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "doesn't exist").">") - elseif has("win32") || has("win64") - if executable("start") -" call Decho('exe silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)) - exe 'silent !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1) - elseif executable("rundll32") -" call Decho('exe silent !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)) - exe 'silent !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1) - else - call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74) - endif - call inputsave()|call input("Press to continue")|call inputrestore() - let ret= v:shell_error + if w:netrw_liststyle == s:THINLIST + " use one column listing +" call Decho("use one column list") + let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') - elseif has("unix") && executable("gnome-open") && !s:haskdeinit -" call Decho("exe silent !gnome-open ".shellescape(fname,1)." ".redir) - exe "sil !gnome-open ".shellescape(fname,1).redir - let ret= v:shell_error + elseif w:netrw_liststyle == s:LONGLIST + " use long list +" call Decho("use long list") + let g:netrw_list_cmd = g:netrw_list_cmd." -l" - elseif has("unix") && executable("kfmclient") && s:haskdeinit -" call Decho("exe silent !kfmclient exec ".shellescape(fname,1)." ".redir) - exe "sil !kfmclient exec ".shellescape(fname,1)." ".redir - let ret= v:shell_error + elseif w:netrw_liststyle == s:WIDELIST + " give wide list +" call Decho("use wide list") + let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') - elseif has("macunix") && executable("open") -" call Decho("exe silent !open ".shellescape(fname,1)." ".redir) - exe "sil !open ".shellescape(fname,1)." ".redir - let ret= v:shell_error + elseif w:netrw_liststyle == s:TREELIST +" call Decho("use tree list") + let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') else - " netrwFileHandlers#Invoke() always returns 0 - let ret= netrwFileHandlers#Invoke(exten,fname) - endif - - " if unsuccessful, attempt netrwFileHandlers#Invoke() - if ret - let ret= netrwFileHandlers#Invoke(exten,fname) + keepj call netrw#ErrorMsg(s:WARNING,"bad value for g:netrw_liststyle (=".w:netrw_liststyle.")",46) + let g:netrw_liststyle = s:THINLIST + let w:netrw_liststyle = g:netrw_liststyle + let g:netrw_list_cmd = substitute(g:netrw_list_cmd,' -l','','ge') endif + setl ma noro +" call Decho("setl ma noro") - " restoring redraw! after external file handlers - redraw! + " clear buffer - this will cause NetrwBrowse/LocalBrowseCheck to do a refresh +" call Decho("clear buffer<".expand("%")."> with :%d") + sil! keepj %d + " following prevents tree listing buffer from being marked "modified" +" call Decho("(NetrwListStyle) setl nomod") + setl nomod +" call Decho("(NetrwListStyle) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") - " cleanup: remove temporary file, - " delete current buffer if success with handler, - " return to prior buffer (directory listing) - " Feb 12, 2008: had to de-activiate removal of - " temporary file because it wasn't getting seen. -" if a:remote == 1 && fname != a:fname -" call Decho("deleting temporary file<".fname.">") -" call s:NetrwDelete(fname) -" endif + " refresh the listing +" call Decho("(NetrwListStyle) refresh the listing") + let svpos= netrw#NetrwSavePosn() + keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + keepj call netrw#NetrwRestorePosn(svpos) + keepj call s:NetrwCursor() - if a:remote == 1 - setlocal bh=delete bt=nofile - if g:netrw_use_noswf - setlocal noswf - endif - exe "keepj norm! \" -" redraw! + " keep cursor on the filename + sil! keepj $ + let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc') +" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A')) + if result <= 0 && exists("w:netrw_bannercnt") + exe "sil! keepj ".w:netrw_bannercnt endif + let @@= ykeep -" call Dret("NetrwBrowseX") +" call Dret("NetrwListStyle".(exists("w:netrw_liststyle")? ' : w:netrw_liststyle='.w:netrw_liststyle : "")) endfun " --------------------------------------------------------------------- -" s:NetrwChgPerm: (implements "gp") change file permission {{{2 -fun! s:NetrwChgPerm(islocal,curdir) -" call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)") - call inputsave() - let newperm= input("Enter new permission: ") - call inputrestore() - let chgperm= substitute(g:netrw_chgperm,'\',shellescape(expand("")),'') - let chgperm= substitute(chgperm,'\',shellescape(newperm),'') -" call Decho("chgperm<".chgperm.">") - call system(chgperm) - if v:shell_error != 0 - call netrw#ErrorMsg(1,"changing permission on file<".expand("")."> seems to have failed",75) - endif - if a:islocal - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - endif -" call Dret("s:NetrwChgPerm") -endfun +" s:NetrwBannerCtrl: toggles the display of the banner {{{2 +fun! s:NetrwBannerCtrl(islocal) +" call Dfunc("s:NetrwBannerCtrl(islocal=".a:islocal.") g:netrw_banner=".g:netrw_banner) -" --------------------------------------------------------------------- -" s:NetrwClearExplore: clear explore variables (if any) {{{2 -fun! s:NetrwClearExplore() -" call Dfunc("s:NetrwClearExplore()") - 2match none - if exists("s:explore_match") |unlet s:explore_match |endif - if exists("s:explore_indx") |unlet s:explore_indx |endif - if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif - if exists("s:dirstarstar") |unlet s:dirstarstar |endif - if exists("s:explore_prvdir") |unlet s:explore_prvdir |endif - if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif - if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif - if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif - if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif -" redraw! - echo " " - echo " " -" call Dret("s:NetrwClearExplore") + let ykeep= @@ + " toggle the banner (enable/suppress) + let g:netrw_banner= !g:netrw_banner + + " refresh the listing + let svpos= netrw#NetrwSavePosn() + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + + " keep cursor on the filename + let fname= s:NetrwGetWord() + sil keepj $ + let result= search('\%(^\%(|\+\s\)\=\|\s\{2,}\)\zs'.escape(fname,'.\[]*$^').'\%(\s\{2,}\|$\)','bc') +" call Decho("search result=".result." w:netrw_bannercnt=".(exists("w:netrw_bannercnt")? w:netrw_bannercnt : 'N/A')) + if result <= 0 && exists("w:netrw_bannercnt") + exe "keepj ".w:netrw_bannercnt + endif + let @@= ykeep +" call Dret("s:NetrwBannerCtrl : g:netrw_banner=".g:netrw_banner) endfun " --------------------------------------------------------------------- -" netrw#Explore: launch the local browser in the directory of the current file {{{2 -" indx: == -1: Nexplore -" == -2: Pexplore -" == +: this is overloaded: -" * If Nexplore/Pexplore is in use, then this refers to the -" indx'th item in the w:netrw_explore_list[] of items which -" matched the */pattern **/pattern *//pattern **//pattern -" * If Hexplore or Vexplore, then this will override -" g:netrw_winsize to specify the qty of rows or columns the -" newly split window should have. -" dosplit==0: the window will be split iff the current file has been modified -" dosplit==1: the window will be split before running the local browser -" style == 0: Explore style == 1: Explore! -" == 2: Hexplore style == 3: Hexplore! -" == 4: Vexplore style == 5: Vexplore! -" == 6: Texplore -fun! netrw#Explore(indx,dosplit,style,...) -" call Dfunc("netrw#Explore(indx=".a:indx." dosplit=".a:dosplit." style=".a:style.",a:1<".a:1.">) &modified=".&modified." a:0=".a:0) - if !exists("b:netrw_curdir") - let b:netrw_curdir= getcwd() -" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)") +" s:NetrwBookmarkMenu: Uses menu priorities {{{2 +" .2.[cnt] for bookmarks, and +" .3.[cnt] for history +" (see s:NetrwMenu()) +fun! s:NetrwBookmarkMenu() + if !exists("s:netrw_menucnt") + return endif - let curdir = simplify(b:netrw_curdir) - let curfiledir = substitute(expand("%:p"),'^\(.*[/\\]\)[^/\\]*$','\1','e') -" call Decho("curdir<".curdir."> curfiledir<".curfiledir.">") - - " save registers - sil! let keepregstar = @* - sil! let keepregplus = @+ - sil! let keepregslash= @/ +" call Dfunc("NetrwBookmarkMenu() histcnt=".g:netrw_dirhist_cnt." menucnt=".s:netrw_menucnt) - " if dosplit or file has been modified - if a:dosplit || &modified || a:style == 6 -" call Decho("case dosplit=".a:dosplit." modified=".&modified." a:style=".a:style.": dosplit or file has been modified") - call s:SaveWinVars() - let winsize= g:netrw_winsize - if a:indx > 0 - let winsize= a:indx + " the following test assures that gvim is running, has menus available, and has menus enabled. + if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu + if exists("g:NetrwTopLvlMenu") +" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)") + exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks' + exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete' + endif + if !exists("s:netrw_initbookhist") + call s:NetrwBookHistRead() endif - if a:style == 0 " Explore, Sexplore -" call Decho("style=0: Explore or Sexplore") - exe winsize."wincmd s" + " show bookmarked places + if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0 + let cnt= 1 + for bmd in g:netrw_bookmarklist + let ebmd= escape(bmd,g:netrw_menu_escape) +" call Decho('sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmark.'.ebmd.' :e '.bmd) - elseif a:style == 1 "Explore!, Sexplore! -" call Decho("style=1: Explore! or Sexplore!") - exe winsize."wincmd v" + " show bookmarks for goto menu + exe 'sil! menu '.g:NetrwMenuPriority.".2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks.'.ebmd.' :e '.bmd."\" - elseif a:style == 2 " Hexplore -" call Decho("style=2: Hexplore") - exe "bel ".winsize."wincmd s" + " show bookmarks for deletion menu + exe 'sil! menu '.g:NetrwMenuPriority.".8.2.".cnt." ".g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Delete.'.ebmd.' '.cnt."mB" + let cnt= cnt + 1 + endfor - elseif a:style == 3 " Hexplore! -" call Decho("style=3: Hexplore!") - exe "abo ".winsize."wincmd s" + endif - elseif a:style == 4 " Vexplore -" call Decho("style=4: Vexplore") - exe "lefta ".winsize."wincmd v" + " show directory browsing history + if g:netrw_dirhistmax > 0 + let cnt = g:netrw_dirhist_cnt + let first = 1 + let histcnt = 0 + while ( first || cnt != g:netrw_dirhist_cnt ) + let histcnt = histcnt + 1 + let priority = g:netrw_dirhist_cnt + histcnt + if exists("g:netrw_dirhist_{cnt}") + let histdir= escape(g:netrw_dirhist_{cnt},g:netrw_menu_escape) +" call Decho('sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir) + exe 'sil! menu '.g:NetrwMenuPriority.".3.".priority." ".g:NetrwTopLvlMenu.'History.'.histdir.' :e '.histdir."\" + endif + let first = 0 + let cnt = ( cnt - 1 ) % g:netrw_dirhistmax + if cnt < 0 + let cnt= cnt + g:netrw_dirhistmax + endif + endwhile + endif - elseif a:style == 5 " Vexplore! -" call Decho("style=5: Vexplore!") - exe "rightb ".winsize."wincmd v" + endif +" call Dret("NetrwBookmarkMenu") +endfun - elseif a:style == 6 " Texplore - call s:SaveBufVars() -" call Decho("style = 6: Texplore") - tabnew - call s:RestoreBufVars() - endif - call s:RestoreWinVars() -" else " Decho -" call Decho("case a:dosplit=".a:dosplit." AND modified=".&modified." AND a:style=".a:style." is not 6") +" --------------------------------------------------------------------- +" s:NetrwBrowseChgDir: constructs a new directory based on the current {{{2 +" directory and a new directory name. Also, if the +" "new directory name" is actually a file, +" NetrwBrowseChgDir() edits the file. +fun! s:NetrwBrowseChgDir(islocal,newdir,...) +" call Dfunc("s:NetrwBrowseChgDir(islocal=".a:islocal."> newdir<".a:newdir.">) a:0=".a:0." curpos<".string(getpos("."))."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "").">") + + let ykeep= @@ + if !exists("b:netrw_curdir") + " Don't try to change-directory: this can happen, for example, when netrw#ErrorMsg has been called + " and the current window is the NetrwMessage window. + let @@= ykeep +" call Decho("(NetrwBrowseChgDir) b:netrw_curdir doesn't exist!") +" call Decho("(NetrwBrowseChgDir) getcwd<".getcwd().">") +" call Dret("s:NetrwBrowseChgDir") + return endif - keepj norm! 0 - if a:0 > 0 -" call Decho("case [a:0=".a:0."] > 0: a:1<".a:1.">") - if a:1 =~ '^\~' && (has("unix") || (exists("g:netrw_cygwin") && g:netrw_cygwin)) -" call Decho("case a:1: ~ and unix or cygwin") - let dirname= simplify(substitute(a:1,'\~',expand("$HOME"),'')) -" call Decho("using dirname<".dirname."> (case: ~ && unix||cygwin)") - elseif a:1 == '.' -" call Decho("case a:1: .") - let dirname= simplify(exists("b:netrw_curdir")? b:netrw_curdir : getcwd()) - if dirname !~ '/$' - let dirname= dirname."/" - endif -" call Decho("using dirname<".dirname."> (case: ".(exists("b:netrw_curdir")? "b:netrw_curdir" : "getcwd()").")") - elseif a:1 =~ '\$' -" call Decho("case a:1: $") - let dirname= simplify(expand(a:1)) -" call Decho("using user-specified dirname<".dirname."> with $env-var") - elseif a:1 !~ '^\*/' -" call Decho("case a:1: other, not pattern or filepattern") - let dirname= simplify(a:1) -" call Decho("using user-specified dirname<".dirname.">") - else -" call Decho("case a:1: pattern or filepattern") - let dirname= a:1 - endif + " NetrwBrowseChgDir: save options and initialize {{{3 + keepj call s:NetrwOptionSave("s:") + keepj call s:NetrwSafeOptions() + let nbcd_curpos = netrw#NetrwSavePosn() + let s:nbcd_curpos_{bufnr('%')} = nbcd_curpos +" call Decho("(NetrwBrowseChgDir) setting s:nbcd_curpos_".bufnr('%')." to SavePosn") + if (has("win32") || has("win95") || has("win64") || has("win16")) + let dirname = substitute(b:netrw_curdir,'\\','/','ge') else - " clear explore -" call Decho("case a:0=".a:0.": clearing Explore list") - call s:NetrwClearExplore() -" call Dret("netrw#Explore : cleared list") - return + let dirname= b:netrw_curdir + endif + let newdir = a:newdir + let dolockout = 0 + + " set up o/s-dependent directory recognition pattern + if has("amiga") + let dirpat= '[\/:]$' + else + let dirpat= '[\/]$' + endif +" call Decho("(NetrwBrowseChgDir) dirname<".dirname."> dirpat<".dirpat.">") + + if dirname !~ dirpat + " apparently vim is "recognizing" that it is in a directory and + " is removing the trailing "/". Bad idea, so let's put it back. + let dirname= dirname.'/' +" call Decho("(NetrwBrowseChgDir) adjusting dirname<".dirname.">") endif -" call Decho("dirname<".dirname.">") - if dirname =~ '\.\./\=$' - let dirname= simplify(fnamemodify(dirname,':p:h')) - elseif dirname =~ '\.\.' || dirname == '.' - let dirname= simplify(fnamemodify(dirname,':p')) - endif -" call Decho("dirname<".dirname."> (after simplify)") + if newdir !~ dirpat + " ------------------------------ + " NetrwBrowseChgDir: edit a file {{{3 + " ------------------------------ +" call Decho('(NetrwBrowseChgDir:edit-a-file) case "handling a file": newdir<'.newdir.'> !~ dirpat<'.dirpat.">") - if dirname =~ '/\*\*/' - " handle .../**/.../filepat -" call Decho("case Explore .../**/.../filepat") - let prefixdir= substitute(dirname,'^\(.\{-}\)\*\*.*$','\1','') - if prefixdir =~ '^/' || (prefixdir =~ '^\a:/' && (has("win32") || has("win95") || has("win64") || has("win16"))) - let b:netrw_curdir = prefixdir + " save position for benefit of Rexplore + let s:rexposn_{bufnr("%")}= netrw#NetrwSavePosn() + +" call Decho("(NetrwBrowseChgDir:edit-a-file) setting s:rexposn_".bufnr("%")." to SavePosn") + if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") && newdir !~ '^\(/\|\a:\)' + let dirname= s:NetrwTreeDir() + if dirname =~ '/$' + let dirname= dirname.newdir + else + let dirname= s:NetrwTreeDir()."/".newdir + endif +" call Decho("(NetrwBrowseChgDir:edit-a-file) dirname<".dirname.">") +" call Decho("(NetrwBrowseChgDir:edit-a-file) tree listing") + elseif newdir =~ '^\(/\|\a:\)' + let dirname= newdir else - let b:netrw_curdir= getcwd().'/'.prefixdir + let dirname= s:ComposePath(dirname,newdir) endif - let dirname= substitute(dirname,'^.\{-}\(\*\*/.*\)$','\1','') - let starpat= 4; -" call Decho("pwd<".getcwd()."> dirname<".dirname.">") -" call Decho("case Explore ../**/../filepat (starpat=".starpat.")") +" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a file: dirname<".dirname."> (a:0=".a:0.")") + " this lets NetrwBrowseX avoid the edit + if a:0 < 1 +" call Decho("(NetrwBrowseChgDir:edit-a-file) set up windows for editing<".fnameescape(dirname)."> didsplit=".(exists("s:didsplit")? s:didsplit : "doesn't exist")) + keepj call s:NetrwOptionRestore("s:") + if !exists("s:didsplit") +" call Decho("(NetrwBrowseChgDir:edit-a-file) s:didsplit does not exist; g:netrw_browse_split=".g:netrw_browse_split." win#".winnr()) + if g:netrw_browse_split == 1 + " horizontally splitting the window first + keepalt new + if !&ea + keepalt wincmd _ + endif + elseif g:netrw_browse_split == 2 + " vertically splitting the window first + keepalt rightb vert new + if !&ea + keepalt wincmd | + endif + elseif g:netrw_browse_split == 3 + " open file in new tab + keepalt tabnew + elseif g:netrw_browse_split == 4 + " act like "P" (ie. open previous window) + if s:NetrwPrevWinOpen(2) == 3 + let @@= ykeep +" call Dret("s:NetrwBrowseChgDir") + return + endif + else + " handling a file, didn't split, so remove menu +" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a file+didn't split, so remove menu") + call s:NetrwMenu(0) + " optional change to window + if g:netrw_chgwin >= 1 + exe "keepj keepalt ".g:netrw_chgwin."wincmd w" + endif + endif + endif - elseif dirname =~ '^\*//' - " starpat=1: Explore *//pattern (current directory only search for files containing pattern) -" call Decho("case Explore *//pattern") - let pattern= substitute(dirname,'^\*//\(.*\)$','\1','') - let starpat= 1 -" call Decho("Explore *//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">") - if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif + " the point where netrw actually edits the (local) file + " if its local only: LocalBrowseCheck() doesn't edit a file, but NetrwBrowse() will + if a:islocal +" call Decho("(NetrwBrowseChgDir:edit-a-file) edit local file: exe e! ".fnameescape(dirname)) + exe "keepj keepalt e! ".fnameescape(dirname) + call s:NetrwCursor() + else +" call Decho("(NetrwBrowseChgDir:edit-a-file) remote file: NetrwBrowse will edit it") + endif + let dolockout= 1 - elseif dirname =~ '^\*\*//' - " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) -" call Decho("case Explore **//pattern") - let pattern= substitute(dirname,'^\*\*//','','') - let starpat= 2 -" call Decho("Explore **//pat: (starpat=".starpat.") dirname<".dirname."> -> pattern<".pattern.">") + " handle g:Netrw_funcref -- call external-to-netrw functions + " This code will handle g:Netrw_funcref as an individual function reference + " or as a list of function references. It will ignore anything that's not + " a function reference. See :help Funcref for information about function references. + if exists("g:Netrw_funcref") +" call Decho("(NetrwBrowseChgDir:edit-a-file) handle optional Funcrefs") + if type(g:Netrw_funcref) == 2 +" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a g:Netrw_funcref") + keepj call g:Netrw_funcref() + elseif type(g:Netrw_funcref) == 3 +" call Decho("(NetrwBrowseChgDir:edit-a-file) handling a list of g:Netrw_funcrefs") + for Fncref in g:Netrw_funcref + if type(FncRef) == 2 + keepj call FncRef() + endif + endfor + endif + endif + endif - elseif dirname =~ '^\*/' - " starpat=3: Explore */filepat (search in current directory for filenames matching filepat) - let starpat= 3 -" call Decho("case Explore */filepat (starpat=".starpat.")") + elseif newdir =~ '^/' + " ---------------------------------------------------- + " NetrwBrowseChgDir: just go to the new directory spec {{{3 + " ---------------------------------------------------- +" call Decho('(NetrwBrowseChgDir:goto-newdir) case "just go to new directory spec": newdir<'.newdir.'>') + let dirname = newdir + keepj call s:SetRexDir(a:islocal,dirname) + keepj call s:NetrwOptionRestore("s:") - elseif dirname=~ '^\*\*/' - " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) - let starpat= 4 -" call Decho("case Explore **/filepat (starpat=".starpat.")") + elseif newdir == './' + " --------------------------------------------- + " NetrwBrowseChgDir: refresh the directory list {{{3 + " --------------------------------------------- +" call Decho('(NetrwBrowseChgDir:refresh-dirlist) case "refresh directory listing": newdir == "./"') + keepj call s:SetRexDir(a:islocal,dirname) - else - let starpat= 0 -" call Decho("default case: starpat=".starpat) - endif + elseif newdir == '../' + " -------------------------------------- + " NetrwBrowseChgDir: go up one directory {{{3 + " -------------------------------------- +" call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../"') - if starpat == 0 && a:indx >= 0 - " [Explore Hexplore Vexplore Sexplore] [dirname] -" call Decho("case starpat==0 && a:indx=".a:indx.": dirname<".dirname."> Explore Hexplore Vexplore Sexplore") - if dirname == "" - let dirname= curfiledir -" call Decho("empty dirname, using current file's directory<".dirname.">") + if w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") + " force a refresh +" call Decho("(NetrwBrowseChgDir:go-up) clear buffer<".expand("%")."> with :%d") +" call Decho("(NetrwBrowseChgDir:go-up) setl noro ma") + setl noro ma + keepj %d endif - if dirname =~ '^scp:' || dirname =~ '^ftp:' -" call Decho("calling NetrwBrowse(0,dirname<".dirname.">)") - call s:NetrwBrowse(0,dirname) + + if has("amiga") + " amiga +" call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../" and amiga') + if a:islocal + let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+$\)','\1','') + let dirname= substitute(dirname,'/$','','') + else + let dirname= substitute(dirname,'^\(.*[/:]\)\([^/]\+/$\)','\1','') + endif +" call Decho("(NetrwBrowseChgDir:go-up) amiga: dirname<".dirname."> (go up one dir)") + else - if dirname == ""|let dirname= getcwd()|endif -" call Decho("calling LocalBrowseCheck(dirname<".dirname.">)") - call netrw#LocalBrowseCheck(dirname) + " unix or cygwin +" call Decho('(NetrwBrowseChgDir:go-up) case "go up one directory": newdir == "../" and unix or cygwin') + if a:islocal + let dirname= substitute(dirname,'^\(.*\)/\([^/]\+\)/$','\1','') + if dirname == "" + let dirname= '/' + endif + else + let dirname= substitute(dirname,'^\(\a\+://.\{-}/\{1,2}\)\(.\{-}\)\([^/]\+\)/$','\1\2','') + endif +" call Decho("(NetrwBrowseChgDir:go-up) unix: dirname<".dirname."> (go up one dir)") endif + keepj call s:SetRexDir(a:islocal,dirname) -" call Decho("curdir<".curdir.">") - if has("win32") || has("win95") || has("win64") || has("win16") - keepj call search('\<'.substitute(curdir,'^.*[/\\]','','e').'\>','cW') - else - keepj call search('\<'.substitute(curdir,'^.*/','','e').'\>','cW') + elseif exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") + " -------------------------------------- + " NetrwBrowseChgDir: Handle Tree Listing {{{3 + " -------------------------------------- +" call Decho('(NetrwBrowseChgDir:tree-list) case liststyle is TREELIST and w:netrw_treedict exists') + " force a refresh (for TREELIST, wait for NetrwTreeDir() to force the refresh) +" call Decho("(NetrwBrowseChgDir) (treelist) setl noro ma") + setl noro ma + if !(exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("b:netrw_curdir")) +" call Decho("(NetrwBrowseChgDir) clear buffer<".expand("%")."> with :%d") + keepj %d endif + let treedir = s:NetrwTreeDir() + let s:treecurpos = nbcd_curpos + let haskey= 0 +" call Decho("(NetrwBrowseChgDir:tree-list) w:netrw_treedict<".string(w:netrw_treedict).">") - " starpat=1: Explore *//pattern (current directory only search for files containing pattern) - " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) - " starpat=3: Explore */filepat (search in current directory for filenames matching filepat) - " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) - elseif a:indx <= 0 - " Nexplore, Pexplore, Explore: handle starpat -" call Decho("case a:indx<=0: Nexplore, Pexplore, , starpat=".starpat." a:indx=".a:indx) - if !mapcheck("","n") && !mapcheck("","n") && exists("b:netrw_curdir") -" call Decho("set up and maps") - let s:didstarstar= 1 - nnoremap :Pexplore - nnoremap :Nexplore + " search treedict for tree dir as-is + if has_key(w:netrw_treedict,treedir) +" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : found it!') + let haskey= 1 + else +" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : not found') endif - if has("path_extra") -" call Decho("starpat=".starpat.": has +path_extra") - if !exists("w:netrw_explore_indx") - let w:netrw_explore_indx= 0 + " search treedict for treedir with a / appended + if !haskey && treedir !~ '/$' + if has_key(w:netrw_treedict,treedir."/") + let treedir= treedir."/" +" call Decho('(NetrwBrowseChgDir:tree-list) ....searched.for treedir<'.treedir.'> found it!') + let haskey = 1 + else +" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'/> : not found') endif + endif - let indx = a:indx -" call Decho("starpat=".starpat.": set indx= [a:indx=".indx."]") - - if indx == -1 - " Nexplore -" call Decho("case Nexplore with starpat=".starpat.": (indx=".indx.")") - if !exists("w:netrw_explore_list") " sanity check - call netrw#ErrorMsg(s:WARNING,"using Nexplore or improperly; see help for netrw-starstar",40) - sil! let @* = keepregstar - sil! let @+ = keepregstar - sil! let @/ = keepregslash -" call Dret("netrw#Explore") - return - endif - let indx= w:netrw_explore_indx - if indx < 0 | let indx= 0 | endif - if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif - let curfile= w:netrw_explore_list[indx] -" call Decho("indx=".indx." curfile<".curfile.">") - while indx < w:netrw_explore_listlen && curfile == w:netrw_explore_list[indx] - let indx= indx + 1 -" call Decho("indx=".indx." (Nexplore while loop)") - endwhile - if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif -" call Decho("Nexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx) - - elseif indx == -2 - " Pexplore -" call Decho("case Pexplore with starpat=".starpat.": (indx=".indx.")") - if !exists("w:netrw_explore_list") " sanity check - call netrw#ErrorMsg(s:WARNING,"using Pexplore or improperly; see help for netrw-starstar",41) - sil! let @* = keepregstar - sil! let @+ = keepregstar - sil! let @/ = keepregslash -" call Dret("netrw#Explore") - return - endif - let indx= w:netrw_explore_indx - if indx < 0 | let indx= 0 | endif - if indx >= w:netrw_explore_listlen | let indx= w:netrw_explore_listlen - 1 | endif - let curfile= w:netrw_explore_list[indx] -" call Decho("indx=".indx." curfile<".curfile.">") - while indx >= 0 && curfile == w:netrw_explore_list[indx] - let indx= indx - 1 -" call Decho("indx=".indx." (Pexplore while loop)") - endwhile - if indx < 0 | let indx= 0 | endif -" call Decho("Pexplore: indx= [w:netrw_explore_indx=".w:netrw_explore_indx."]=".indx) - + " search treedict for treedir with any trailing / elided + if !haskey && treedir =~ '/$' + let treedir= substitute(treedir,'/$','','') + if has_key(w:netrw_treedict,treedir) +" call Decho('(NetrwBrowseChgDir:tree-list) ....searched.for treedir<'.treedir.'> found it!') + let haskey = 1 else - " Explore -- initialize - " build list of files to Explore with Nexplore/Pexplore -" call Decho("starpat=".starpat.": case Explore: initialize (indx=".indx.")") - call s:NetrwClearExplore() - let w:netrw_explore_indx= 0 - if !exists("b:netrw_curdir") - let b:netrw_curdir= getcwd() - endif -" call Decho("starpat=".starpat.": b:netrw_curdir<".b:netrw_curdir.">") - - " switch on starpat to build the w:netrw_explore_list of files - if starpat == 1 - " starpat=1: Explore *//pattern (current directory only search for files containing pattern) -" call Decho("starpat=".starpat.": build *//pattern list") -" call Decho("pattern<".pattern.">") - try - exe "keepj noautocmd vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*" - catch /^Vim\%((\a\+)\)\=:E480/ - call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76) -" call Dret("netrw#Explore : unable to find pattern<".pattern.">") - return - endtry - let w:netrw_explore_list = s:NetrwExploreListUniq(map(getqflist(),'bufname(v:val.bufnr)')) - if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif - - elseif starpat == 2 - " starpat=2: Explore **//pattern (recursive descent search for files containing pattern) -" call Decho("starpat=".starpat.": build **//pattern list") - try - exe "sil keepj noautocmd vimgrep /".pattern."/gj "."**/*" - catch /^Vim\%((\a\+)\)\=:E480/ - call netrw#ErrorMsg(s:WARNING,'no files matched pattern<'.pattern.'>',45) - if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif - silent! let @* = keepregstar - silent! let @+ = keepregstar - silent! let @/ = keepregslash -" call Dret("netrw#Explore : no files matched pattern") - return - endtry - let s:netrw_curdir = b:netrw_curdir - let w:netrw_explore_list = getqflist() - let w:netrw_explore_list = s:NetrwExploreListUniq(map(w:netrw_explore_list,'s:netrw_curdir."/".bufname(v:val.bufnr)')) - - elseif starpat == 3 - " starpat=3: Explore */filepat (search in current directory for filenames matching filepat) -" call Decho("starpat=".starpat.": build */filepat list") - let filepat= substitute(dirname,'^\*/','','') - let filepat= substitute(filepat,'^[%#<]','\\&','') -" call Decho("b:netrw_curdir<".b:netrw_curdir.">") -" call Decho("filepat<".filepat.">") - let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".filepat),'\n')) - if &hls | let keepregslash= s:ExplorePatHls(filepat) | endif +" call Decho('(NetrwBrowseChgDir:tree-list) ....searched for treedir<'.treedir.'> : not found') + endif + endif - elseif starpat == 4 - " starpat=4: Explore **/filepat (recursive descent search for filenames matching filepat) -" call Decho("starpat=".starpat.": build **/filepat list") - let w:netrw_explore_list= s:NetrwExploreListUniq(split(expand(b:netrw_curdir."/".dirname),'\n')) - if &hls | let keepregslash= s:ExplorePatHls(dirname) | endif - endif " switch on starpat to build w:netrw_explore_list + if haskey + " close tree listing for selected subdirectory +" call Decho("(NetrwBrowseChgDir:tree-list) closing selected subdirectory<".dirname.">") + call remove(w:netrw_treedict,treedir) +" call Decho("(NetrwBrowseChgDir) removed entry<".treedir."> from treedict") +" call Decho("(NetrwBrowseChgDir) yielding treedict<".string(w:netrw_treedict).">") + let dirname= w:netrw_treetop + else + " go down one directory + let dirname= substitute(treedir,'/*$','/','') +" call Decho("(NetrwBrowseChgDir:tree-list) go down one dir: treedir<".treedir.">") + endif + keepj call s:SetRexDir(a:islocal,dirname) + let s:treeforceredraw = 1 - let w:netrw_explore_listlen = len(w:netrw_explore_list) -" call Decho("w:netrw_explore_list<".string(w:netrw_explore_list).">") -" call Decho("w:netrw_explore_listlen=".w:netrw_explore_listlen) + else + " ---------------------------------------- + " NetrwBrowseChgDir: Go down one directory {{{3 + " ---------------------------------------- + let dirname = s:ComposePath(dirname,newdir) +" call Decho("(NetrwBrowseChgDir:go-down) go down one dir: dirname<".dirname."> newdir<".newdir.">") + keepj call s:SetRexDir(a:islocal,dirname) + endif - if w:netrw_explore_listlen == 0 || (w:netrw_explore_listlen == 1 && w:netrw_explore_list[0] =~ '\*\*\/') - call netrw#ErrorMsg(s:WARNING,"no files matched",42) - sil! let @* = keepregstar - sil! let @+ = keepregstar - sil! let @/ = keepregslash -" call Dret("netrw#Explore : no files matched") - return - endif - endif " if indx ... endif + " -------------------------------------- + " NetrwBrowseChgDir: Restore and Cleanup {{{3 + " -------------------------------------- + keepj call s:NetrwOptionRestore("s:") + if dolockout +" call Decho("(NetrwBrowseChgDir:restore) filewritable(dirname<".dirname.">)=".filewritable(dirname)) + if filewritable(dirname) +" call Decho("(NetrwBrowseChgDir:restore) doing modification lockout settings: ma nomod noro") +" call Decho("(NetrwBrowseChgDir:restore) setl ma nomod noro") + setl ma nomod noro +" call Decho("(NetrwBrowseChgDir:restore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") + else +" call Decho("(NetrwBrowseChgDir:restore) doing modification lockout settings: ma nomod ro") +" call Decho("(NetrwBrowseChgDir:restore) setl ma nomod noro") + setl ma nomod ro +" call Decho("(NetrwBrowseChgDir:restore) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") + endif + endif + let @@= ykeep - " NetrwStatusLine support - for exploring support - let w:netrw_explore_indx= indx -" call Decho("w:netrw_explore_list<".join(w:netrw_explore_list,',')."> len=".w:netrw_explore_listlen) +" call Dret("s:NetrwBrowseChgDir <".dirname."> : curpos<".string(getpos(".")).">") + return dirname +endfun - " wrap the indx around, but issue a note - if indx >= w:netrw_explore_listlen || indx < 0 -" call Decho("wrap indx (indx=".indx." listlen=".w:netrw_explore_listlen.")") - let indx = (indx < 0)? ( w:netrw_explore_listlen - 1 ) : 0 - let w:netrw_explore_indx= indx - call netrw#ErrorMsg(s:NOTE,"no more files match Explore pattern",43) - endif +" --------------------------------------------------------------------- +" s:NetrwBrowseX: (implements "x") executes a special "viewer" script or program for the {{{2 +" given filename; typically this means given their extension. +" 0=local, 1=remote +fun! netrw#NetrwBrowseX(fname,remote) +" call Dfunc("NetrwBrowseX(fname<".a:fname."> remote=".a:remote.")") - exe "let dirfile= w:netrw_explore_list[".indx."]" -" call Decho("dirfile=w:netrw_explore_list[indx=".indx."]= <".dirfile.">") - let newdir= substitute(dirfile,'/[^/]*$','','e') -" call Decho("newdir<".newdir.">") + let ykeep = @@ + let screenposn = netrw#NetrwSavePosn() -" call Decho("calling LocalBrowseCheck(newdir<".newdir.">)") - call netrw#LocalBrowseCheck(newdir) - if !exists("w:netrw_liststyle") - let w:netrw_liststyle= g:netrw_liststyle - endif - if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:LONGLIST - keepj call search('^'.substitute(dirfile,"^.*/","","").'\>',"W") - else - keepj call search('\<'.substitute(dirfile,"^.*/","","").'\>',"w") + " special core dump handler + if a:fname =~ '/core\(\.\d\+\)\=$' + if exists("g:Netrw_corehandler") + if type(g:Netrw_corehandler) == 2 + " g:Netrw_corehandler is a function reference (see :help Funcref) +" call Decho("g:Netrw_corehandler is a funcref") + call g:Netrw_corehandler(a:fname) + elseif type(g:Netrw_corehandler) == 3 + " g:Netrw_corehandler is a List of function references (see :help Funcref) +" call Decho("g:Netrw_corehandler is a List") + for Fncref in g:Netrw_corehandler + if type(FncRef) == 2 + call FncRef(a:fname) + endif + endfor endif - let w:netrw_explore_mtchcnt = indx + 1 - let w:netrw_explore_bufnr = bufnr("%") - let w:netrw_explore_line = line(".") - call s:SetupNetrwStatusLine('%f %h%m%r%=%9*%{NetrwStatusLine()}') -" call Decho("explore: mtchcnt=".w:netrw_explore_mtchcnt." bufnr=".w:netrw_explore_bufnr." line#".w:netrw_explore_line) + call netrw#NetrwRestorePosn(screenposn) + let @@= ykeep +" call Dret("NetrwBrowseX : coredump handler invoked") + return + endif + endif - else -" call Decho("your vim does not have +path_extra") - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:WARNING,"your vim needs the +path_extra feature for Exploring with **!",44) + " set up the filename + " (lower case the extension, make a local copy of a remote file) + let exten= substitute(a:fname,'.*\.\(.\{-}\)','\1','e') + if has("win32") || has("win95") || has("win64") || has("win16") + let exten= substitute(exten,'^.*$','\L&\E','') + endif +" call Decho("exten<".exten.">") + + " seems kde systems often have gnome-open due to dependencies, even though + " gnome-open's subsidiary display tools are largely absent. Kde systems + " usually have "kdeinit" running, though... (tnx Mikolaj Machowski) + if !exists("s:haskdeinit") + if has("unix") && executable("ps") && !has("win32unix") + let s:haskdeinit= system("ps -e") =~ 'kdeinit' + if v:shell_error + let s:haskdeinit = 0 endif - sil! let @* = keepregstar - sil! let @+ = keepregstar - sil! let @/ = keepregslash -" call Dret("netrw#Explore : missing +path_extra") - return + else + let s:haskdeinit= 0 endif +" call Decho("setting s:haskdeinit=".s:haskdeinit) + endif + if a:remote == 1 + " create a local copy +" call Decho("(remote) a:remote=".a:remote.": create a local copy of <".a:fname.">") + setl bh=delete + call netrw#NetRead(3,a:fname) + " attempt to rename tempfile + let basename= substitute(a:fname,'^\(.*\)/\(.*\)\.\([^.]*\)$','\2','') + let newname = substitute(s:netrw_tmpfile,'^\(.*\)/\(.*\)\.\([^.]*\)$','\1/'.basename.'.\3','') +" call Decho("basename<".basename.">") +" call Decho("newname <".newname.">") + if rename(s:netrw_tmpfile,newname) == 0 + " renaming succeeded + let fname= newname + else + " renaming failed + let fname= s:netrw_tmpfile + endif else -" call Decho("default case: Explore newdir<".dirname.">") - if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && dirname =~ '/' - sil! unlet w:netrw_treedict - sil! unlet w:netrw_treetop +" call Decho("(local) a:remote=".a:remote.": handling local copy of <".a:fname.">") + let fname= a:fname + " special ~ handler for local + if fname =~ '^\~' && expand("$HOME") != "" +" call Decho('invoking special ~ handler') + let fname= substitute(fname,'^\~',expand("$HOME"),'') endif - let newdir= dirname - if !exists("b:netrw_curdir") - call netrw#LocalBrowseCheck(getcwd()) + endif +" call Decho("fname<".fname.">") +" call Decho("exten<".exten."> "."netrwFileHandlers#NFH_".exten."():exists=".exists("*netrwFileHandlers#NFH_".exten)) + + " set up redirection + if &srr =~ "%s" + if (has("win32") || has("win95") || has("win64") || has("win16")) + let redir= substitute(&srr,"%s","nul","") else - call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,newdir)) + let redir= substitute(&srr,"%s","/dev/null","") endif + elseif (has("win32") || has("win95") || has("win64") || has("win16")) + let redir= &srr . "nul" + else + let redir= &srr . "/dev/null" endif +" call Decho("set up redirection: redir{".redir."} srr{".&srr."}") - " visual display of **/ **// */ Exploration files -" call Decho("w:netrw_explore_indx=".(exists("w:netrw_explore_indx")? w:netrw_explore_indx : "doesn't exist")) -" call Decho("b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : "n/a").">") - if exists("w:netrw_explore_indx") && exists("b:netrw_curdir") -" call Decho("s:explore_prvdir<".(exists("s:explore_prvdir")? s:explore_prvdir : "-doesn't exist-")) - if !exists("s:explore_prvdir") || s:explore_prvdir != b:netrw_curdir - " only update match list if current directory isn't the same as before -" call Decho("only update match list if current directory not the same as before") - let s:explore_prvdir = b:netrw_curdir - let s:explore_match = "" - let dirlen = s:Strlen(b:netrw_curdir) - if b:netrw_curdir !~ '/$' - let dirlen= dirlen + 1 - endif - let prvfname= "" - for fname in w:netrw_explore_list -" call Decho("fname<".fname.">") - if fname =~ '^'.b:netrw_curdir - if s:explore_match == "" - let s:explore_match= '\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>' - else - let s:explore_match= s:explore_match.'\|\<'.escape(strpart(fname,dirlen),g:netrw_markfileesc).'\>' - endif - elseif fname !~ '^/' && fname != prvfname - if s:explore_match == "" - let s:explore_match= '\<'.escape(fname,g:netrw_markfileesc).'\>' - else - let s:explore_match= s:explore_match.'\|\<'.escape(fname,g:netrw_markfileesc).'\>' - endif - endif - let prvfname= fname - endfor -" call Decho("explore_match<".s:explore_match.">") - exe "2match netrwMarkFile /".s:explore_match."/" + " extract any viewing options. Assumes that they're set apart by quotes. +" call Decho("extract any viewing options") + if exists("g:netrw_browsex_viewer") +" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">") + if g:netrw_browsex_viewer =~ '\s' + let viewer = substitute(g:netrw_browsex_viewer,'\s.*$','','') + let viewopt = substitute(g:netrw_browsex_viewer,'^\S\+\s*','','')." " + let oviewer = '' + let cnt = 1 + while !executable(viewer) && viewer != oviewer + let viewer = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\1','') + let viewopt = substitute(g:netrw_browsex_viewer,'^\(\(^\S\+\s\+\)\{'.cnt.'}\S\+\)\(.*\)$','\3','')." " + let cnt = cnt + 1 + let oviewer = viewer +" call Decho("!exe: viewer<".viewer."> viewopt<".viewopt.">") + endwhile + else + let viewer = g:netrw_browsex_viewer + let viewopt = "" endif - echo "==Pexplore ==Nexplore" +" call Decho("viewer<".viewer."> viewopt<".viewopt.">") + endif + + " execute the file handler +" call Decho("execute the file handler (if any)") + if exists("g:netrw_browsex_viewer") && g:netrw_browsex_viewer == '-' +" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">") + let ret= netrwFileHandlers#Invoke(exten,fname) + + elseif exists("g:netrw_browsex_viewer") && executable(viewer) +" call Decho("g:netrw_browsex_viewer<".g:netrw_browsex_viewer.">") +" call Decho("exe sil !".viewer." ".viewopt.shellescape(fname,1).redir) + exe "sil !".viewer." ".viewopt.shellescape(fname,1).redir + let ret= v:shell_error + + elseif has("win32") || has("win64") +" call Decho("windows") + if executable("start") +" call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)) + exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1) + elseif executable("rundll32") +" call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1)) + exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(fname,1) + else + call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74) + endif + call inputsave()|call input("Press to continue")|call inputrestore() + let ret= v:shell_error + + elseif has("win32unix") + let winfname= 'c:\cygwin'.substitute(fname,'/','\\','g') +" call Decho("cygwin: winfname<".shellescape(winfname,1).">") + if executable("start") +" call Decho('exe sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1)) + exe 'sil !start rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1) + elseif executable("rundll32") +" call Decho('exe sil !rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1)) + exe 'sil !rundll32 url.dll,FileProtocolHandler '.shellescape(winfname,1) + else + call netrw#ErrorMsg(s:WARNING,"rundll32 not on path",74) + endif + call inputsave()|call input("Press to continue")|call inputrestore() + let ret= v:shell_error + + elseif has("unix") && executable("xdg-open") && !s:haskdeinit +" call Decho("unix and xdg-open") +" call Decho("exe sil !xdg-open ".shellescape(fname,1)." ".redir) + exe "sil !xdg-open ".shellescape(fname,1).redir + let ret= v:shell_error + + elseif has("unix") && executable("kfmclient") && s:haskdeinit +" call Decho("unix and kfmclient") +" call Decho("exe sil !kfmclient exec ".shellescape(fname,1)." ".redir) + exe "sil !kfmclient exec ".shellescape(fname,1)." ".redir + let ret= v:shell_error + + elseif has("macunix") && executable("open") +" call Decho("macunix and open") +" call Decho("exe sil !open ".shellescape(fname,1)." ".redir) + exe "sil !open ".shellescape(fname,1)." ".redir + let ret= v:shell_error + else - 2match none - if exists("s:explore_match") | unlet s:explore_match | endif - if exists("s:explore_prvdir") | unlet s:explore_prvdir | endif - echo " " -" call Decho("cleared explore match list") + " netrwFileHandlers#Invoke() always returns 0 + let ret= netrwFileHandlers#Invoke(exten,fname) endif - sil! let @* = keepregstar - sil! let @+ = keepregstar - sil! let @/ = keepregslash -" call Dret("netrw#Explore : @/<".@/.">") + " if unsuccessful, attempt netrwFileHandlers#Invoke() + if ret + let ret= netrwFileHandlers#Invoke(exten,fname) + endif + + " restoring redraw! after external file handlers + redraw! + + " cleanup: remove temporary file, + " delete current buffer if success with handler, + " return to prior buffer (directory listing) + " Feb 12, 2008: had to de-activiate removal of + " temporary file because it wasn't getting seen. +" if a:remote == 1 && fname != a:fname +"" call Decho("deleting temporary file<".fname.">") +" call s:NetrwDelete(fname) +" endif + + if a:remote == 1 + setl bh=delete bt=nofile + if g:netrw_use_noswf + setl noswf + endif + exe "sil! keepj norm! \" +" redraw! + endif + call netrw#NetrwRestorePosn(screenposn) + let @@= ykeep + +" call Dret("NetrwBrowseX") +endfun + +" --------------------------------------------------------------------- +" s:NetrwChgPerm: (implements "gp") change file permission {{{2 +fun! s:NetrwChgPerm(islocal,curdir) +" call Dfunc("s:NetrwChgPerm(islocal=".a:islocal." curdir<".a:curdir.">)") + let ykeep = @@ + call inputsave() + let newperm= input("Enter new permission: ") + call inputrestore() + let chgperm= substitute(g:netrw_chgperm,'\',shellescape(expand("")),'') + let chgperm= substitute(chgperm,'\',shellescape(newperm),'') +" call Decho("chgperm<".chgperm.">") + call system(chgperm) + if v:shell_error != 0 + keepj call netrw#ErrorMsg(1,"changing permission on file<".expand("")."> seems to have failed",75) + endif + if a:islocal + keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + endif + let @@= ykeep +" call Dret("s:NetrwChgPerm") +endfun + +" --------------------------------------------------------------------- +" s:NetrwClearExplore: clear explore variables (if any) {{{2 +fun! s:NetrwClearExplore() +" call Dfunc("s:NetrwClearExplore()") + 2match none + if exists("s:explore_match") |unlet s:explore_match |endif + if exists("s:explore_indx") |unlet s:explore_indx |endif + if exists("s:netrw_explore_prvdir") |unlet s:netrw_explore_prvdir |endif + if exists("s:dirstarstar") |unlet s:dirstarstar |endif + if exists("s:explore_prvdir") |unlet s:explore_prvdir |endif + if exists("w:netrw_explore_indx") |unlet w:netrw_explore_indx |endif + if exists("w:netrw_explore_listlen")|unlet w:netrw_explore_listlen|endif + if exists("w:netrw_explore_list") |unlet w:netrw_explore_list |endif + if exists("w:netrw_explore_bufnr") |unlet w:netrw_explore_bufnr |endif +" redraw! + echo " " + echo " " +" call Dret("s:NetrwClearExplore") endfun " --------------------------------------------------------------------- " s:NetrwExploreListUniq: {{{2 fun! s:NetrwExploreListUniq(explist) -" call Dfunc("s:NetrwExploreListUniq(explist)") +" call Dfunc("s:NetrwExploreListUniq(explist<".string(a:explist).">)") " this assumes that the list is already sorted let newexplist= [] @@ -3939,11 +4845,53 @@ endif endfor -" call Dret("s:NetrwExploreListUniq") +" call Dret("s:NetrwExploreListUniq newexplist<".string(newexplist).">") return newexplist endfun " --------------------------------------------------------------------- +" s:NetrwForceChgDir: (gd support) Force treatment as a directory {{{2 +fun! s:NetrwForceChgDir(islocal,newdir) +" call Dfunc("s:NetrwForceChgDir(islocal=".a:islocal." newdir<".a:newdir.">)") + let ykeep= @@ + if a:newdir !~ '/$' + " ok, looks like force is needed to get directory-style treatment + if a:newdir =~ '@$' + let newdir= substitute(a:newdir,'@$','/','') + elseif a:newdir =~ '[*=|\\]$' + let newdir= substitute(a:newdir,'.$','/','') + else + let newdir= a:newdir.'/' + endif +" call Decho("adjusting newdir<".newdir."> due to gd") + else + " should already be getting treatment as a directory + let newdir= a:newdir + endif + let newdir= s:NetrwBrowseChgDir(a:islocal,newdir) + call s:NetrwBrowse(a:islocal,newdir) + let @@= ykeep +" call Dret("s:NetrwForceChgDir") +endfun + +" --------------------------------------------------------------------- +" s:NetrwForceFile: (gf support) Force treatment as a file {{{2 +fun! s:NetrwForceFile(islocal,newfile) +" call Dfunc("s:NetrwForceFile(islocal=".a:islocal." newdir<".a:newfile.">)") + if a:newfile =~ '[/@*=|\\]$' + let newfile= substitute(a:newfile,'.$','','') + else + let newfile= a:newfile + endif + if a:islocal + call s:NetrwBrowseChgDir(a:islocal,newfile) + else + call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,newfile)) + endif +" call Dret("s:NetrwForceFile") +endfun + +" --------------------------------------------------------------------- " s:NetrwHide: this function is invoked by the "a" map for browsing {{{2 " and switches the hiding mode. The actual hiding is done by " s:NetrwListHide(). @@ -3952,6 +4900,7 @@ " 2: show hidden files only fun! s:NetrwHide(islocal) " call Dfunc("NetrwHide(islocal=".a:islocal.") g:netrw_hide=".g:netrw_hide) + let ykeep= @@ let svpos= netrw#NetrwSavePosn() if exists("s:netrwmarkfilelist_{bufnr('%')}") @@ -3960,7 +4909,7 @@ " hide the files in the markfile list for fname in s:netrwmarkfilelist_{bufnr("%")} -" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." isk=".&isk) +" call Decho("match(g:netrw_list_hide<".g:netrw_list_hide.'> fname<\<'.fname.'\>>)='.match(g:netrw_list_hide,'\<'.fname.'\>')." l:isk=".&l:isk) if match(g:netrw_list_hide,'\<'.fname.'\>') != -1 " remove fname from hiding list let g:netrw_list_hide= substitute(g:netrw_list_hide,'..\<'.escape(fname,g:netrw_fname_escape).'\>..','','') @@ -3977,7 +4926,7 @@ " call Decho("hide: g:netrw_list_hide<".g:netrw_list_hide.">") endif endfor - call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir) + keepj call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir) let g:netrw_hide= 1 else @@ -3986,14 +4935,16 @@ let g:netrw_hide=(g:netrw_hide+1)%3 exe "keepj norm! 0" if g:netrw_hide && g:netrw_list_hide == "" - call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49) + keepj call netrw#ErrorMsg(s:WARNING,"your hiding list is empty!",49) + let @@= ykeep " call Dret("NetrwHide") return endif endif - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) + keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + keepj call netrw#NetrwRestorePosn(svpos) + let @@= ykeep " call Dret("NetrwHide") endfun @@ -4001,6 +4952,7 @@ " s:NetrwHidden: invoked by "gh" {{{2 fun! s:NetrwHidden(islocal) " call Dfunc("s:NetrwHidden()") + let ykeep= @@ " save current position let svpos= netrw#NetrwSavePosn() @@ -4014,8 +4966,9 @@ endif " refresh screen and return to saved position - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) + keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + keepj call netrw#NetrwRestorePosn(svpos) + let @@= ykeep " call Dret("s:NetrwHidden") endfun @@ -4043,7 +4996,7 @@ endif endif " insure that the home directory exists - if !isdirectory(home) + if g:netrw_dirhistmax > 0 && !isdirectory(home) if exists("g:netrw_mkdir") call system(g:netrw_mkdir." ".shellescape(home)) else @@ -4057,11 +5010,18 @@ " --------------------------------------------------------------------- " s:NetrwLeftmouse: handles the when in a netrw browsing window {{{2 fun! s:NetrwLeftmouse(islocal) + if exists("s:netrwdrag") + return + endif " call Dfunc("s:NetrwLeftmouse(islocal=".a:islocal.")") + let ykeep= @@ " check if the status bar was clicked on instead of a file/directory name + while getchar(0) != 0 + "clear the input stream + endwhile call feedkeys("\") - let c= getchar() + let c = getchar() let mouse_lnum = v:mouse_lnum let wlastline = line('w$') let lastline = line('$') @@ -4069,31 +5029,76 @@ " call Decho("v:mouse_col =".v:mouse_col." col=".col(".")." wincol =".wincol()." winwidth =".winwidth(0)) if mouse_lnum >= wlastline + 1 || v:mouse_win != winnr() " appears to be a status bar leftmouse click + let @@= ykeep " call Dret("s:NetrwLeftmouse : detected a status bar leftmouse click") return endif if v:mouse_col != col('.') + let @@= ykeep " call Dret("s:NetrwLeftmouse : detected a vertical separator bar leftmouse click") return endif if a:islocal if exists("b:netrw_curdir") - call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) + keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) endif else if exists("b:netrw_curdir") - call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) + keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) endif endif + let @@= ykeep " call Dret("s:NetrwLeftmouse") endfun " --------------------------------------------------------------------- +" s:NetrwRightdrag: {{{2 +"DechoTabOn +fun! s:NetrwRightdrag(islocal) +" call Dfunc("s:NetrwRightdrag(islocal=".a:islocal.")") + if !exists("s:netrwdrag") + let s:netrwdrag = winnr() + call s:NetrwMarkFile(a:islocal,s:NetrwGetWord()) + if a:islocal + nno :call NetrwRightrelease(1) + else + nno :call NetrwRightrelease(0) + endif + endif +" call Dret("s:NetrwRightdrag : s:netrwdrag=".s:netrwdrag." buf#".bufnr("%")) +endfun + +" --------------------------------------------------------------------- +" s:NetrwRightrelease: {{{2 +fun! s:NetrwRightrelease(islocal) +" call Dfunc("s:NetrwRightrelease(islocal=".a:islocal.") s:netrwdrag=".s:netrwdrag." buf#".bufnr("%")) + if exists("s:netrwdrag") + nunmap + let tgt = s:NetrwGetWord() +" call Decho("target#1: ".tgt) + if tgt =~ '/$' && tgt !~ '^\./$' + let tgt = b:netrw_curdir."/".tgt + else + let tgt= b:netrw_curdir + endif +" call Decho("target#2: ".tgt) + call netrw#NetrwMakeTgt(tgt) + let curwin= winnr() + exe s:netrwdrag."wincmd w" + call s:NetrwMarkFileMove(a:islocal) + exe curwin."wincmd w" + unlet s:netrwdrag + endif +" call Dret("s:NetrwRightrelease") +endfun + +" --------------------------------------------------------------------- " s:NetrwListHide: uses [range]g~...~d to delete files that match comma {{{2 " separated patterns given in g:netrw_list_hide fun! s:NetrwListHide() -" call Dfunc("NetrwListHide() hide=".g:netrw_hide." listhide<".g:netrw_list_hide.">") +" call Dfunc("NetrwListHide() g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">") + let ykeep= @@ " find a character not in the "hide" string to use as a separator for :g and :v commands " How-it-works: take the hiding command, convert it into a range. Duplicate @@ -4115,17 +5120,22 @@ " Prune the list by hiding any files which match if g:netrw_hide == 1 " call Decho("hiding<".hide."> listhide<".listhide.">") - exe 'sil keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d' + exe 'sil! keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'d' elseif g:netrw_hide == 2 " call Decho("showing<".hide."> listhide<".listhide.">") - exe 'sil keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @' + exe 'sil! keepj '.w:netrw_bannercnt.',$g'.sep.hide.sep.'s@^@ /-KEEP-/ @' endif endwhile if g:netrw_hide == 2 - exe 'sil keepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d' - exe 'sil keepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e' + exe 'sil! keepj '.w:netrw_bannercnt.',$v@^ /-KEEP-/ @d' + exe 'sil! keepj '.w:netrw_bannercnt.',$s@^\%( /-KEEP-/ \)\+@@e' endif + " remove any blank lines that have somehow remained. + " This seems to happen under Windows. + exe 'sil! keepj 1,$g@^\s*$@d' + + let @@= ykeep " call Dret("NetrwListHide") endfun @@ -4134,6 +5144,7 @@ fun! s:NetrwHideEdit(islocal) " call Dfunc("NetrwHideEdit(islocal=".a:islocal.")") + let ykeep= @@ " save current cursor position let svpos= netrw#NetrwSavePosn() @@ -4145,10 +5156,11 @@ " call Decho("new g:netrw_list_hide<".g:netrw_list_hide.">") " refresh the listing - silent keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./")) + sil keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,"./")) " restore cursor position call netrw#NetrwRestorePosn(svpos) + let @@= ykeep " call Dret("NetrwHideEdit") endfun @@ -4158,6 +5170,7 @@ fun! s:NetSortSequence(islocal) " call Dfunc("NetSortSequence(islocal=".a:islocal.")") + let ykeep= @@ let svpos= netrw#NetrwSavePosn() call inputsave() let newsortseq= input("Edit Sorting Sequence: ",g:netrw_sort_sequence) @@ -4165,8 +5178,9 @@ " refresh the listing let g:netrw_sort_sequence= newsortseq - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) + keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + keepj call netrw#NetrwRestorePosn(svpos) + let @@= ykeep " call Dret("NetSortSequence") endfun @@ -4176,6 +5190,7 @@ fun! s:NetrwMakeDir(usrhost) " call Dfunc("NetrwMakeDir(usrhost<".a:usrhost.">)") + let ykeep= @@ " get name of new directory from user. A bare will skip. " if its currently a directory, also request will be skipped, but with " a message. @@ -4185,6 +5200,7 @@ " call Decho("newdirname<".newdirname.">") if newdirname == "" + let @@= ykeep " call Dret("NetrwMakeDir : user aborted with bare ") return endif @@ -4198,15 +5214,17 @@ " call Decho("fullnewdir<".fullnewdir.">") if isdirectory(fullnewdir) if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24) + keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a directory!",24) endif + let @@= ykeep " call Dret("NetrwMakeDir : directory<".newdirname."> exists previously") return endif if s:FileReadable(fullnewdir) if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25) + keepj call netrw#ErrorMsg(s:WARNING,"<".newdirname."> is already a file!",25) endif + let @@= ykeep " call Dret("NetrwMakeDir : file<".newdirname."> exists previously") return endif @@ -4219,8 +5237,14 @@ let netrw_origdir= s:NetrwGetcwd(1) exe 'keepj lcd '.fnameescape(b:netrw_curdir) " call Decho("netrw_origdir<".netrw_origdir.">: lcd b:netrw_curdir<".fnameescape(b:netrw_curdir).">") -" call Decho("exe silent! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1)) - exe "sil! !".g:netrw_local_mkdir.' '.shellescape(newdirname,1) +" call Decho("exe sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1)) + exe "sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1) + if v:shell_error != 0 + let @@= ykeep + call netrw#ErrorMsg(s:ERROR,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80) +" call Dret("NetrwMakeDir : failed: sil! !".g:netrw_localmkdir.' '.shellescape(newdirname,1)) + return + endif if !g:netrw_keepdir exe 'keepj lcd '.fnameescape(netrw_origdir) " call Decho("netrw_keepdir=".g:netrw_keepdir.": keepjumps lcd ".fnameescape(netrw_origdir)." getcwd<".getcwd().">") @@ -4243,26 +5267,31 @@ " call Decho("remote mkdir") let mkdircmd = s:MakeSshCmd(g:netrw_mkdir_cmd) let newdirname= substitute(b:netrw_curdir,'^\%(.\{-}/\)\{3}\(.*\)$','\1','').newdirname -" call Decho("exe silent! !".mkdircmd." ".shellescape(newdirname,1)) +" call Decho("exe sil! !".mkdircmd." ".shellescape(newdirname,1)) exe "sil! !".mkdircmd." ".shellescape(newdirname,1) if v:shell_error == 0 " refresh listing let svpos= netrw#NetrwSavePosn() - call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) - call netrw#NetrwRestorePosn(svpos) + keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) + keepj call netrw#NetrwRestorePosn(svpos) elseif !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27) + keepj call netrw#ErrorMsg(s:ERROR,"unable to make directory<".newdirname.">",27) endif " redraw! elseif b:netrw_method == 2 - " COMBAK -- future work - call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68) + let svpos= netrw#NetrwSavePosn() + call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"') + keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) + keepj call netrw#NetrwRestorePosn(svpos) elseif b:netrw_method == 3 - " COMBAK -- future work - call netrw#ErrorMsg(s:ERROR,"making directories via ftp not currently supported",68) + let svpos= netrw#NetrwSavePosn() + call s:NetrwRemoteFtpCmd("",g:netrw_remote_mkdir.' "'.newdirname.'"') + keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) + keepj call netrw#NetrwRestorePosn(svpos) endif + let @@= ykeep " call Dret("NetrwMakeDir") endfun @@ -4283,14 +5312,22 @@ " " Creates a buffer version of islocal " b:netrw_islocal -" fun! s:NetrwMarkFile(islocal,fname) " call Dfunc("s:NetrwMarkFile(islocal=".a:islocal." fname<".a:fname.">)") + + " sanity check + if empty(a:fname) +" call Dret("s:NetrwMarkFile : emtpy fname") + return + endif + + let ykeep = @@ let curbufnr= bufnr("%") let curdir = b:netrw_curdir - let trailer = '[@=|\/\*]\=\>' + let trailer = '[@=|\/\*]\=\ze\%( \|\t\|$\)' + if exists("s:netrwmarkfilelist_{curbufnr}") - " markfile list exists + " markfile list pre-exists " call Decho("starting s:netrwmarkfilelist_{curbufnr}<".string(s:netrwmarkfilelist_{curbufnr}).">") " call Decho("starting s:netrwmarkfilemtch_{curbufnr}<".s:netrwmarkfilemtch_{curbufnr}.">") let b:netrw_islocal= a:islocal @@ -4322,8 +5359,7 @@ endif let first= 0 endfor -" call Decho("ending s:netrwmarkfilelist_"curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">") -" call Decho("ending s:netrwmarkfilemtch_"curbufnr."<".s:netrwmarkfilemtch_{curbufnr}.">") +" call Decho("ending s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr}).">") endif endif @@ -4377,7 +5413,8 @@ " call Decho("2match none") 2match none endif -" call Dret("s:NetrwMarkFile : netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">") + let @@= ykeep +" call Dret("s:NetrwMarkFile : s:netrwmarkfilelist_".curbufnr."<".(exists("s:netrwmarkfilelist_{curbufnr}")? string(s:netrwmarkfilelist_{curbufnr}) : " doesn't exist").">") endfun " --------------------------------------------------------------------- @@ -4394,34 +5431,44 @@ let curdir = b:netrw_curdir let curbufnr = bufnr("%") + " sanity check + if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr}) + keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) +" call Dret("s:NetrwMarkFileCompress") + return + endif +" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr})) + if exists("s:netrwmarkfilelist_{curbufnr}") && exists("g:netrw_compress") && exists("g:netrw_decompress") + + " for every filename in the marked list for fname in s:netrwmarkfilelist_{curbufnr} - " for every filename in the marked list - for sfx in sort(keys(g:netrw_decompress)) - if fname =~ '\'.sfx.'$' - " fname has a suffix indicating that its compressed; apply associated decompression routine - let exe= netrw#WinPath(g:netrw_decompress[sfx]) -" call Decho("fname<".fname."> is compressed so decompress with <".exe.">") - if a:islocal - if g:netrw_keepdir - let fname= shellescape(s:ComposePath(curdir,fname)) - endif - else - let fname= shellescape(b:netrw_curdir.fname,1) + let sfx= substitute(fname,'^.\{-}\(\.\a\+\)$','\1','') +" call Decho("extracted sfx<".sfx.">") + if exists("g:netrw_decompress['".sfx."']") + " fname has a suffix indicating that its compressed; apply associated decompression routine + let exe= g:netrw_decompress[sfx] +" call Decho("fname<".fname."> is compressed so decompress with <".exe.">") + let exe= netrw#WinPath(exe) + if a:islocal + if g:netrw_keepdir + let fname= shellescape(s:ComposePath(curdir,fname)) endif - if executable(exe) - if a:islocal - call system(exe." ".fname) - else - call s:RemoteSystem(exe." ".fname) - endif + else + let fname= shellescape(b:netrw_curdir.fname,1) + endif + if executable(exe) + if a:islocal + call system(exe." ".fname) else - call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50) + keepj call s:RemoteSystem(exe." ".fname) endif - break + else + keepj call netrw#ErrorMsg(s:WARNING,"unable to apply<".exe."> to file<".fname.">",50) endif - unlet sfx - endfor + endif + unlet sfx + if exists("exe") unlet exe elseif a:islocal @@ -4429,12 +5476,13 @@ call system(netrw#WinPath(g:netrw_compress)." ".shellescape(s:ComposePath(b:netrw_curdir,fname))) else " fname not a compressed file, so compress it - call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".shellescape(fname)) + keepj call s:RemoteSystem(netrw#WinPath(g:netrw_compress)." ".shellescape(fname)) endif - endfor + endfor " for every file in the marked list + call s:NetrwUnmarkList(curbufnr,curdir) - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) + keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + keepj call netrw#NetrwRestorePosn(svpos) endif " call Dret("s:NetrwMarkFileCompress") endfun @@ -4446,42 +5494,112 @@ " directories. Uses the local-buffer marked file list. " Returns 1=success (used by NetrwMarkFileMove()) " 0=failure -fun! s:NetrwMarkFileCopy(islocal) -" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---').">") +fun! s:NetrwMarkFileCopy(islocal,...) +" call Dfunc("s:NetrwMarkFileCopy(islocal=".a:islocal.") target<".(exists("s:netrwmftgt")? s:netrwmftgt : '---')."> a:0=".a:0) - " sanity checks - if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')}) - call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) -" call Dret("s:NetrwMarkFileCopy 0") - return 0 + if !exists("b:netrw_curdir") + let b:netrw_curdir= getcwd() +" call Decho("set b:netrw_curdir<".b:netrw_curdir."> (used getcwd)") + endif + let curdir = b:netrw_curdir + let curbufnr = bufnr("%") + + " sanity check + if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr}) + keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) +" call Dret("s:NetrwMarkFileCopy") + return endif -" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')})) +" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr})) + if !exists("s:netrwmftgt") - call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67) + keepj call netrw#ErrorMsg(s:ERROR,"your marked file target is empty! (:help netrw-mt)",67) " call Dret("s:NetrwMarkFileCopy 0") return 0 endif " call Decho("sanity chk passed: s:netrwmftgt<".s:netrwmftgt.">") - let curdir = b:netrw_curdir - let curbufnr = bufnr("%") if a:islocal && s:netrwmftgt_islocal " Copy marked files, local directory to local directory " call Decho("copy from local to local") - let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)")) -" call Decho("system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt).")") - call system(netrw#WinPath(g:netrw_localcopycmd)." ".args." ".shellescape(s:netrwmftgt)) + if !executable(g:netrw_localcopycmd) && g:netrw_localcopycmd !~ '\ not executable on your system, aborting",91) +" call Dfunc("s:NetrwMarkFileMove : g:netrw_localcopycmd<".g:netrw_localcopycmd."> n/a!") + return + endif + + " copy marked files while within the same directory (ie. allow renaming) + if simplify(s:netrwmftgt) == simplify(b:netrw_curdir) + if len(s:netrwmarkfilelist_{bufnr('%')}) == 1 + " only one marked file + let args = shellescape(b:netrw_curdir."/".s:netrwmarkfilelist_{bufnr('%')}[0]) + let oldname = s:netrwmarkfilelist_{bufnr('%')}[0] + elseif a:0 == 1 + " this happens when the next case was used to recursively call s:NetrwMarkFileCopy() + let args = shellescape(b:netrw_curdir."/".a:1) + let oldname = a:1 + else + " copy multiple marked files inside the same directory + let s:recursive= 1 + for oldname in s:netrwmarkfilelist_{bufnr("%")} + let ret= s:NetrwMarkFileCopy(a:islocal,oldname) + if ret == 0 + break + endif + endfor + unlet s:recursive + call s:NetrwUnmarkList(curbufnr,curdir) +" call Dret("s:NetrwMarkFileCopy ".ret) + return ret + endif + + call inputsave() + let newname= input("Copy ".oldname." to : ",oldname,"file") + call inputrestore() + if newname == "" +" call Dret("s:NetrwMarkFileCopy 0") + return 0 + endif + let args= shellescape(oldname) + let tgt = shellescape(s:netrwmftgt.'/'.newname) + else + let args= join(map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),"shellescape(b:netrw_curdir.\"/\".v:val)")) + let tgt = shellescape(s:netrwmftgt) + endif + if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16")) + let args= substitute(args,'/','\\','g') + let tgt = substitute(tgt, '/','\\','g') + endif + if g:netrw_localcopycmd =~ '\s' + let copycmd = substitute(g:netrw_localcopycmd,'\s.*$','','') + let copycmdargs = substitute(g:netrw_localcopycmd,'^.\{-}\(\s.*\)$','\1','') + let copycmd = netrw#WinPath(copycmd).copycmdargs + else + let copycmd = netrw#WinPath(g:netrw_localcopycmd) + endif +" call Decho("args <".args.">") +" call Decho("tgt <".tgt.">") +" call Decho("copycmd<".copycmd.">") +" call Decho("system(".copycmd." ".args." ".tgt.")") + call system(copycmd." ".args." ".tgt) + if v:shell_error != 0 + call netrw#ErrorMsg(s:ERROR,"tried using g:netrw_localcopycmd<".g:netrw_localcopycmd.">; it doesn't work!",80) +" call Dret("s:NetrwMarkFileCopy 0 : failed: system(".g:netrw_localcopycmd." ".args." ".shellescape(s:netrwmftgt)) + return 0 + endif elseif a:islocal && !s:netrwmftgt_islocal " Copy marked files, local directory to remote directory " call Decho("copy from local to remote") - call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt) + keepj call s:NetrwUpload(s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt) elseif !a:islocal && s:netrwmftgt_islocal + " Copy marked files, remote directory to local directory " call Decho("copy from remote to local") - call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt) + keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},s:netrwmftgt) elseif !a:islocal && !s:netrwmftgt_islocal + " Copy marked files, remote directory to remote directory " call Decho("copy from remote to remote") let curdir = getcwd() let tmpdir = s:GetTempfile("") @@ -4491,19 +5609,29 @@ if exists("*mkdir") call mkdir(tmpdir) else - exe "sil! !".g:netrw_local_mkdir.' '.shellescape(tmpdir,1) + exe "sil! !".g:netrw_localmkdir.' '.shellescape(tmpdir,1) + if v:shell_error != 0 + call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localmkdir<".g:netrw_localmkdir."> to something that works",80) +" call Dret("s:NetrwMarkFileCopy : failed: sil! !".g:netrw_localmkdir.' '.shellescape(tmpdir,1) ) + return + endif endif if isdirectory(tmpdir) exe "keepj lcd ".fnameescape(tmpdir) - call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir) + keepj call netrw#NetrwObtain(a:islocal,s:netrwmarkfilelist_{bufnr('%')},tmpdir) let localfiles= map(deepcopy(s:netrwmarkfilelist_{bufnr('%')}),'substitute(v:val,"^.*/","","")') - call s:NetrwUpload(localfiles,s:netrwmftgt) + keepj call s:NetrwUpload(localfiles,s:netrwmftgt) if getcwd() == tmpdir for fname in s:netrwmarkfilelist_{bufnr('%')} - call s:NetrwDelete(fname) + keepj call s:NetrwDelete(fname) endfor exe "keepj lcd ".fnameescape(curdir) - exe "sil !".g:netrw_local_rmdir." ".shellescape(tmpdir,1) + exe "sil !".g:netrw_localrmdir." ".shellescape(tmpdir,1) + if v:shell_error != 0 + call netrw#ErrorMsg(s:WARNING,"consider setting g:netrw_localrmdir<".g:netrw_localrmdir."> to something that works",80) +" call Dret("s:NetrwMarkFileCopy : failed: sil !".g:netrw_localrmdir." ".shellescape(tmpdir,1) ) + return + endif else exe "keepj lcd ".fnameescape(curdir) endif @@ -4513,20 +5641,21 @@ " ------- " cleanup " ------- -" call Decho("cleanup") - - " remove markings from local buffer - call s:NetrwUnmarkList(curbufnr,curdir) +" call Decho("cleanup") + if !exists("s:recursive") + " remove markings from local buffer + call s:NetrwUnmarkList(curbufnr,curdir) + endif " refresh buffers if !s:netrwmftgt_islocal call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt) endif if a:islocal - call s:NetrwRefreshDir(a:islocal,b:netrw_curdir) + keepj call s:NetrwRefreshDir(a:islocal,curdir) endif if g:netrw_fastbrowse <= 1 - call s:LocalBrowseShellCmdRefresh() + keepj call s:LocalBrowseShellCmdRefresh() endif " call Dret("s:NetrwMarkFileCopy 1") @@ -4542,7 +5671,15 @@ " call Dfunc("s:NetrwMarkFileDiff(islocal=".a:islocal.") b:netrw_curdir<".b:netrw_curdir.">") let curbufnr= bufnr("%") - if exists("s:netrwmarkfilelist_{curbufnr}") + " sanity check + if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr}) + keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) +" call Dret("s:NetrwMarkFileDiff") + return + endif +" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr})) + + if exists("s:netrwmarkfilelist_{."curbufnr}") let cnt = 0 let curdir = b:netrw_curdir for fname in s:netrwmarkfilelist @@ -4575,21 +5712,62 @@ let curdir = b:netrw_curdir let curbufnr = bufnr("%") + + " sanity check + if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr}) + keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) +" call Dret("s:NetrwMarkFileEdit") + return + endif +" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr})) + if exists("s:netrwmarkfilelist_{curbufnr}") call s:SetRexDir(a:islocal,curdir) let flist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)")) " unmark markedfile list " call s:NetrwUnmarkList(curbufnr,curdir) call s:NetrwUnmarkAll() -" call Decho("exe silent args ".flist) - exe "silent args ".flist +" call Decho("exe sil args ".flist) + exe "sil args ".flist endif + echo "(use :bn, :bp to navigate files; :Rex to return)" " call Dret("s:NetrwMarkFileEdit") endfun " --------------------------------------------------------------------- -" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary command on marked files, one at a time {{{2 +" s:NetrwMarkFileQFEL: convert a quickfix-error list into a marked file list {{{2 +fun! s:NetrwMarkFileQFEL(islocal,qfel) +" call Dfunc("s:NetrwMarkFileQFEL(islocal=".a:islocal.",qfel)") + call s:NetrwUnmarkAll() + let curbufnr= bufnr("%") + + if !empty(a:qfel) + for entry in a:qfel + let bufnmbr= entry["bufnr"] +" call Decho("bufname(".bufnmbr.")<".bufname(bufnmbr)."> line#".entry["lnum"]." text=".entry["text"]) + if !exists("s:netrwmarkfilelist_{curbufnr}") +" call Decho("case: no marked file list") + call s:NetrwMarkFile(a:islocal,bufname(bufnmbr)) + elseif index(s:netrwmarkfilelist_{curbufnr},bufname(bufnmbr)) == -1 + " s:NetrwMarkFile will remove duplicate entries from the marked file list. + " So, this test lets two or more hits on the same pattern to be ignored. +" call Decho("case: ".bufname(bufnmbr)." not currently in marked file list") + call s:NetrwMarkFile(a:islocal,bufname(bufnmbr)) + else +" call Decho("case: ".bufname(bufnmbr)." already in marked file list") + endif + endfor + echo "(use me to edit marked files)" + else + call netrw#ErrorMsg(s:WARNING,"can't convert quickfix error list; its empty!",92) + endif + +" call Dret("s:NetrwMarkFileQFEL") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileExe: (invoked by mx) execute arbitrary system command on marked files, one at a time {{{2 " Uses the local marked-file list. fun! s:NetrwMarkFileExe(islocal) " call Dfunc("s:NetrwMarkFileExe(islocal=".a:islocal.")") @@ -4597,40 +5775,166 @@ let curdir = b:netrw_curdir let curbufnr = bufnr("%") + " sanity check + if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr}) + keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) +" call Dret("s:NetrwMarkFileExe") + return + endif +" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr})) + if exists("s:netrwmarkfilelist_{curbufnr}") " get the command call inputsave() let cmd= input("Enter command: ","","file") call inputrestore() " call Decho("cmd<".cmd.">") + if cmd == "" +" " call Dret("s:NetrwMarkFileExe : early exit, empty command") + return + endif + + " apply command to marked files. Substitute: filename -> % + " If no %, then append a space and the filename to the command + for fname in s:netrwmarkfilelist_{curbufnr} + if a:islocal + if g:netrw_keepdir + let fname= shellescape(netrw#WinPath(s:ComposePath(curdir,fname))) + endif + else + let fname= shellescape(netrw#WinPath(b:netrw_curdir.fname)) + endif + if cmd =~ '%' + let xcmd= substitute(cmd,'%',fname,'g') + else + let xcmd= cmd.' '.fname + endif + if a:islocal +" call Decho("local: xcmd<".xcmd.">") + let ret= system(xcmd) + else +" call Decho("remote: xcmd<".xcmd.">") + let ret= s:RemoteSystem(xcmd) + endif + if v:shell_error < 0 + keepj call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54) + break + else + echo ret + endif + endfor + + " unmark marked file list + call s:NetrwUnmarkList(curbufnr,curdir) + + " refresh the listing + keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + keepj call netrw#NetrwRestorePosn(svpos) + else + keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59) + endif + +" call Dret("s:NetrwMarkFileExe") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkHideSfx: (invoked by mh) (un)hide files having same suffix +" as the marked file(s) (toggles suffix presence) +" Uses the local marked file list. +fun! s:NetrwMarkHideSfx(islocal) +" call Dfunc("s:NetrwMarkHideSfx(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curbufnr = bufnr("%") + + " s:netrwmarkfilelist_{curbufnr}: the List of marked files + if exists("s:netrwmarkfilelist_{curbufnr}") + + for fname in s:netrwmarkfilelist_{curbufnr} +" call Decho("s:NetrwMarkFileCopy: fname<".fname.">") + " construct suffix pattern + if fname =~ '\.' + let sfxpat= "^.*".substitute(fname,'^.*\(\.[^. ]\+\)$','\1','') + else + let sfxpat= '^\%(\%(\.\)\@!.\)*$' + endif + " determine if its in the hiding list or not + let inhidelist= 0 + if g:netrw_list_hide != "" + let itemnum = 0 + let hidelist= split(g:netrw_list_hide,',') + for hidepat in hidelist + if sfxpat == hidepat + let inhidelist= 1 + break + endif + let itemnum= itemnum + 1 + endfor + endif +" call Decho("fname<".fname."> inhidelist=".inhidelist." sfxpat<".sfxpat.">") + if inhidelist + " remove sfxpat from list + call remove(hidelist,itemnum) + let g:netrw_list_hide= join(hidelist,",") + elseif g:netrw_list_hide != "" + " append sfxpat to non-empty list + let g:netrw_list_hide= g:netrw_list_hide.",".sfxpat + else + " set hiding list to sfxpat + let g:netrw_list_hide= sfxpat + endif + endfor + + " refresh the listing + keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + keepj call netrw#NetrwRestorePosn(svpos) + else + keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59) + endif + +" call Dret("s:NetrwMarkHideSfx") +endfun + +" --------------------------------------------------------------------- +" s:NetrwMarkFileVimCmd: (invoked by mX) execute arbitrary vim command on marked files, one at a time {{{2 +" Uses the local marked-file list. +fun! s:NetrwMarkFileVimCmd(islocal) +" call Dfunc("s:NetrwMarkFileVimCmd(islocal=".a:islocal.")") + let svpos = netrw#NetrwSavePosn() + let curdir = b:netrw_curdir + let curbufnr = bufnr("%") + + " sanity check + if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr}) + keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) +" call Dret("s:NetrwMarkFileVimCmd") + return + endif +" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr})) + + if exists("s:netrwmarkfilelist_{curbufnr}") + " get the command + call inputsave() + let cmd= input("Enter vim command: ","","file") + call inputrestore() +" call Decho("cmd<".cmd.">") + if cmd == "" +" " call Dret("s:NetrwMarkFileVimCmd : early exit, empty command") + return + endif " apply command to marked files. Substitute: filename -> % " If no %, then append a space and the filename to the command for fname in s:netrwmarkfilelist_{curbufnr} +" call Decho("fname<".fname.">") if a:islocal - if g:netrw_keepdir - let fname= shellescape(netrw#WinPath(s:ComposePath(curdir,fname))) - endif - else - let fname= shellescape(netrw#WinPath(b:netrw_curdir.fname)) - endif - if cmd =~ '%' - let xcmd= substitute(cmd,'%',fname,'g') - else - let xcmd= cmd.' '.fname - endif - if a:islocal -" call Decho("local: xcmd<".xcmd.">") - let ret= system(xcmd) - else -" call Decho("remote: xcmd<".xcmd.">") - let ret= s:RemoteSystem(xcmd) - endif - if v:shell_error < 0 - call netrw#ErrorMsg(s:ERROR,"command<".xcmd."> failed, aborting",54) - break + 1split + exe "sil! keepalt e ".fnameescape(fname) +" call Decho("local<".fname.">: exe ".cmd) + exe cmd + exe "sil! keepalt wq!" else - echo ret +" call Decho("remote<".fname.">: exe ".cmd." : NOT SUPPORTED YET") + echo "sorry, \"mX\" not supported yet for remote files" endif endfor @@ -4638,13 +5942,13 @@ call s:NetrwUnmarkList(curbufnr,curdir) " refresh the listing - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) + keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + keepj call netrw#NetrwRestorePosn(svpos) else - call netrw#ErrorMsg(s:ERROR,"no files marked!",59) + keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59) endif -" call Dret("s:NetrwMarkFileExe") +" call Dret("s:NetrwMarkFileVimCmd") endfun " --------------------------------------------------------------------- @@ -4695,10 +5999,10 @@ endfor " refresh the listing - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) + keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + keepj call netrw#NetrwRestorePosn(svpos) else - call netrw#ErrorMsg(s:ERROR,"no files marked!",59) + keepj call netrw#ErrorMsg(s:ERROR,"no files marked!",59) endif " call Dret("s:NetrwMarkHideSfx") @@ -4716,30 +6020,47 @@ " call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">") let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "fnameescape(v:val)")) call s:NetrwUnmarkAll() + else +" call Decho('no marked files, using "*"') + let netrwmarkfilelist= "*" + endif - " ask user for pattern - call inputsave() - let pat= input("Enter pattern: ","") - call inputrestore() - if pat !~ '^\s' - if pat !~ '^/' - let pat= '/'.pat.'/' - endif - let pat= " ".pat - endif + " ask user for pattern + call inputsave() + let pat= input("Enter pattern: ","") + call inputrestore() + let patbang = "" + if pat =~ '^!' + let patbang = "!" + let pat= strpart(pat,2) + endif + if pat =~ '^\i' + let pat = escape(pat,'/') + let pat = '/'.pat.'/' + else + let nonisi = pat[0] + endif + + " use vimgrep for both local and remote +" call Decho("exe vimgrep".patbang." ".pat." ".netrwmarkfilelist) + try + exe "keepj noautocmd vimgrep".patbang." ".pat." ".netrwmarkfilelist + catch /^Vim\%((\a\+)\)\=:E480/ + keepj call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pat.">",76) +" call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pat.">") + return + endtry + echo "(use :cn, :cp to navigate, :Rex to return)" - " use vimgrep for both local and remote -" call Decho("exe vimgrep".pat." ".netrwmarkfilelist) - try - exe "keepj noautocmd vimgrep".pat." ".netrwmarkfilelist - catch /^Vim\%((\a\+)\)\=:E480/ - call netrw#ErrorMsg(s:WARNING,"no match with pattern<".pattern.">",76) -" call Dret("s:NetrwMarkFileGrep : unable to find pattern<".pattern.">") - return - endtry + 2match none + keepj call netrw#NetrwRestorePosn(svpos) - 2match none - call netrw#NetrwRestorePosn(svpos) + if exists("nonisi") + " original, user-supplied pattern did not begin with a character from isident +" call Decho("looking for trailing nonisi<".nonisi."> followed by a j, gj, or jg") + if pat =~ nonisi.'j$\|'.nonisi.'gj$\|'.nonisi.'jg$' + call s:NetrwMarkFileQFEL(a:islocal,getqflist()) + endif endif " call Dret("s:NetrwMarkFileGrep") @@ -4756,14 +6077,15 @@ let curbufnr = bufnr("%") " sanity check - if !exists("s:netrwmarkfilelist_{bufnr('%')}") || empty(s:netrwmarkfilelist_{bufnr('%')}) - call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) + if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr}) + keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) " call Dret("s:NetrwMarkFileMove") return endif -" call Decho("sanity chk passed: s:netrwmarkfilelist_".bufnr('%')."<".string(s:netrwmarkfilelist_{bufnr('%')})) +" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr})) + if !exists("s:netrwmftgt") - call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67) + keepj call netrw#ErrorMsg(2,"your marked file target is empty! (:help netrw-mt)",67) " call Dret("s:NetrwMarkFileCopy 0") return 0 endif @@ -4773,25 +6095,47 @@ " move: local -> local " call Decho("move from local to local") " call Decho("(s:NetrwMarkFileMove) local to local move") - if executable(g:netrw_localmovecmd) - for fname in s:netrwmarkfilelist_{bufnr("%")} -" call Decho("system(".g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt).")") - let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".shellescape(s:netrwmftgt)) - if v:shell_error < 0 - call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> failed, aborting",54) - break - endif - endfor + if !executable(g:netrw_localmovecmd) && g:netrw_localmovecmd !~ '\ not executable on your system, aborting",90) +" call Dfunc("s:NetrwMarkFileMove : g:netrw_localmovecmd<".g:netrw_localmovecmd."> n/a!") + return + endif + let tgt = shellescape(s:netrwmftgt) +" call Decho("tgt<".tgt.">") + if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16")) + let tgt = substitute(tgt, '/','\\','g') +" call Decho("windows exception: tgt<".tgt.">") + if g:netrw_localmovecmd =~ '\s' + let movecmd = substitute(g:netrw_localmovecmd,'\s.*$','','') + let movecmdargs = substitute(g:netrw_localmovecmd,'^.\{-}\(\s.*\)$','\1','') + let movecmd = netrw#WinPath(movecmd).movecmdargs +" call Decho("windows exception: movecmd<".movecmd."> (#1: had a space)") + else + let movecmd = netrw#WinPath(movecmd) +" call Decho("windows exception: movecmd<".movecmd."> (#2: no space)") + endif else - call netrw#ErrorMsg(s:ERROR,"command<".g:netrw_localmovecmd."> is not executable!",57) + let movecmd = netrw#WinPath(g:netrw_localmovecmd) +" call Decho("movecmd<".movecmd."> (#3 linux or cygwin)") endif + for fname in s:netrwmarkfilelist_{bufnr("%")} +" call Decho("system(".movecmd." ".shellescape(fname)." ".tgt.")") + if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16")) + let fname= substitute(fname,'/','\\','g') + endif + let ret= system(g:netrw_localmovecmd." ".shellescape(fname)." ".tgt) + if v:shell_error != 0 + call netrw#ErrorMsg(s:ERROR,"tried using g:netrw_localmovecmd<".g:netrw_localmovecmd.">; it doesn't work!",54) + break + endif + endfor elseif a:islocal && !s:netrwmftgt_islocal " move: local -> remote " call Decho("move from local to remote") " call Decho("copy") let mflist= s:netrwmarkfilelist_{bufnr("%")} - call s:NetrwMarkFileCopy(a:islocal) + keepj call s:NetrwMarkFileCopy(a:islocal) " call Decho("remove") for fname in mflist let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','') @@ -4804,7 +6148,7 @@ " call Decho("move from remote to local") " call Decho("copy") let mflist= s:netrwmarkfilelist_{bufnr("%")} - call s:NetrwMarkFileCopy(a:islocal) + keepj call s:NetrwMarkFileCopy(a:islocal) " call Decho("remove") for fname in mflist let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','') @@ -4817,7 +6161,7 @@ " call Decho("move from remote to remote") " call Decho("copy") let mflist= s:netrwmarkfilelist_{bufnr("%")} - call s:NetrwMarkFileCopy(a:islocal) + keepj call s:NetrwMarkFileCopy(a:islocal) " call Decho("remove") for fname in mflist let barefname = substitute(fname,'^\(.*/\)\(.\{-}\)$','\2','') @@ -4836,13 +6180,16 @@ " refresh buffers if !s:netrwmftgt_islocal - call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt) +" call Decho("refresh netrwmftgt<".s:netrwmftgt.">") + keepj call s:NetrwRefreshDir(s:netrwmftgt_islocal,s:netrwmftgt) endif if a:islocal - call s:NetrwRefreshDir(a:islocal,b:netrw_curdir) +" call Decho("refresh b:netrw_curdir<".b:netrw_curdir.">") + keepj call s:NetrwRefreshDir(a:islocal,b:netrw_curdir) endif if g:netrw_fastbrowse <= 1 - call s:LocalBrowseShellCmdRefresh() +" call Decho("since g:netrw_fastbrowse=".g:netrw_fastbrowse.", perform shell cmd refresh") + keepj call s:LocalBrowseShellCmdRefresh() endif " call Dret("s:NetrwMarkFileMove") @@ -4854,6 +6201,14 @@ fun! s:NetrwMarkFilePrint(islocal) " call Dfunc("s:NetrwMarkFilePrint(islocal=".a:islocal.")") let curbufnr= bufnr("%") + + " sanity check + if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr}) + keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) +" call Dret("s:NetrwMarkFilePrint") + return + endif +" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr})) if exists("s:netrwmarkfilelist_{curbufnr}") let netrwmarkfilelist = s:netrwmarkfilelist_{curbufnr} let curdir = b:netrw_curdir @@ -4868,8 +6223,8 @@ endif 1split " the autocmds will handle both local and remote files -" call Decho("exe silent e ".escape(fname,' ')) - exe "silent e ".fnameescape(fname) +" call Decho("exe sil e ".escape(fname,' ')) + exe "sil e ".fnameescape(fname) " call Decho("hardcopy") hardcopy q @@ -4882,7 +6237,7 @@ " --------------------------------------------------------------------- " s:NetrwMarkFileRegexp: (invoked by mr) This function is used to mark {{{2 " files when given a regexp (for which a prompt is -" issued). +" issued) (matches to name of files). fun! s:NetrwMarkFileRegexp(islocal) " call Dfunc("s:NetrwMarkFileRegexp(islocal=".a:islocal.")") @@ -4894,15 +6249,15 @@ if a:islocal " get the matching list of files using local glob() " call Decho("handle local regexp") - let dirname = escape(b:netrw_curdir,g:netrw_glob_escape) - let files = glob(s:ComposePath(dirname,regexp)) + let dirname = escape(b:netrw_curdir,g:netrw_glob_escape) + let files = glob(s:ComposePath(dirname,regexp)) " call Decho("files<".files.">") let filelist= split(files,"\n") " mark the list of files for fname in filelist " call Decho("fname<".fname.">") - call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','','')) + keepj call s:NetrwMarkFile(a:islocal,substitute(fname,'^.*/','','')) endfor else @@ -4915,8 +6270,8 @@ set ei=all ma " call Decho("set ei=all ma") 1split - call s:NetrwEnew() - call s:NetrwSafeOptions() + keepj call s:NetrwEnew() + keepj call s:NetrwSafeOptions() sil keepj norm! "ap keepj 2 let bannercnt= search('^" =====','W') @@ -4942,12 +6297,13 @@ let filelist= getline(1,line("$")) q! for filename in filelist - call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','','')) + keepj call s:NetrwMarkFile(a:islocal,substitute(filename,'^.*/','','')) endfor unlet filelist let @a = areg let &ei = eikeep endif + echo " (use me to edit marked files)" " call Dret("s:NetrwMarkFileRegexp") endfun @@ -4958,6 +6314,14 @@ fun! s:NetrwMarkFileSource(islocal) " call Dfunc("s:NetrwMarkFileSource(islocal=".a:islocal.")") let curbufnr= bufnr("%") + + " sanity check + if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr}) + keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) +" call Dret("s:NetrwMarkFileSource") + return + endif +" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr})) if exists("s:netrwmarkfilelist_{curbufnr}") let netrwmarkfilelist = s:netrwmarkfilelist_{bufnr("%")} let curdir = b:netrw_curdir @@ -4988,6 +6352,14 @@ let curdir = b:netrw_curdir let curbufnr = bufnr("%") + " sanity check + if !exists("s:netrwmarkfilelist_{curbufnr}") || empty(s:netrwmarkfilelist_{curbufnr}) + keepj call netrw#ErrorMsg(2,"there are no marked files in this window (:help netrw-mf)",66) +" call Dret("s:NetrwMarkFileTag") + return + endif +" call Decho("sanity chk passed: s:netrwmarkfilelist_".curbufnr."<".string(s:netrwmarkfilelist_{curbufnr})) + if exists("s:netrwmarkfilelist") " call Decho("s:netrwmarkfilelist".string(s:netrwmarkfilelist).">") let netrwmarkfilelist= join(map(deepcopy(s:netrwmarkfilelist), "shellescape(v:val,".!a:islocal.")")) @@ -5023,9 +6395,9 @@ " --------------------------------------------------------------------- " s:NetrwMarkFileTgt: (invoked by mt) This function sets up a marked file target {{{2 " Sets up two variables, -" s:netrwmftgt : holds the target directory +" s:netrwmftgt : holds the target directory " s:netrwmftgt_islocal : 0=target directory is remote -" 1=target directory is local +" 1=target directory is local fun! s:NetrwMarkFileTgt(islocal) " call Dfunc("s:NetrwMarkFileTgt(islocal=".a:islocal.")") let svpos = netrw#NetrwSavePosn() @@ -5037,9 +6409,21 @@ " set up target if line(".") < w:netrw_bannercnt - " if cursor in banner region, use b:netrw_curdir for the target - let s:netrwmftgt= b:netrw_curdir -" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">") + " if cursor in banner region, use b:netrw_curdir for the target unless its already the target + if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal") && s:netrwmftgt == b:netrw_curdir +" call Decho("cursor in banner region, and target already is <".b:netrw_curdir.">: removing target") + unlet s:netrwmftgt s:netrwmftgt_islocal + if g:netrw_fastbrowse <= 1 + call s:LocalBrowseShellCmdRefresh() + endif + call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) +" call Dret("s:NetrwMarkFileTgt : removed target") + return + else + let s:netrwmftgt= b:netrw_curdir +" call Decho("inbanner: s:netrwmftgt<".s:netrwmftgt.">") + endif else " get word under cursor. @@ -5085,6 +6469,7 @@ " s:NetrwOpenFile: query user for a filename and open it {{{2 fun! s:NetrwOpenFile(islocal) " call Dfunc("s:NetrwOpenFile(islocal=".a:islocal.")") + let ykeep= @@ call inputsave() let fname= input("Enter filename: ") call inputrestore() @@ -5108,11 +6493,14 @@ else exe "e ".fnameescape(fname) endif + let @@= ykeep " call Dret("s:NetrwOpenFile") endfun " --------------------------------------------------------------------- " s:NetrwUnmarkList: delete local marked file lists and remove their contents from the global marked-file list {{{2 +" User access provided by the mapping. (see :help netrw-mu) +" Used by many MarkFile functions. fun! s:NetrwUnmarkList(curbufnr,curdir) " call Dfunc("s:NetrwUnmarkList(curbufnr=".a:curbufnr." curdir<".a:curdir.">)") @@ -5144,13 +6532,13 @@ if exists("s:netrwmarkfilelist") unlet s:netrwmarkfilelist endif - silent call s:NetrwUnmarkAll2() + sil call s:NetrwUnmarkAll2() 2match none " call Dret("s:NetrwUnmarkAll") endfun " --------------------------------------------------------------------- -" s:NetrwUnmarkAll2: {{{2 +" s:NetrwUnmarkAll2: unmark all files from all buffers {{{2 fun! s:NetrwUnmarkAll2() " call Dfunc("s:NetrwUnmarkAll2()") redir => netrwmarkfilelist_let @@ -5181,318 +6569,133 @@ unlet s:netrwmarkfilelist unlet s:netrwmarkfilelist_{curbufnr} unlet s:netrwmarkfilemtch_{curbufnr} - 2match none - endif - -" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) -" call Dret("s:NetrwUnMarkFile") -endfun - -" --------------------------------------------------------------------- -" s:NetrwMenu: generates the menu for gvim and netrw {{{2 -fun! s:NetrwMenu(domenu) - - if !exists("g:NetrwMenuPriority") - let g:NetrwMenuPriority= 80 - endif - - if has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu -" call Dfunc("NetrwMenu(domenu=".a:domenu.")") - - if !exists("s:netrw_menu_enabled") && a:domenu -" call Decho("initialize menu") - let s:netrw_menu_enabled= 1 - exe 'sil! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help ' - exe 'sil! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :' - exe 'sil! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory- -' - exe 'sil! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewerx x' - exe 'sil! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directorymb mb' - exe 'sil! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)u u' - exe 'sil! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)U U' - exe 'sil! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Listqb qb' - exe 'sil! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List'." \'" - exe 'sil! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ SequenceS S' - exe 'sil! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files'."gh gh" - exe 'sil! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing'." \" - exe 'sil! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options:NetrwSettings '.":NetrwSettings\" - exe 'sil! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/DirectoryD D' - exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Create\ New\ File% %' - exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window '."\" - exe 'sil! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directoryp p' - exe 'sil! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ WindowP P' - exe 'sil! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Windowo o' - exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Windowv v' - exe 'sil! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore ' - exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only):Explore\ */ :Explore */' - exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs):Explore\ **/ :Explore **/' - exe 'sil! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only):Explore\ *// :Explore *//' - exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs):Explore\ **// :Explore **//' - exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match:Nexplore :Nexplore' - exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match:Pexplore :Pexplore' - exe 'sil! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectoryd d' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Filemf mf' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexpmr mr' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Controla a' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Targetmc mc' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.DeleteD D' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diffmd md' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Editme me' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmdmx mx' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Targetmm mm' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.ObtainO O' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Printmp mp' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.ReplaceR R' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Targetmt mt' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.TagmT mT' - exe 'sil! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompressmz mz' - exe 'sil! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ FileO O' - exe 'sil! menu '.g:NetrwMenuPriority.'.16.1 '.g:NetrwTopLvlMenu.'Style.Listing\ Style\ (thin-long-wide-tree)i i' - exe 'sil! menu '.g:NetrwMenuPriority.'.16.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Showa a' - exe 'sil! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order'."r r" - exe 'sil! menu '.g:NetrwMenuPriority.'.16.4 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method\ (name-time-size)s s' - exe 'sil! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/DirectoryR R' - exe 'sil! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directoryc c' - call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x - let s:netrw_menucnt= 28 - - elseif !a:domenu - let s:netrwcnt = 0 - let curwin = winnr() - windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif - exe curwin."wincmd w" - - if s:netrwcnt <= 1 -" call Decho("clear menus") - exe 'sil! unmenu '.g:NetrwTopLvlMenu -" call Decho('exe silent! unmenu '.g:NetrwTopLvlMenu.'*') - sil! unlet s:netrw_menu_enabled - endif - endif -" call Dret("NetrwMenu") - endif - -endfun - -" --------------------------------------------------------------------- -" s:NetrwObtain: obtain file under cursor or from markfile list {{{2 -" Used by the O maps (as NetrwObtain()) -fun! s:NetrwObtain(islocal) -" call Dfunc("NetrwObtain(islocal=".a:islocal.")") - - if exists("s:netrwmarkfilelist_{bufnr('%')}") - let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://' - call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')}) - call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir) - else - call netrw#NetrwObtain(a:islocal,expand("")) - endif - -" call Dret("NetrwObtain") -endfun - -" --------------------------------------------------------------------- -" netrw#NetrwObtain: {{{2 -" netrw#NetrwObtain(islocal,fname[,tgtdirectory]) -" islocal=0 obtain from remote source -" =1 obtain from local source -" fname : a filename or a list of filenames -" tgtdir : optional place where files are to go (not present, uses getcwd()) -fun! netrw#NetrwObtain(islocal,fname,...) -" call Dfunc("netrw#NetrwObtain(islocal=".a:islocal." fname<".((type(a:fname) == 1)? a:fname : string(a:fname)).">) a:0=".a:0) - " NetrwStatusLine support - for obtaining support - - if type(a:fname) == 1 - let fnamelist= [ a:fname ] - elseif type(a:fname) == 3 - let fnamelist= a:fname - else - call netrw#ErrorMsg(s:ERROR,"attempting to use NetrwObtain on something not a filename or a list",62) -" call Dret("netrw#NetrwObtain") - return - endif -" call Decho("fnamelist<".string(fnamelist).">") - if a:0 > 0 - let tgtdir= a:1 - else - let tgtdir= getcwd() - endif -" call Decho("tgtdir<".tgtdir.">") - - if exists("b:netrw_islocal") && b:netrw_islocal - " obtain a file from local b:netrw_curdir to (local) tgtdir -" call Decho("obtain a file from local ".b:netrw_curdir." to ".tgtdir) - if exists("b:netrw_curdir") && getcwd() != b:netrw_curdir - let topath= s:ComposePath(tgtdir,"") - if (has("win32") || has("win95") || has("win64") || has("win16")) - " transfer files one at time -" call Decho("transfer files one at a time") - for fname in fnamelist -" call Decho("system(".g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath).")") - call system(g:netrw_localcopycmd." ".shellescape(fname)." ".shellescape(topath)) - endfor - else - " transfer files with one command -" call Decho("transfer files with one command") - let filelist= join(map(deepcopy(fnamelist),"shellescape(v:val)")) -" call Decho("system(".g:netrw_localcopycmd." ".filelist." ".shellescape(topath).")") - call system(g:netrw_localcopycmd." ".filelist." ".shellescape(topath)) - endif - elseif !exists("b:netrw_curdir") - call netrw#ErrorMsg(s:ERROR,"local browsing directory doesn't exist!",36) - else - call netrw#ErrorMsg(s:WARNING,"local browsing directory and current directory are identical",37) - endif - - else - " obtain files from remote b:netrw_curdir to local tgtdir -" call Decho("obtain a file from remote ".b:netrw_curdir." to ".tgtdir) - if type(a:fname) == 1 - call s:SetupNetrwStatusLine('%f %h%m%r%=%9*Obtaining '.a:fname) - endif - call s:NetrwMethod(b:netrw_curdir) - - if b:netrw_method == 4 - " obtain file using scp -" call Decho("obtain via scp (method#4)") - if exists("g:netrw_port") && g:netrw_port != "" - let useport= " ".g:netrw_scpport." ".g:netrw_port - else - let useport= "" - endif - if b:netrw_fname =~ '/' - let path= substitute(b:netrw_fname,'^\(.*/\).\{-}$','\1','') - else - let path= "" - endif - let filelist= join(map(deepcopy(fnamelist),'shellescape(g:netrw_machine.":".path.v:val,1)')) -" call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1)) - exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".filelist." ".shellescape(tgtdir,1) - - elseif b:netrw_method == 2 - " obtain file using ftp + .netrc -" call Decho("obtain via ftp+.netrc (method #2)") - call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars() - let tmpbufnr= bufnr("%") - setlocal ff=unix - if exists("g:netrw_ftpmode") && g:netrw_ftpmode != "" - keepj put =g:netrw_ftpmode -" call Decho("filter input: ".getline('$')) - endif - - if exists("b:netrw_fname") && b:netrw_fname != "" - call setline(line("$")+1,'cd "'.b:netrw_fname.'"') -" call Decho("filter input: ".getline('$')) - endif - - if exists("g:netrw_ftpextracmd") - keepj put =g:netrw_ftpextracmd -" call Decho("filter input: ".getline('$')) - endif - for fname in fnamelist - call setline(line("$")+1,'get "'.fname.'"') -" call Decho("filter input: ".getline('$')) - endfor - if exists("g:netrw_port") && g:netrw_port != "" -" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) - exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) - else -" call Decho("executing: %!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) - exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) - endif - " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) - if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying ' - let debugkeep= &debug - setlocal debug=msg - call netrw#ErrorMsg(s:ERROR,getline(1),4) - let &debug= debugkeep - endif - - elseif b:netrw_method == 3 - " obtain with ftp + machine, id, passwd, and fname (ie. no .netrc) -" call Decho("obtain via ftp+mipf (method #3)") - call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars() - let tmpbufnr= bufnr("%") - setlocal ff=unix - - if exists("g:netrw_port") && g:netrw_port != "" - keepj put ='open '.g:netrw_machine.' '.g:netrw_port -" call Decho("filter input: ".getline('$')) - else - keepj put ='open '.g:netrw_machine -" call Decho("filter input: ".getline('$')) - endif + 2match none + endif - if exists("g:netrw_ftp") && g:netrw_ftp == 1 - keepj put =g:netrw_uid -" call Decho("filter input: ".getline('$')) - keepj put ='\"'.s:netrw_passwd.'\"' -" call Decho("filter input: ".getline('$')) - else - keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' -" call Decho("filter input: ".getline('$')) - endif +" call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + call netrw#NetrwRestorePosn(svpos) +" call Dret("s:NetrwUnMarkFile") +endfun - if exists("g:netrw_ftpmode") && g:netrw_ftpmode != "" - keepj put =g:netrw_ftpmode -" call Decho("filter input: ".getline('$')) - endif +" --------------------------------------------------------------------- +" s:NetrwMenu: generates the menu for gvim and netrw {{{2 +fun! s:NetrwMenu(domenu) - if exists("b:netrw_fname") && b:netrw_fname != "" - keepj call setline(line("$")+1,'cd "'.b:netrw_fname.'"') -" call Decho("filter input: ".getline('$')) - endif + if !exists("g:NetrwMenuPriority") + let g:NetrwMenuPriority= 80 + endif - if exists("g:netrw_ftpextracmd") - keepj put =g:netrw_ftpextracmd -" call Decho("filter input: ".getline('$')) - endif + if has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu +" call Dfunc("NetrwMenu(domenu=".a:domenu.")") - if exists("g:netrw_ftpextracmd") - keepj put =g:netrw_ftpextracmd -" call Decho("filter input: ".getline('$')) - endif - for fname in fnamelist - keepj call setline(line("$")+1,'get "'.fname.'"') - endfor -" call Decho("filter input: ".getline('$')) + if !exists("s:netrw_menu_enabled") && a:domenu +" call Decho("initialize menu") + let s:netrw_menu_enabled= 1 + exe 'sil! menu '.g:NetrwMenuPriority.'.1 '.g:NetrwTopLvlMenu.'Help ' + exe 'sil! menu '.g:NetrwMenuPriority.'.5 '.g:NetrwTopLvlMenu.'-Sep1- :' + exe 'sil! menu '.g:NetrwMenuPriority.'.6 '.g:NetrwTopLvlMenu.'Go\ Up\ Directory- -' + exe 'sil! menu '.g:NetrwMenuPriority.'.7 '.g:NetrwTopLvlMenu.'Apply\ Special\ Viewerx x' + if g:netrw_dirhistmax > 0 + exe 'sil! menu '.g:NetrwMenuPriority.'.8.1 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Bookmark\ Current\ Directorymb mb' + exe 'sil! menu '.g:NetrwMenuPriority.'.8.4 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Prev\ Dir\ (History)u u' + exe 'sil! menu '.g:NetrwMenuPriority.'.8.5 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Goto\ Next\ Dir\ (History)U U' + exe 'sil! menu '.g:NetrwMenuPriority.'.8.6 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History.Listqb qb' + else + exe 'sil! menu '.g:NetrwMenuPriority.'.8 '.g:NetrwTopLvlMenu.'Bookmarks\ and\ History :echo "(disabled)"'."\" + endif + exe 'sil! menu '.g:NetrwMenuPriority.'.9.1 '.g:NetrwTopLvlMenu.'Browsing\ Control.Horizontal\ Splito o' + exe 'sil! menu '.g:NetrwMenuPriority.'.9.2 '.g:NetrwTopLvlMenu.'Browsing\ Control.Vertical\ Splitv v' + exe 'sil! menu '.g:NetrwMenuPriority.'.9.3 '.g:NetrwTopLvlMenu.'Browsing\ Control.New\ Tabt t' + exe 'sil! menu '.g:NetrwMenuPriority.'.9.4 '.g:NetrwTopLvlMenu.'Browsing\ Control.Previewp p' + exe 'sil! menu '.g:NetrwMenuPriority.'.9.5 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ File\ Hiding\ List'." \'" + exe 'sil! menu '.g:NetrwMenuPriority.'.9.6 '.g:NetrwTopLvlMenu.'Browsing\ Control.Edit\ Sorting\ SequenceS S' + exe 'sil! menu '.g:NetrwMenuPriority.'.9.7 '.g:NetrwTopLvlMenu.'Browsing\ Control.Quick\ Hide/Unhide\ Dot\ Files'."gh gh" + exe 'sil! menu '.g:NetrwMenuPriority.'.9.8 '.g:NetrwTopLvlMenu.'Browsing\ Control.Refresh\ Listing'." \" + exe 'sil! menu '.g:NetrwMenuPriority.'.9.9 '.g:NetrwTopLvlMenu.'Browsing\ Control.Settings/Options:NetrwSettings '.":NetrwSettings\" + exe 'sil! menu '.g:NetrwMenuPriority.'.10 '.g:NetrwTopLvlMenu.'Delete\ File/DirectoryD D' + exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Create\ New\ File% %' + exe 'sil! menu '.g:NetrwMenuPriority.'.11.1 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Current\ Window '."\" + exe 'sil! menu '.g:NetrwMenuPriority.'.11.2 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.Preview\ File/Directoryp p' + exe 'sil! menu '.g:NetrwMenuPriority.'.11.3 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ Previous\ WindowP P' + exe 'sil! menu '.g:NetrwMenuPriority.'.11.4 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Windowo o' + exe 'sil! menu '.g:NetrwMenuPriority.'.11.5 '.g:NetrwTopLvlMenu.'Edit\ File/Dir.In\ New\ Vertical\ Windowv v' + exe 'sil! menu '.g:NetrwMenuPriority.'.12.1 '.g:NetrwTopLvlMenu.'Explore.Directory\ Name :Explore ' + exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (curdir\ only):Explore\ */ :Explore */' + exe 'sil! menu '.g:NetrwMenuPriority.'.12.2 '.g:NetrwTopLvlMenu.'Explore.Filenames\ Matching\ Pattern\ (+subdirs):Explore\ **/ :Explore **/' + exe 'sil! menu '.g:NetrwMenuPriority.'.12.3 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (curdir\ only):Explore\ *// :Explore *//' + exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Files\ Containing\ String\ Pattern\ (+subdirs):Explore\ **// :Explore **//' + exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Next\ Match:Nexplore :Nexplore' + exe 'sil! menu '.g:NetrwMenuPriority.'.12.4 '.g:NetrwTopLvlMenu.'Explore.Prev\ Match:Pexplore :Pexplore' + exe 'sil! menu '.g:NetrwMenuPriority.'.13 '.g:NetrwTopLvlMenu.'Make\ Subdirectoryd d' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.1 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Filemf mf' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.2 '.g:NetrwTopLvlMenu.'Marked\ Files.Mark\ Files\ by\ Regexpmr mr' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.3 '.g:NetrwTopLvlMenu.'Marked\ Files.Hide-Show-List\ Controla a' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.4 '.g:NetrwTopLvlMenu.'Marked\ Files.Copy\ To\ Targetmc mc' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.5 '.g:NetrwTopLvlMenu.'Marked\ Files.DeleteD D' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.6 '.g:NetrwTopLvlMenu.'Marked\ Files.Diffmd md' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.7 '.g:NetrwTopLvlMenu.'Marked\ Files.Editme me' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.8 '.g:NetrwTopLvlMenu.'Marked\ Files.Exe\ Cmdmx mx' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.9 '.g:NetrwTopLvlMenu.'Marked\ Files.Move\ To\ Targetmm mm' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.10 '.g:NetrwTopLvlMenu.'Marked\ Files.ObtainO O' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.11 '.g:NetrwTopLvlMenu.'Marked\ Files.Printmp mp' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.12 '.g:NetrwTopLvlMenu.'Marked\ Files.ReplaceR R' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.13 '.g:NetrwTopLvlMenu.'Marked\ Files.Set\ Targetmt mt' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.14 '.g:NetrwTopLvlMenu.'Marked\ Files.TagmT mT' + exe 'sil! menu '.g:NetrwMenuPriority.'.14.15 '.g:NetrwTopLvlMenu.'Marked\ Files.Zip/Unzip/Compress/Uncompressmz mz' + exe 'sil! menu '.g:NetrwMenuPriority.'.15 '.g:NetrwTopLvlMenu.'Obtain\ FileO O' + exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.thini :let w:netrw_liststyle=0' + exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.longi :let w:netrw_liststyle=1' + exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.widei :let w:netrw_liststyle=2' + exe 'sil! menu '.g:NetrwMenuPriority.'.16.1.1 '.g:NetrwTopLvlMenu.'Style.Listing.treei :let w:netrw_liststyle=3' + exe 'sil! menu '.g:NetrwMenuPriority.'.16.2.1 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show.Show\ Alla :let g:netrw_hide=0' + exe 'sil! menu '.g:NetrwMenuPriority.'.16.2.3 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show.Normala :let g:netrw_hide=1' + exe 'sil! menu '.g:NetrwMenuPriority.'.16.2.2 '.g:NetrwTopLvlMenu.'Style.Normal-Hide-Show.Hidden\ Onlya :let g:netrw_hide=2' + exe 'sil! menu '.g:NetrwMenuPriority.'.16.3 '.g:NetrwTopLvlMenu.'Style.Reverse\ Sorting\ Order'."r r" + exe 'sil! menu '.g:NetrwMenuPriority.'.16.4.1 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method.Names :let g:netrw_sort_by="name"' + exe 'sil! menu '.g:NetrwMenuPriority.'.16.4.2 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method.Times :let g:netrw_sort_by="time"' + exe 'sil! menu '.g:NetrwMenuPriority.'.16.4.3 '.g:NetrwTopLvlMenu.'Style.Sorting\ Method.Sizes :let g:netrw_sort_by="size"' + exe 'sil! menu '.g:NetrwMenuPriority.'.17 '.g:NetrwTopLvlMenu.'Rename\ File/DirectoryR R' + exe 'sil! menu '.g:NetrwMenuPriority.'.18 '.g:NetrwTopLvlMenu.'Set\ Current\ Directoryc c' + let s:netrw_menucnt= 28 + call s:NetrwBookmarkMenu() " provide some history! uses priorities 2,3, reserves 4, 8.2.x + call s:NetrwTgtMenu() " let bookmarks and history be easy targets - " perform ftp: - " -i : turns off interactive prompting from ftp - " -n unix : DON'T use <.netrc>, even though it exists - " -n win32: quit being obnoxious about password - keepj norm! 1Gdd -" call Decho("executing: %!".g:netrw_ftp_cmd." -i -n") - exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n" - " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) - if getline(1) !~ "^$" -" call Decho("error<".getline(1).">") - if !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,getline(1),5) - endif + elseif !a:domenu + let s:netrwcnt = 0 + let curwin = winnr() + windo if getline(2) =~ "Netrw" | let s:netrwcnt= s:netrwcnt + 1 | endif + exe curwin."wincmd w" + + if s:netrwcnt <= 1 +" call Decho("clear menus") + exe 'sil! unmenu '.g:NetrwTopLvlMenu +" call Decho('exe sil! unmenu '.g:NetrwTopLvlMenu.'*') + sil! unlet s:netrw_menu_enabled endif - elseif !exists("b:netrw_method") || b:netrw_method < 0 -" call Dfunc("netrw#NetrwObtain : unsupported method") - return endif +" call Dret("NetrwMenu") + return + endif - " restore status line - if type(a:fname) == 1 && exists("s:netrw_users_stl") - call s:SetupNetrwStatusLine(s:netrw_users_stl) - endif +endfun - endif +" --------------------------------------------------------------------- +" s:NetrwObtain: obtain file under cursor or from markfile list {{{2 +" Used by the O maps (as NetrwObtain()) +fun! s:NetrwObtain(islocal) +" call Dfunc("NetrwObtain(islocal=".a:islocal.")") - " cleanup - if exists("tmpbufnr") - if bufnr("%") != tmpbufnr - exe tmpbufnr."bw!" - else - q! - endif + let ykeep= @@ + if exists("s:netrwmarkfilelist_{bufnr('%')}") + let islocal= s:netrwmarkfilelist_{bufnr('%')}[1] !~ '^\a\+://' + call netrw#NetrwObtain(islocal,s:netrwmarkfilelist_{bufnr('%')}) + call s:NetrwUnmarkList(bufnr('%'),b:netrw_curdir) + else + call netrw#NetrwObtain(a:islocal,expand("")) endif + let @@= ykeep -" call Dret("netrw#NetrwObtain") +" call Dret("NetrwObtain") endfun " --------------------------------------------------------------------- @@ -5506,6 +6709,7 @@ fun! s:NetrwPrevWinOpen(islocal) " call Dfunc("NetrwPrevWinOpen(islocal=".a:islocal.")") + let ykeep= @@ " grab a copy of the b:netrw_curdir to pass it along to newly split windows let curdir = b:netrw_curdir @@ -5520,19 +6724,21 @@ " if only one window, open a new one first " call Decho("only one window, so open a new one (g:netrw_alto=".g:netrw_alto.")") if g:netrw_preview -" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s") - exe (g:netrw_alto? "top " : "bot ")."vert ".g:netrw_winsize."wincmd s" - else -" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s") - exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s" + let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize +" call Decho("exe ".(g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s") + exe (g:netrw_alto? "top " : "bot ")."vert ".winsz."wincmd s" + else + let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize +" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s") + exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s" endif let didsplit = 1 else - call s:SaveBufVars() + keepj call s:SaveBufVars() " call Decho("wincmd p") wincmd p - call s:RestoreBufVars() + keepj call s:RestoreBufVars() " if the previous window's buffer has been changed (is modified), " and it doesn't appear in any other extant window, then ask the " user if s/he wants to abandon modifications therein. @@ -5554,7 +6760,7 @@ if choice == 1 " Yes -- write file & then browse let v:errmsg= "" - silent w + sil w if v:errmsg != "" call netrw#ErrorMsg(s:ERROR,"unable to write <".bufname.">!",30) if didsplit @@ -5562,14 +6768,17 @@ else wincmd p endif + let @@= ykeep " call Dret("NetrwPrevWinOpen ".choice." : unable to write <".bufname.">") return choice endif elseif choice == 2 " No -- don't worry about changed file, just browse anyway - setlocal nomod - call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31) +" call Decho("(NetrwPrevWinOpen) setl nomod") + setl nomod +" call Decho("(NetrwPrevWinOpen) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") + keepj call netrw#ErrorMsg(s:WARNING,bufname." changes to ".bufname." abandoned",31) wincmd p else @@ -5579,6 +6788,7 @@ else wincmd p endif + let @@= ykeep " call Dret("NetrwPrevWinOpen ".choice." : cancelled") return choice endif @@ -5595,6 +6805,7 @@ call s:NetrwBrowse(a:islocal,s:NetrwBrowseChgDir(a:islocal,curword)) endif endif + let @@= ykeep " call Dret("NetrwPrevWinOpen ".choice) return choice endfun @@ -5644,7 +6855,7 @@ " call Decho("handle uploading a list of files via scp") let curdir= getcwd() if a:tgt =~ '^scp:' - exe "keepjumps silent lcd ".fnameescape(fromdir) + exe "keepjumps sil lcd ".fnameescape(fromdir) let filelist= deepcopy(s:netrwmarkfilelist_{bufnr('%')}) let args = join(map(filelist,"shellescape(v:val, 1)")) if exists("g:netrw_port") && g:netrw_port != "" @@ -5656,7 +6867,7 @@ let tgt = substitute(a:tgt,'^scp://[^/]\+/\(.*\)$','\1','') " call Decho("exe ".s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1)) exe s:netrw_silentxfer."!".g:netrw_scp_cmd.shellescape(useport,1)." ".args." ".shellescape(machine.":".tgt,1) - exe "keepjumps silent lcd ".fnameescape(curdir) + exe "keepjumps sil lcd ".fnameescape(curdir) elseif a:tgt =~ '^ftp:' call s:NetrwMethod(a:tgt) @@ -5678,6 +6889,9 @@ keepj call setline(line("$")+1,'lcd "'.fromdir.'"') " call Decho("filter input: ".getline('$')) + if tgtdir == "" + let tgtdir= '/' + endif keepj call setline(line("$")+1,'cd "'.tgtdir.'"') " call Decho("filter input: ".getline('$')) @@ -5687,12 +6901,12 @@ endfor if exists("g:netrw_port") && g:netrw_port != "" -" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) - exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) +" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) + exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) else " call Decho("filter input window#".winnr()) -" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) - exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) +" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) endif " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) sil keepj g/Local directory now/d @@ -5706,9 +6920,9 @@ elseif b:netrw_method == 3 " upload with ftp + machine, id, passwd, and fname (ie. no .netrc) let netrw_fname= b:netrw_fname - call s:SaveBufVars()|silent keepjumps new|call s:RestoreBufVars() + keepj call s:SaveBufVars()|sil keepj new|keepj call s:RestoreBufVars() let tmpbufnr= bufnr("%") - setlocal ff=unix + setl ff=unix if exists("g:netrw_port") && g:netrw_port != "" keepj put ='open '.g:netrw_machine.' '.g:netrw_port @@ -5718,14 +6932,18 @@ " call Decho("filter input: ".getline('$')) endif - if exists("g:netrw_ftp") && g:netrw_ftp == 1 - keepj put =g:netrw_uid -" call Decho("filter input: ".getline('$')) - keepj call setline(line("$")+1,'"'.s:netrw_passwd.'"') -" call Decho("filter input: ".getline('$')) - else - keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' -" call Decho("filter input: ".getline('$')) + if exists("g:netrw_uid") && g:netrw_uid != "" + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + keepj put =g:netrw_uid +" call Decho("filter input: ".getline('$')) + if exists("s:netrw_passwd") + keepj call setline(line("$")+1,'"'.s:netrw_passwd.'"') + endif +" call Decho("filter input: ".getline('$')) + elseif exists("s:netrw_passwd") + keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' +" call Decho("filter input: ".getline('$')) + endif endif keepj call setline(line("$")+1,'lcd "'.fromdir.'"') @@ -5751,14 +6969,14 @@ " -n unix : DON'T use <.netrc>, even though it exists " -n win32: quit being obnoxious about password keepj norm! 1Gdd -" call Decho("executing: ".s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n") - exe s:netrw_silentxfer."%!".g:netrw_ftp_cmd." -i -n" +" call Decho("executing: ".s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options) + exe s:netrw_silentxfer."%!".s:netrw_ftp_cmd." ".g:netrw_ftp_options " If the result of the ftp operation isn't blank, show an error message (tnx to Doug Claar) sil keepj g/Local directory now/d call histdel("/",-1) if getline(1) !~ "^$" && !exists("g:netrw_quiet") && getline(1) !~ '^Trying ' let debugkeep= &debug - setlocal debug=msg + setl debug=msg call netrw#ErrorMsg(s:ERROR,getline(1),15) let &debug = debugkeep let mod = 1 @@ -5781,25 +6999,28 @@ " s:NetrwPreview: {{{2 fun! s:NetrwPreview(path) range " call Dfunc("NetrwPreview(path<".a:path.">)") - call s:NetrwOptionSave("s:") - call s:NetrwSafeOptions() + let ykeep= @@ + keepj call s:NetrwOptionSave("s:") + keepj call s:NetrwSafeOptions() if has("quickfix") if !isdirectory(a:path) if g:netrw_preview && !g:netrw_alto - let pvhkeep= &pvh - let &pvh = winwidth(0) - g:netrw_winsize + let pvhkeep = &pvh + let winsz = (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize + let &pvh = winwidth(0) - winsz endif exe (g:netrw_alto? "top " : "bot ").(g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path) if exists("pvhkeep") let &pvh= pvhkeep endif elseif !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38) + keepj call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as <".a:path.">",38) endif elseif !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39) + keepj call netrw#ErrorMsg(s:WARNING,"sorry, to preview your vim needs the quickfix feature compiled in",39) endif - call s:NetrwOptionRestore("s:") + keepj call s:NetrwOptionRestore("s:") + let @@= ykeep " call Dret("NetrwPreview") endfun @@ -5808,18 +7029,21 @@ fun! s:NetrwRefresh(islocal,dirname) " call Dfunc("NetrwRefresh(islocal<".a:islocal.">,dirname=".a:dirname.") hide=".g:netrw_hide." sortdir=".g:netrw_sort_direction) " at the current time (Mar 19, 2007) all calls to NetrwRefresh() call NetrwBrowseChgDir() first. - " NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here. - " Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself. - setlocal ma noro -" call Decho("setlocal ma noro") + " (defunct) NetrwBrowseChgDir() may clear the display; hence a NetrwSavePosn() may not work if its placed here. + " (defunct) Also, NetrwBrowseChgDir() now does a NetrwSavePosn() itself. + setl ma noro +" call Decho("setl ma noro") " call Decho("clear buffer<".expand("%")."> with :%d") + let ykeep = @@ + let screenposn = netrw#NetrwSavePosn() +" call Decho("clearing buffer prior to refresh") sil! keepj %d if a:islocal - call netrw#LocalBrowseCheck(a:dirname) + keepj call netrw#LocalBrowseCheck(a:dirname) else - call s:NetrwBrowse(a:islocal,a:dirname) + keepj call s:NetrwBrowse(a:islocal,a:dirname) endif - call netrw#NetrwRestorePosn() + keepj call netrw#NetrwRestorePosn(screenposn) " restore file marks if exists("s:netrwmarkfilemtch_{bufnr('%')}") && s:netrwmarkfilemtch_{bufnr("%")} != "" @@ -5830,7 +7054,8 @@ 2match none endif -" redraw! +" restore + let @@= ykeep " call Dret("NetrwRefresh") endfun @@ -5839,7 +7064,7 @@ " Called by NetrwMarkFileCopy() " Interfaces to s:NetrwRefresh() and s:LocalBrowseShellCmdRefresh() fun! s:NetrwRefreshDir(islocal,dirname) -" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) fastbrowse=".g:netrw_fastbrowse) +" call Dfunc("s:NetrwRefreshDir(islocal=".a:islocal." dirname<".a:dirname.">) g:netrw_fastbrowse=".g:netrw_fastbrowse) if g:netrw_fastbrowse == 0 " slowest mode (keep buffers refreshed, local or remote) " call Decho("slowest mode: keep buffers refreshed, local or remote") @@ -5851,18 +7076,18 @@ let curwin= winnr() " call Decho("refresh tgtwin#".tgtwin." (curwin#".curwin.")") exe tgtwin."wincmd w" - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) exe curwin."wincmd w" elseif bufnr(a:dirname) > 0 let bn= bufnr(a:dirname) " call Decho("bd bufnr(".a:dirname.")=".bn) - exe "silent bd ".bn + exe "sil bd ".bn endif elseif g:netrw_fastbrowse <= 1 " call Decho("medium-speed mode: refresh local buffers only") - call s:LocalBrowseShellCmdRefresh() + keepj call s:LocalBrowseShellCmdRefresh() endif " call Dret("s:NetrwRefreshDir") endfun @@ -5875,6 +7100,7 @@ " front. An "*" pattern handles the default priority. fun! s:NetrwSetSort() " call Dfunc("SetSort() bannercnt=".w:netrw_bannercnt) + let ykeep= @@ if w:netrw_liststyle == s:LONGLIST let seqlist = substitute(g:netrw_sort_sequence,'\$','\\%(\t\\|\$\\)','ge') else @@ -5918,13 +7144,13 @@ " sometimes multiple sorting patterns will match the same file or directory. " The following substitute is intended to remove the excess matches. exe 'sil keepj '.w:netrw_bannercnt.',$g/^\d\{3}'.g:netrw_sepchr.'\d\{3}\//s/^\d\{3}'.g:netrw_sepchr.'\(\d\{3}\/\).\@=/\1/e' - call histdel("/",-1) + keepj call histdel("/",-1) endif let priority = priority + 1 endwhile if exists("starpriority") exe 'sil keepj '.w:netrw_bannercnt.',$v/^\d\{3}'.g:netrw_sepchr.'/s/^/'.starpriority.'/' - call histdel("/",-1) + keepj call histdel("/",-1) endif " Following line associated with priority -- items that satisfy a priority @@ -5934,22 +7160,54 @@ " priority prefixes need to be removed, but not directories that happen to " be just digits themselves. exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\d\{3}'.g:netrw_sepchr.'\)\%(\d\{3}'.g:netrw_sepchr.'\)\+\ze./\1/e' - call histdel("/",-1) + keepj call histdel("/",-1) + let @@= ykeep " call Dret("SetSort") endfun +" --------------------------------------------------------------------- +" s:NetrwSetTgt: sets the target to the specified choice index {{{2 +" Implements [count]Tb (bookhist) +" [count]Th (bookhist) +" See :help netrw-qb for how to make the choice. +fun! s:NetrwSetTgt(bookhist,choice) +" call Dfunc("s:NetrwSetTgt(bookhist<".a:bookhist."> choice#".a:choice.")") + + if a:bookhist == 'b' + " supports choosing a bookmark as a target using a qb-generated list + let choice= a:choice - 1 + if exists("g:netrw_bookmarklist[".choice."]") + call netrw#NetrwMakeTgt(g:netrw_bookmarklist[choice]) + else + echomsg "Sorry, bookmark#".a:choice." doesn't exist!" + endif + + elseif a:bookhist == 'h' + " supports choosing a history stack entry as a target using a qb-generated list + let choice= (a:choice % g:netrw_dirhistmax) + 1 + if exists("g:netrw_dirhist_".choice) + let histentry = g:netrw_dirhist_{choice} + call netrw#NetrwMakeTgt(histentry) + else + echomsg "Sorry, history#".a:choice." not available!" + endif + endif + +" call Dret("s:NetrwSetTgt") +endfun + " ===================================================================== " s:NetrwSortStyle: change sorting style (name - time - size) and refresh display {{{2 fun! s:NetrwSortStyle(islocal) " call Dfunc("s:NetrwSortStyle(islocal=".a:islocal.") netrw_sort_by<".g:netrw_sort_by.">") - call s:NetrwSaveWordPosn() + keepj call s:NetrwSaveWordPosn() let svpos= netrw#NetrwSavePosn() let g:netrw_sort_by= (g:netrw_sort_by =~ 'n')? 'time' : (g:netrw_sort_by =~ 't')? 'size' : 'name' keepj norm! 0 - call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) - call netrw#NetrwRestorePosn(svpos) + keepj call s:NetrwRefresh(a:islocal,s:NetrwBrowseChgDir(a:islocal,'./')) + keepj call netrw#NetrwRestorePosn(svpos) " call Dret("s:NetrwSortStyle : netrw_sort_by<".g:netrw_sort_by.">") endfun @@ -5965,15 +7223,17 @@ fun! s:NetrwSplit(mode) " call Dfunc("s:NetrwSplit(mode=".a:mode.") alto=".g:netrw_alto." altv=".g:netrw_altv) + let ykeep= @@ call s:SaveWinVars() if a:mode == 0 " remote and o -" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s") - exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s" + let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize +" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s") + exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s" let s:didsplit= 1 - call s:RestoreWinVars() - call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) + keepj call s:RestoreWinVars() + keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) unlet s:didsplit elseif a:mode == 1 @@ -5982,26 +7242,28 @@ " call Decho("tabnew") tabnew let s:didsplit= 1 - call s:RestoreWinVars() - call s:NetrwBrowse(0,newdir) + keepj call s:RestoreWinVars() + keepj call s:NetrwBrowse(0,newdir) unlet s:didsplit elseif a:mode == 2 " remote and v -" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v") - exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v" + let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize +" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v") + exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v" let s:didsplit= 1 - call s:RestoreWinVars() - call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) + keepj call s:RestoreWinVars() + keepj call s:NetrwBrowse(0,s:NetrwBrowseChgDir(0,s:NetrwGetWord())) unlet s:didsplit elseif a:mode == 3 " local and o -" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s") - exe (g:netrw_alto? "bel " : "abo ").g:netrw_winsize."wincmd s" + let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winheight(0))/100 : -g:netrw_winsize +" call Decho("exe ".(g:netrw_alto? "bel " : "abo ").winsz."wincmd s") + exe (g:netrw_alto? "bel " : "abo ").winsz."wincmd s" let s:didsplit= 1 - call s:RestoreWinVars() - call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) + keepj call s:RestoreWinVars() + keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) unlet s:didsplit elseif a:mode == 4 @@ -6012,57 +7274,76 @@ tabnew let b:netrw_curdir= netrw_curdir let s:didsplit= 1 - call s:RestoreWinVars() - call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword)) + keepj call s:RestoreWinVars() + keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,cursorword)) unlet s:didsplit elseif a:mode == 5 " local and v -" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v") - exe (g:netrw_altv? "rightb " : "lefta ").g:netrw_winsize."wincmd v" + let winsz= (g:netrw_winsize > 0)? (g:netrw_winsize*winwidth(0))/100 : -g:netrw_winsize +" call Decho("exe ".(g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v") + exe (g:netrw_altv? "rightb " : "lefta ").winsz."wincmd v" let s:didsplit= 1 - call s:RestoreWinVars() - call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) + keepj call s:RestoreWinVars() + keepj call netrw#LocalBrowseCheck(s:NetrwBrowseChgDir(1,s:NetrwGetWord())) unlet s:didsplit else - call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45) + keepj call netrw#ErrorMsg(s:ERROR,"(NetrwSplit) unsupported mode=".a:mode,45) endif + let @@= ykeep " call Dret("s:NetrwSplit") endfun " --------------------------------------------------------------------- -" NetrwStatusLine: {{{2 -fun! NetrwStatusLine() +" s:NetrwTgtMenu: {{{2 +fun! s:NetrwTgtMenu() + if !exists("s:netrw_menucnt") + return + endif +" call Dfunc("s:NetrwTgtMenu()") -" vvv NetrwStatusLine() debugging vvv -" let g:stlmsg="" -" if !exists("w:netrw_explore_bufnr") -" let g:stlmsg="!X" -" elseif w:netrw_explore_bufnr != bufnr("%") -" let g:stlmsg="explore_bufnr!=".bufnr("%") -" endif -" if !exists("w:netrw_explore_line") -" let g:stlmsg=" !X" -" elseif w:netrw_explore_line != line(".") -" let g:stlmsg=" explore_line!={line(.)<".line(".").">" -" endif -" if !exists("w:netrw_explore_list") -" let g:stlmsg=" !X" -" endif -" ^^^ NetrwStatusLine() debugging ^^^ + " the following test assures that gvim is running, has menus available, and has menus enabled. + if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu + if exists("g:NetrwTopLvlMenu") +" call Decho("removing ".g:NetrwTopLvlMenu."Bookmarks menu item(s)") + exe 'sil! unmenu '.g:NetrwTopLvlMenu.'Targets' + endif + if !exists("s:netrw_initbookhist") + call s:NetrwBookHistRead() + endif - if !exists("w:netrw_explore_bufnr") || w:netrw_explore_bufnr != bufnr("%") || !exists("w:netrw_explore_line") || w:netrw_explore_line != line(".") || !exists("w:netrw_explore_list") - " restore user's status line - let &stl = s:netrw_users_stl - let &laststatus = s:netrw_users_ls - if exists("w:netrw_explore_bufnr")|unlet w:netrw_explore_bufnr|endif - if exists("w:netrw_explore_line") |unlet w:netrw_explore_line |endif - return "" - else - return "Match ".w:netrw_explore_mtchcnt." of ".w:netrw_explore_listlen + " target bookmarked places + if exists("g:netrw_bookmarklist") && g:netrw_bookmarklist != [] && g:netrw_dirhistmax > 0 +" call Decho("installing bookmarks as easy targets") + let cnt= 1 + for bmd in g:netrw_bookmarklist + let ebmd= escape(bmd,g:netrw_menu_escape) + " show bookmarks for goto menu +" call Decho("menu: Targets: ".bmd) + exe 'sil! menu '.g:NetrwMenuPriority.".19.1.".cnt." ".g:NetrwTopLvlMenu.'Targets.'.ebmd." :call netrw#NetrwMakeTgt('".bmd."')\" + let cnt= cnt + 1 + endfor + endif + + " target directory browsing history + if exists("g:netrw_dirhistmax") && g:netrw_dirhistmax > 0 +" call Decho("installing history as easy targets (histmax=".g:netrw_dirhistmax.")") + let histcnt = 1 + while histcnt <= g:netrw_dirhistmax + let priority = g:netrw_dirhist_cnt + histcnt + if exists("g:netrw_dirhist_{histcnt}") + let histentry = g:netrw_dirhist_{histcnt} + let ehistentry = escape(histentry,g:netrw_menu_escape) +" call Decho("menu: Targets: ".histentry) + exe 'sil! menu '.g:NetrwMenuPriority.".19.2.".priority." ".g:NetrwTopLvlMenu.'Targets.'.ehistentry." :call netrw#NetrwMakeTgt('".histentry."')\" + endif + let histcnt = histcnt + 1 + endwhile + endif endif +" call Dret("s:NetrwTgtMenu") endfun " --------------------------------------------------------------------- @@ -6072,12 +7353,12 @@ " call Dfunc("NetrwTreeDir() curline#".line(".")."<".getline('.')."> b:netrw_curdir<".b:netrw_curdir."> tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%").">") let treedir= b:netrw_curdir -" call Decho("set initial treedir<".treedir.">") +" call Decho("(NetrwTreeDir) set initial treedir<".treedir.">") let s:treecurpos= netrw#NetrwSavePosn() if w:netrw_liststyle == s:TREELIST -" call Decho("w:netrrw_liststyle is TREELIST:") -" call Decho("line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">") +" call Decho("(NetrwTreeDir) w:netrw_liststyle is TREELIST:") +" call Decho("(NetrwTreeDir) line#".line(".")." getline(.)<".getline('.')."> treecurpos<".string(s:treecurpos).">") " extract tree directory if on a line specifying a subdirectory (ie. ends with "/") if getline('.') =~ '/$' @@ -6085,13 +7366,13 @@ else let treedir= "" endif -" call Decho("treedir<".treedir.">") +" call Decho("(NetrwTreeDir) treedir<".treedir.">") " detect user attempting to close treeroot if getline('.') !~ '|' && getline('.') != '..' " call Decho("user attempted to close treeroot") " now force a refresh -" call Decho("clear buffer<".expand("%")."> with :%d") +" call Decho("(NetrwTreeDir) clear buffer<".expand("%")."> with :%d") sil! keepj %d " call Dret("NetrwTreeDir <".treedir."> : (side effect) s:treecurpos<".string(s:treecurpos).">") return b:netrw_curdir @@ -6099,26 +7380,26 @@ " elide all non-depth information let depth = substitute(getline('.'),'^\(\%(| \)*\)[^|].\{-}$','\1','e') -" call Decho("depth<".depth."> 1st subst (non-depth info removed)") +" call Decho("(NetrwTreeDir) depth<".depth."> 1st subst (non-depth info removed)") " elide first depth let depth = substitute(depth,'^| ','','') -" call Decho("depth<".depth."> 2nd subst (first depth removed)") +" call Decho("(NetrwTreeDir) depth<".depth."> 2nd subst (first depth removed)") " construct treedir by searching backwards at correct depth -" call Decho("constructing treedir<".treedir."> depth<".depth.">") +" call Decho("(NetrwTreeDir) constructing treedir<".treedir."> depth<".depth.">") while depth != "" && search('^'.depth.'[^|].\{-}/$','bW') let dirname= substitute(getline('.'),'^\(| \)*','','e') let treedir= dirname.treedir let depth = substitute(depth,'^| ','','') -" call Decho("constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">") +" call Decho("(NetrwTreeDir) constructing treedir<".treedir.">: dirname<".dirname."> while depth<".depth.">") endwhile if w:netrw_treetop =~ '/$' let treedir= w:netrw_treetop.treedir else let treedir= w:netrw_treetop.'/'.treedir endif -" call Decho("bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line(".")) +" call Decho("(NetrwTreeDir) bufnr(.)=".bufnr("%")." line($)=".line("$")." line(.)=".line(".")) endif let treedir= substitute(treedir,'//$','/','') @@ -6132,7 +7413,7 @@ " call Dfunc("NetrwTreeDisplay(dir<".a:dir."> depth<".a:depth.">)") " insure that there are no folds - setlocal nofen + setl nofen " install ../ and shortdir if a:depth == "" @@ -6167,10 +7448,10 @@ " call Decho("dir<".dir."> entry<".entry."> direntry<".direntry.">") if entry =~ '/$' && has_key(w:netrw_treedict,direntry) " call Decho("<".direntry."> is a key in treedict - display subtree for it") - call s:NetrwTreeDisplay(direntry,depth) + keepj call s:NetrwTreeDisplay(direntry,depth) elseif entry =~ '/$' && has_key(w:netrw_treedict,direntry.'/') " call Decho("<".direntry."/> is a key in treedict - display subtree for it") - call s:NetrwTreeDisplay(direntry.'/',depth) + keepj call s:NetrwTreeDisplay(direntry.'/',depth) else " call Decho("<".entry."> is not a key in treedict (no subtree)") sil! keepj call setline(line("$")+1,depth.entry) @@ -6219,9 +7500,10 @@ " call Decho("fname<".fname.">") " display from treetop on down - call s:NetrwTreeDisplay(w:netrw_treetop,"") + keepj call s:NetrwTreeDisplay(w:netrw_treetop,"") " call Dret("NetrwTreeListing : bufname<".expand("%").">") + return endif endfun @@ -6235,12 +7517,12 @@ " cpf: characters per filename " fpl: filenames per line " fpc: filenames per column - setlocal ma noro -" call Decho("setlocal ma noro") + setl ma noro +" call Decho("setl ma noro") let b:netrw_cpf= 0 if line("$") >= w:netrw_bannercnt exe 'sil keepj '.w:netrw_bannercnt.',$g/^./if virtcol("$") > b:netrw_cpf|let b:netrw_cpf= virtcol("$")|endif' - call histdel("/",-1) + keepj call histdel("/",-1) else " call Dret("NetrwWideListing") return @@ -6257,7 +7539,7 @@ " make wide display exe 'sil keepj '.w:netrw_bannercnt.',$s/^.*$/\=escape(printf("%-'.b:netrw_cpf.'s",submatch(0)),"\\")/' - call histdel("/",-1) + keepj call histdel("/",-1) let fpc = (line("$") - w:netrw_bannercnt + w:netrw_fpl)/w:netrw_fpl let newcolstart = w:netrw_bannercnt + fpc let newcolend = newcolstart + fpc - 1 @@ -6275,11 +7557,23 @@ exe "sil! keepj ".newcolstart.','.newcolend.'d' exe 'sil! keepj '.w:netrw_bannercnt endwhile - silent! let @*= keepregstar + sil! let @*= keepregstar exe "sil! keepj ".w:netrw_bannercnt.',$s/\s\+$//e' - call histdel("/",-1) - setlocal noma nomod ro + keepj call histdel("/",-1) + exe "nmap w /^\\\\|\\s\\s\\zs\\S/\" + exe "nmap b ?^\\\\|\\s\\s\\zs\\S?\" +" call Decho("NetrwWideListing) setl noma nomod ro") + setl noma nomod ro +" call Decho("(NetrwWideListing) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") " call Dret("NetrwWideListing") + return + else + if hasmapto("w","n") + sil! nunmap w + endif + if hasmapto("b","n") + sil! nunmap b + endif endif endfun @@ -6289,33 +7583,47 @@ fun! s:PerformListing(islocal) " call Dfunc("s:PerformListing(islocal=".a:islocal.") bufnr(%)=".bufnr("%")."<".bufname("%").">") - call s:NetrwSafeOptions() - setlocal noro ma -" call Decho("setlocal noro ma") + " set up syntax highlighting {{{3 +" call Decho("(PerformListing) set up syntax highlighting") + if has("syntax") + if !exists("g:syntax_on") || !g:syntax_on +" call Decho("(PerformListing) but g:syntax_on".(exists("g:syntax_on")? "=".g:syntax_on : "")) + setl ft= + elseif &ft != "netrw" + setl ft=netrw + endif + endif + + keepj call s:NetrwSafeOptions() + set noro ma +" call Decho("(PerformListing) setl noro ma bh=".&bh) " if exists("g:netrw_silent") && g:netrw_silent == 0 && &ch >= 1 " Decho -" call Decho("(netrw) Processing your browsing request...") +" call Decho("(PerformListing) (netrw) Processing your browsing request...") " endif " Decho " call Decho('w:netrw_liststyle='.(exists("w:netrw_liststyle")? w:netrw_liststyle : 'n/a')) if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST && exists("w:netrw_treedict") " force a refresh for tree listings -" call Decho("force refresh for treelisting: clear buffer<".expand("%")."> with :%d") +" call Decho("(PerformListing) force refresh for treelisting: clear buffer<".expand("%")."> with :%d") sil! keepj %d endif " save current directory on directory history list - call s:NetrwBookHistHandler(3,b:netrw_curdir) + keepj call s:NetrwBookHistHandler(3,b:netrw_curdir) " Set up the banner {{{3 if g:netrw_banner -" call Decho("set up banner") - keepj put ='\" ============================================================================' - keepj put ='\" Netrw Directory Listing (netrw '.g:loaded_netrw.')' - keepj put ='\" '.b:netrw_curdir - keepj 1d +" call Decho("(PerformListing) set up banner") + keepj call setline(1,'" ============================================================================') + keepj call setline(2,'" Netrw Directory Listing (netrw '.g:loaded_netrw.')') + if exists("g:netrw_bannerbackslash") && g:netrw_bannerbackslash + keepj call setline(3,'" '.substitute(b:netrw_curdir,'/','\\','g')) + else + keepj call setline(3,'" '.b:netrw_curdir) + endif let w:netrw_bannercnt= 3 - exe "sil! keepj ".w:netrw_bannercnt + keepj exe "sil! keepj ".w:netrw_bannercnt else keepj 1 let w:netrw_bannercnt= 1 @@ -6328,15 +7636,15 @@ " Sorted by... {{{3 if g:netrw_banner -" call Decho("handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">") +" call Decho("(PerformListing) handle specified sorting: g:netrw_sort_by<".g:netrw_sort_by.">") if g:netrw_sort_by =~ "^n" -" call Decho("directories will be sorted by name") +" call Decho("(PerformListing) directories will be sorted by name") " sorted by name keepj put ='\" Sorted by '.sortby keepj put ='\" Sort sequence: '.g:netrw_sort_sequence let w:netrw_bannercnt= w:netrw_bannercnt + 2 else -" call Decho("directories will be sorted by size or time") +" call Decho("(PerformListing) directories will be sorted by size or time") " sorted by size or date keepj put ='\" Sorted by '.sortby let w:netrw_bannercnt= w:netrw_bannercnt + 1 @@ -6347,7 +7655,7 @@ " show copy/move target, if any if g:netrw_banner if exists("s:netrwmftgt") && exists("s:netrwmftgt_islocal") -" call Decho("show copy/move target<".s:netrwmftgt.">") +" call Decho("(PerformListing) show copy/move target<".s:netrwmftgt.">") keepj put ='' if s:netrwmftgt_islocal sil! keepj call setline(line("."),'" Copy/Move Tgt: '.s:netrwmftgt.' (local)') @@ -6356,14 +7664,14 @@ endif let w:netrw_bannercnt= w:netrw_bannercnt + 1 else -" call Decho("s:netrwmftgt does not exist, don't make Copy/Move Tgt") +" call Decho("(PerformListing) s:netrwmftgt does not exist, don't make Copy/Move Tgt") endif exe "sil! keepj ".w:netrw_bannercnt endif " Hiding... -or- Showing... {{{3 if g:netrw_banner -" call Decho("handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)") +" call Decho("(PerformListing) handle hiding/showing (g:netrw_hide=".g:netrw_list_hide." g:netrw_list_hide<".g:netrw_list_hide.">)") if g:netrw_list_hide != "" && g:netrw_hide if g:netrw_hide == 1 keepj put ='\" Hiding: '.g:netrw_list_hide @@ -6382,43 +7690,38 @@ if g:netrw_banner let w:netrw_bannercnt= w:netrw_bannercnt + 1 exe "sil! keepj ".w:netrw_bannercnt -" call Decho("bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$")) - endif - - " set up syntax highlighting {{{3 -" call Decho("set up syntax highlighting") - if has("syntax") - setf netrw - if !exists("g:syntax_on") || !g:syntax_on - setlocal ft= - endif +" call Decho("(PerformListing) w:netrw_bannercnt=".w:netrw_bannercnt." (should index line just after banner) line($)=".line("$")) endif " get list of files -" call Decho("Get list of files - islocal=".a:islocal) +" call Decho("(PerformListing) Get list of files - islocal=".a:islocal) if a:islocal - call s:LocalListing() + keepj call s:LocalListing() else " remote - call s:NetrwRemoteListing() + keepj call s:NetrwRemoteListing() endif -" call Decho("g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)") " manipulate the directory listing (hide, sort) {{{3 + if !exists("w:netrw_bannercnt") + let w:netrw_bannercnt= 0 + endif +" call Decho("(PerformListing) g:netrw_banner=".g:netrw_banner." w:netrw_bannercnt=".w:netrw_bannercnt." (banner complete)") + if !g:netrw_banner || line("$") >= w:netrw_bannercnt -" call Decho("manipulate directory listing (hide)") -" call Decho("g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">") +" call Decho("(PerformListing) manipulate directory listing (hide)") +" call Decho("(PerformListing) g:netrw_hide=".g:netrw_hide." g:netrw_list_hide<".g:netrw_list_hide.">") if g:netrw_hide && g:netrw_list_hide != "" - call s:NetrwListHide() + keepj call s:NetrwListHide() endif if !g:netrw_banner || line("$") >= w:netrw_bannercnt -" call Decho("manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">") +" call Decho("(PerformListing) manipulate directory listing (sort) : g:netrw_sort_by<".g:netrw_sort_by.">") if g:netrw_sort_by =~ "^n" " sort by name - call s:NetrwSetSort() + keepj call s:NetrwSetSort() if !g:netrw_banner || w:netrw_bannercnt < line("$") -" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")") +" call Decho("(PerformListing) g:netrw_sort_direction=".g:netrw_sort_direction." (bannercnt=".w:netrw_bannercnt.")") if g:netrw_sort_direction =~ 'n' " normal direction sorting exe 'sil keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options @@ -6428,22 +7731,22 @@ endif endif " remove priority pattern prefix -" call Decho("remove priority pattern prefix") +" call Decho("(PerformListing) remove priority pattern prefix") exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{3}'.g:netrw_sepchr.'//e' - call histdel("/",-1) + keepj call histdel("/",-1) elseif a:islocal if !g:netrw_banner || w:netrw_bannercnt < line("$") -" call Decho("g:netrw_sort_direction=".g:netrw_sort_direction) +" call Decho("(PerformListing) g:netrw_sort_direction=".g:netrw_sort_direction) if g:netrw_sort_direction =~ 'n' -" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort') +" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort') exe 'sil! keepj '.w:netrw_bannercnt.',$sort'.' '.g:netrw_sort_options else -" call Decho('exe silent keepjumps '.w:netrw_bannercnt.',$sort!') +" call Decho('exe sil keepjumps '.w:netrw_bannercnt.',$sort!') exe 'sil! keepj '.w:netrw_bannercnt.',$sort!'.' '.g:netrw_sort_options endif exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{-}\///e' - call histdel("/",-1) + keepj call histdel("/",-1) endif endif @@ -6457,31 +7760,35 @@ endif " convert to wide/tree listing {{{3 -" call Decho("modify display if wide/tree listing style") - call s:NetrwWideListing() - call s:NetrwTreeListing(b:netrw_curdir) +" call Decho("(PerformListing) modify display if wide/tree listing style") + keepj call s:NetrwWideListing() + keepj call s:NetrwTreeListing(b:netrw_curdir) if exists("w:netrw_bannercnt") && (line("$") > w:netrw_bannercnt || !g:netrw_banner) " place cursor on the top-left corner of the file listing -" call Decho("place cursor on top-left corner of file listing") +" call Decho("(PerformListing) place cursor on top-left corner of file listing") exe 'sil! keepj '.w:netrw_bannercnt sil! keepj norm! 0 endif " record previous current directory let w:netrw_prvdir= b:netrw_curdir -" call Decho("record netrw_prvdir<".w:netrw_prvdir.">") +" call Decho("(PerformListing) record netrw_prvdir<".w:netrw_prvdir.">") " save certain window-oriented variables into buffer-oriented variables {{{3 - call s:SetBufWinVars() - call s:NetrwOptionRestore("w:") + keepj call s:SetBufWinVars() + keepj call s:NetrwOptionRestore("w:") " set display to netrw display settings -" call Decho("set display to netrw display settings (noma nomod etc)") +" call Decho("(PerformListing) set display to netrw display settings (".g:netrw_bufsettings.")") exe "setl ".g:netrw_bufsettings + if g:netrw_liststyle == s:LONGLIST +" call Decho("(PerformListing) exe setl ts=".(g:netrw_maxfilenamelen+1)) + exe "setl ts=".(g:netrw_maxfilenamelen+1) + endif if exists("s:treecurpos") - call netrw#NetrwRestorePosn(s:treecurpos) + keepj call netrw#NetrwRestorePosn(s:treecurpos) unlet s:treecurpos endif @@ -6524,7 +7831,7 @@ " insure that windows have a statusline " make sure statusline is displayed let &stl=a:statline - setlocal laststatus=2 + setl laststatus=2 " call Decho("stl=".&stl) redraw @@ -6541,10 +7848,18 @@ " call Dfunc("s:NetrwRemoteListing() b:netrw_curdir<".b:netrw_curdir.">)") call s:RemotePathAnalysis(b:netrw_curdir) +" call Decho("b:netrw_method#".(exists("b:netrw_method")? b:netrw_method : 'n/a')) +" call Decho("g:netrw_list_cmd<".(exists("g:netrw_list_cmd")? g:netrw_list_cmd : 'n/a').">") +" call Decho("ssh is ".(executable("ssh")? "" : "not ")."executable") +" call Decho("ftp is ".(executable("ftp")? "" : "not ")."executable") +" call Decho("sftp is ".(executable("sftp")? "" : "not ")."executable") " sanity check: if exists("b:netrw_method") && b:netrw_method =~ '[235]' -" call Decho("b:netrw_method=".b:netrw_method) + " b:netrw_method = 2: ftp+.netrc + " b:netrw_method = 3: ftp+machine,id,p/w,filename (ie. no .netrc) + " b:netrw_method = 5: wget (http) +" call Decho("b:netrw_method=".b:netrw_method." (for ".s:method.")") if !executable("ftp") if !exists("g:netrw_quiet") call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ftp",18) @@ -6554,30 +7869,31 @@ return endif - elseif !exists("g:netrw_list_cmd") || g:netrw_list_cmd == '' + elseif s:method == "scp" && (!exists("g:netrw_list_cmd") || g:netrw_list_cmd == '') +" call Decho("g:netrw_list_cmd<".(exists("g:netrw_list_cmd")? g:netrw_list_cmd : 'n/a').">") if !exists("g:netrw_quiet") - if g:netrw_list_cmd == "" - call netrw#ErrorMsg(s:ERROR,g:netrw_ssh_cmd." is not executable on your system",47) + if !exists("g:netrw_list_cmd") || g:netrw_list_cmd == "" + keepj call netrw#ErrorMsg(s:ERROR,"neither ssh nor ftp"." is executable on your system",47) else - call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19) + keepj call netrw#ErrorMsg(s:ERROR,"this system doesn't support remote directory listing via ".g:netrw_list_cmd,19) endif endif - call s:NetrwOptionRestore("w:") + keepj call s:NetrwOptionRestore("w:") " call Dret("s:NetrwRemoteListing") return endif " (remote handling sanity check) if exists("b:netrw_method") -" call Decho("setting w:netrw_method<".b:netrw_method.">") +" call Decho("setting w:netrw_method to b:netrw_method<".b:netrw_method.">") let w:netrw_method= b:netrw_method endif if s:method == "ftp" - " use ftp to get remote file listing + " use ftp to get remote file listing {{{3 " call Decho("use ftp to get remote file listing") - let s:method = "ftp" - let listcmd = g:netrw_ftp_list_cmd + let s:method = "ftp" + let listcmd = g:netrw_ftp_list_cmd if g:netrw_sort_by =~ '^t' let listcmd= g:netrw_ftp_timelist_cmd elseif g:netrw_sort_by =~ '^s' @@ -6595,19 +7911,19 @@ " cleanup if g:netrw_ftp_browse_reject != "" exe "sil! keepalt keepj g/".g:netrw_ftp_browse_reject."/keepj d" - call histdel("/",-1) + keepj call histdel("/",-1) endif sil! keepj %s/\r$//e - call histdel("/",-1) + keepj call histdel("/",-1) - " if there's no ../ listed, then put ./ and ../ in + " if there's no ../ listed, then put ../ in let line1= line(".") exe "sil! keepj ".w:netrw_bannercnt - let line2= search('^\.\.\/\%(\s\|$\)','cnW') + let line2= search('\.\.\/\%(\s\|$\)','cnW') +" call Decho("search(".'\.\.\/\%(\s\|$\)'."','cnW')=".line2." w:netrw_bannercnt=".w:netrw_bannercnt) if line2 == 0 -" call Decho("netrw is putting ./ and ../ into listing") +" call Decho("netrw is putting ../ into listing") sil! keepj put='../' - sil! keepj put='./' endif exe "sil! keepj ".line1 sil! keepj norm! 0 @@ -6616,15 +7932,15 @@ if search('^\d\{2}-\d\{2}-\d\{2}\s','n') " M$ ftp site cleanup " call Decho("M$ ftp cleanup") exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\d\{2}-\d\{2}-\d\{2}\s\+\d\+:\d\+[AaPp][Mm]\s\+\%(\|\d\+\)\s\+//' - call histdel("/",-1) + keepj call histdel("/",-1) else " normal ftp cleanup " call Decho("normal ftp cleanup") exe 'sil! keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2/e' exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*/$#/#e' exe "sil! keepj ".w:netrw_bannercnt.',$g/ -> /s# -> .*$#/#e' - call histdel("/",-1) - call histdel("/",-1) - call histdel("/",-1) + keepj call histdel("/",-1) + keepj call histdel("/",-1) + keepj call histdel("/",-1) endif endif @@ -6634,35 +7950,35 @@ let listcmd= s:MakeSshCmd(g:netrw_list_cmd) " call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)") if g:netrw_scp_cmd =~ '^pscp' -" call Decho("1: exe silent r! ".shellescape(listcmd.s:path, 1)) +" call Decho("1: exe sil r! ".shellescape(listcmd.s:path, 1)) exe "sil! keepj r! ".listcmd.shellescape(s:path, 1) " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like sil! keepj g/^Listing directory/keepj d sil! keepj g/^d[-rwx][-rwx][-rwx]/keepj s+$+/+e sil! keepj g/^l[-rwx][-rwx][-rwx]/keepj s+$+@+e - call histdel("/",-1) - call histdel("/",-1) - call histdel("/",-1) + keepj call histdel("/",-1) + keepj call histdel("/",-1) + keepj call histdel("/",-1) if g:netrw_liststyle != s:LONGLIST sil! keepj g/^[dlsp-][-rwx][-rwx][-rwx]/keepj s/^.*\s\(\S\+\)$/\1/e - call histdel("/",-1) + keepj call histdel("/",-1) endif else if s:path == "" -" call Decho("2: exe silent r! ".listcmd) - exe "sil! keepalt r! ".listcmd +" call Decho("2: exe sil r! ".listcmd) + exe "sil! keepj keepalt r! ".listcmd else -" call Decho("3: exe silent r! ".listcmd.' '.shellescape(s:path,1)) - exe "sil! keepalt r! ".listcmd.' '.shellescape(s:path,1) +" call Decho("3: exe sil r! ".listcmd.' '.shellescape(fnameescape(s:path),1)) + exe "sil! keepj keepalt r! ".listcmd.' '.shellescape(fnameescape(s:path),1) " call Decho("listcmd<".listcmd."> path<".s:path.">") endif endif " cleanup if g:netrw_ftp_browse_reject != "" -" call Decho("(cleanup) exe silent! g/".g:netrw_ssh_browse_reject."/keepjumps d") +" call Decho("(cleanup) exe sil! g/".g:netrw_ssh_browse_reject."/keepjumps d") exe "sil! g/".g:netrw_ssh_browse_reject."/keepj d" - call histdel("/",-1) + keepj call histdel("/",-1) endif endif @@ -6676,13 +7992,12 @@ while getline('.') =~ g:netrw_ftp_browse_reject sil! keepj d endwhile - " if there's no ../ listed, then put ./ and ../ in + " if there's no ../ listed, then put ../ in let line1= line(".") sil! keepj 1 sil! keepj call search('^\.\.\/\%(\s\|$\)','W') let line2= line(".") if line2 == 0 - exe 'sil! keepj '.w:netrw_bannercnt."put='./'" if b:netrw_curdir != '/' exe 'sil! keepj '.w:netrw_bannercnt."put='../'" endif @@ -6699,9 +8014,9 @@ exe 'sil keepj '.w:netrw_bannercnt.',$s/ -> .*$//e' exe 'sil keepj '.w:netrw_bannercnt.',$s/^\(\%(\S\+\s\+\)\{7}\S\+\)\s\+\(\S.*\)$/\2\t\1/e' exe 'sil keepj '.w:netrw_bannercnt - call histdel("/",-1) - call histdel("/",-1) - call histdel("/",-1) + keepj call histdel("/",-1) + keepj call histdel("/",-1) + keepj call histdel("/",-1) endif endif @@ -6741,7 +8056,7 @@ " remove multiple files and directories while ctr <= a:lastline - exe ctr + exe "keepj ".ctr let ok= s:NetrwRemoteRmFile(a:path,s:NetrwGetWord(),all) if ok =~ 'q\%[uit]' break @@ -6754,8 +8069,8 @@ " refresh the (remote) directory listing " call Decho("refresh remote directory listing") - call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) - call netrw#NetrwRestorePosn(svpos) + keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) + keepj call netrw#NetrwRestorePosn(svpos) " call Dret("s:NetrwRemoteRm") endfun @@ -6802,7 +8117,7 @@ let netrw_rm_cmd= s:MakeSshCmd(g:netrw_rm_cmd) " call Decho("netrw_rm_cmd<".netrw_rm_cmd.">") if !exists("b:netrw_curdir") - call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53) + keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53) let ok="q" else let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','') @@ -6817,14 +8132,13 @@ " call Decho("call system(".netrw_rm_cmd.")") let ret= system(netrw_rm_cmd) if ret != 0 - call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60) + keepj call netrw#ErrorMsg(s:WARNING,"cmd<".netrw_rm_cmd."> failed",60) endif " call Decho("returned=".ret." errcode=".v:shell_error) endif endif elseif ok =~ 'q\%[uit]' " call Decho("ok==".ok) - break endif else @@ -6845,7 +8159,7 @@ if all || ok =~ 'y\%[es]' || ok == "" if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3) - call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile) + keepj call s:NetrwRemoteFtpCmd(a:path,"rmdir ".a:rmfile) else let rmfile = substitute(a:path.a:rmfile,'/$','','') let netrw_rmdir_cmd = s:MakeSshCmd(netrw#WinPath(g:netrw_rmdir_cmd)).' '.shellescape(netrw#WinPath(rmfile)) @@ -6861,13 +8175,13 @@ " call Decho("returned=".ret." errcode=".v:shell_error) if v:shell_error != 0 && !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22) + keepj call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",22) endif endif endif elseif ok =~ 'q\%[uit]' - break +" call Decho("ok==".ok) endif endif @@ -6881,18 +8195,27 @@ " and reverse sorts will be requested of the server but not otherwise " enforced here. fun! s:NetrwRemoteFtpCmd(path,listcmd) -" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) netrw_method=".w:netrw_method) -" call Decho("line($)=".line("$")." bannercnt=".w:netrw_bannercnt) +" call Dfunc("NetrwRemoteFtpCmd(path<".a:path."> listcmd<".a:listcmd.">) w:netrw_method=".(exists("w:netrw_method")? w:netrw_method : (exists("b:netrw_method")? b:netrw_method : "???"))) +" call Decho("line($)=".line("$")." w:netrw_bannercnt=".w:netrw_bannercnt) + if !exists("w:netrw_method") + if exists("b:netrw_method") + let w:netrw_method= b:netrw_method + else + call netrw#ErrorMsg(2,"(s:NetrwRemoteFtpCmd) internal netrw error",93) +" call Dret("NetrwRemoteFtpCmd") + return + endif + endif " because WinXX ftp uses unix style input let ffkeep= &ff - setlocal ma ff=unix noro -" call Decho("setlocal ma ff=unix noro") + setl ma ff=unix noro +" call Decho("setl ma ff=unix noro") " clear off any older non-banner lines " note that w:netrw_bannercnt indexes the line after the banner -" call Decho('exe silent! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)") - exe "silent! keepjumps ".w:netrw_bannercnt.",$d" +" call Decho('exe sil! keepjumps '.w:netrw_bannercnt.",$d (clear off old non-banner lines)") + exe "sil! keepjumps ".w:netrw_bannercnt.",$d" "......................................... if w:netrw_method == 2 || w:netrw_method == 5 @@ -6904,31 +8227,41 @@ keepj put =g:netrw_ftpextracmd " call Decho("filter input: ".getline('.')) endif - call setline(line("$")+1,a:listcmd) + keepj call setline(line("$")+1,a:listcmd) " exe "keepjumps ".w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))' if exists("g:netrw_port") && g:netrw_port != "" -" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) - exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) +" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1)) + exe s:netrw_silentxfer." keepj ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1) else -" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) - exe s:netrw_silentxfer." keepjumps ".w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) +" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1)) + exe s:netrw_silentxfer." keepj ".w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." -i ".shellescape(g:netrw_machine,1) endif "......................................... elseif w:netrw_method == 3 " ftp + machine,id,passwd,filename: Method #3 - setlocal ff=unix + setl ff=unix if exists("g:netrw_port") && g:netrw_port != "" keepj put ='open '.g:netrw_machine.' '.g:netrw_port else keepj put ='open '.g:netrw_machine endif - if exists("g:netrw_ftp") && g:netrw_ftp == 1 - keepj put =g:netrw_uid - keepj put ='\"'.s:netrw_passwd.'\"' - else - keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' + " handle userid and password + let host= substitute(g:netrw_machine,'\..*$','','') +" call Decho("host<".host.">") + if exists("s:netrw_hup") && exists("s:netrw_hup[host]") + call NetUserPass("ftp:".host) + endif + if exists("g:netrw_uid") && g:netrw_uid != "" + if exists("g:netrw_ftp") && g:netrw_ftp == 1 + keepj put =g:netrw_uid + if exists("s:netrw_passwd") && s:netrw_passwd != "" + keepj put ='\"'.s:netrw_passwd.'\"' + endif + elseif exists("s:netrw_passwd") + keepj put ='user \"'.g:netrw_uid.'\" \"'.s:netrw_passwd.'\"' + endif endif if a:path != "" @@ -6945,28 +8278,28 @@ " -n unix : DON'T use <.netrc>, even though it exists " -n win32: quit being obnoxious about password " exe w:netrw_bannercnt.',$g/^./call Decho("ftp#".line(".").": ".getline("."))' -" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n") - exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".g:netrw_ftp_cmd." -i -n" +" call Decho("exe ".s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options) + exe s:netrw_silentxfer.w:netrw_bannercnt.",$!".s:netrw_ftp_cmd." ".g:netrw_ftp_options "......................................... else - call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23) + keepj call netrw#ErrorMsg(s:WARNING,"unable to comply with your request<" . choice . ">",23) endif " cleanup for Windows if has("win32") || has("win95") || has("win64") || has("win16") sil! keepj %s/\r$//e - call histdel("/",-1) + keepj call histdel("/",-1) endif if a:listcmd == "dir" " infer directory/link based on the file permission string sil! keepj g/d\%([-r][-w][-x]\)\{3}/keepj s@$@/@ sil! keepj g/l\%([-r][-w][-x]\)\{3}/keepj s/$/@/ - call histdel("/",-1) - call histdel("/",-1) + keepj call histdel("/",-1) + keepj call histdel("/",-1) if w:netrw_liststyle == s:THINLIST || w:netrw_liststyle == s:WIDELIST || w:netrw_liststyle == s:TREELIST exe "sil! keepj ".w:netrw_bannercnt.',$s/^\%(\S\+\s\+\)\{8}//e' - call histdel("/",-1) + keepj call histdel("/",-1) endif endif @@ -7015,7 +8348,7 @@ endif if exists("w:netrw_method") && (w:netrw_method == 2 || w:netrw_method == 3) - call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname) + keepj call s:NetrwRemoteFtpCmd(a:path,"rename ".oldname." ".newname) else let oldname= shellescape(a:path.oldname) let newname= shellescape(a:path.newname) @@ -7053,17 +8386,67 @@ endif " refresh the directory - call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) - call netrw#NetrwRestorePosn(svpos) + keepj call s:NetrwRefresh(0,s:NetrwBrowseChgDir(0,'./')) + keepj call netrw#NetrwRestorePosn(svpos) " call Dret("NetrwRemoteRename") endfun " --------------------------------------------------------------------- -" Local Directory Browsing Support: {{{1 -" ========================================== - -" --------------------------------------------------------------------- +" Local Directory Browsing Support: {{{1 +" ========================================== + +" --------------------------------------------------------------------- +" netrw#FileUrlRead: handles reading file://* files {{{2 +" Should accept: file://localhost/etc/fstab +" file:///etc/fstab +" file:///c:/WINDOWS/clock.avi +" file:///c|/WINDOWS/clock.avi +" file://localhost/c:/WINDOWS/clock.avi +" file://localhost/c|/WINDOWS/clock.avi +" file://c:/foo.txt +" file:///c:/foo.txt +" and %XX (where X is [0-9a-fA-F] is converted into a character with the given hexadecimal value +fun! netrw#FileUrlRead(fname) +" call Dfunc("netrw#FileUrlRead(fname<".a:fname.">)") + let fname = a:fname + if fname =~ '^file://localhost/' +" call Decho('converting file://localhost/ -to- file:///') + let fname= substitute(fname,'^file://localhost/','file:///','') +" call Decho("fname<".fname.">") + endif + if (has("win32") || has("win95") || has("win64") || has("win16")) + if fname =~ '^file:///\=\a[|:]/' +" call Decho('converting file:///\a|/ -to- file://\a:/') + let fname = substitute(fname,'^file:///\=\(\a\)[|:]/','file://\1:/','') +" call Decho("fname<".fname.">") + endif + endif + let fname2396 = netrw#RFC2396(fname) + let fname2396e= fnameescape(fname2396) + let plainfname= substitute(fname2396,'file://\(.*\)','\1',"") + if (has("win32") || has("win95") || has("win64") || has("win16")) +" call Decho("windows exception for plainfname") + if plainfname =~ '^/\+\a:' +" call Decho('removing leading "/"s') + let plainfname= substitute(plainfname,'^/\+\(\a:\)','\1','') + endif + endif +" call Decho("fname2396<".fname2396.">") +" call Decho("plainfname<".plainfname.">") + exe "sil doau BufReadPre ".fname2396e + exe 'keepj r '.plainfname + exe 'sil! bdelete '.plainfname + exe 'keepalt file! '.plainfname + keepj 1d +" call Decho("(FileUrlRead) setl nomod") + setl nomod +" call Decho("(FileUrlRead) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") +" call Dret("netrw#FileUrlRead") + exe "sil doau BufReadPost ".fname2396e +endfun + +" --------------------------------------------------------------------- " netrw#LocalBrowseCheck: {{{2 fun! netrw#LocalBrowseCheck(dirname) " unfortunate interaction -- split window debugging can't be @@ -7073,18 +8456,38 @@ " The &ft == "netrw" test was installed because the BufEnter event " would hit when re-entering netrw windows, creating unexpected " refreshes (and would do so in the middle of NetrwSaveOptions(), too) -" call Decho("netrw#LocalBrowseCheck: isdir<".a:dirname.">=".isdirectory(a:dirname).((exists("s:treeforceredraw")? " treeforceredraw" : ""))) +" call Decho("(LocalBrowseCheck) isdir<".a:dirname.">=".isdirectory(a:dirname).((exists("s:treeforceredraw")? " treeforceredraw" : ""))) +" call Dredir("LocalBrowseCheck","ls!")|redraw!|sleep 3 + let ykeep= @@ if isdirectory(a:dirname) -" call Decho(" ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$")) - if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname) - silent! call s:NetrwBrowse(1,a:dirname) +" call Decho("(LocalBrowseCheck) is-directory ft<".&ft."> b:netrw_curdir<".(exists("b:netrw_curdir")? b:netrw_curdir : " doesn't exist")."> dirname<".a:dirname.">"." line($)=".line("$")." ft<".&ft."> g:netrw_fastbrowse=".g:netrw_fastbrowse) + let svposn= netrw#NetrwSavePosn() + if &ft != "netrw" || (exists("b:netrw_curdir") && b:netrw_curdir != a:dirname) || g:netrw_fastbrowse <= 1 + sil! keepj keepalt call s:NetrwBrowse(1,a:dirname) + keepalt call netrw#NetrwRestorePosn(svposn) elseif &ft == "netrw" && line("$") == 1 - silent! call s:NetrwBrowse(1,a:dirname) + sil! keepj keepalt call s:NetrwBrowse(1,a:dirname) + keepalt call netrw#NetrwRestorePosn(svposn) elseif exists("s:treeforceredraw") unlet s:treeforceredraw - silent! call s:NetrwBrowse(1,a:dirname) + sil! keepj keepalt call s:NetrwBrowse(1,a:dirname) + keepalt call netrw#NetrwRestorePosn(svposn) endif endif + " following code wipes out currently unused netrw buffers + " IF g:netrw_fastbrowse is zero (ie. slow browsing selected) + " AND IF the listing style is not a tree listing + if exists("g:netrw_fastbrowse") && g:netrw_fastbrowse == 0 && g:netrw_liststyle != s:TREELIST + let ibuf = 1 + let buflast = bufnr("$") + while ibuf <= buflast + if bufwinnr(ibuf) == -1 && isdirectory(bufname(ibuf)) + exe "sil! keepalt ".ibuf."bw!" + endif + let ibuf= ibuf + 1 + endwhile + endif + let @@= ykeep " not a directory, ignore it endfun @@ -7092,101 +8495,68 @@ " s:LocalListing: does the job of "ls" for local directories {{{2 fun! s:LocalListing() " call Dfunc("s:LocalListing()") -" call Decho("&ma=".&ma) -" call Decho("&mod=".&mod) -" call Decho("&ro=".&ro) -" call Decho("bufname(%)<".bufname("%").">") +" call Decho("(LocalListing) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") +" call Decho("(LocalListing) tab#".tabpagenr()." win#".winnr()." buf#".bufnr("%")."<".bufname("%")."> modified=".&modified." modifiable=".&modifiable." readonly=".&readonly) -" if exists("b:netrw_curdir") |call Decho('b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("b:netrw_curdir doesn't exist") |endif -" if exists("g:netrw_sort_by")|call Decho('g:netrw_sort_by<'.g:netrw_sort_by.">")|else|call Decho("g:netrw_sort_by doesn't exist")|endif +" if exists("b:netrw_curdir") |call Decho('(LocalListing) b:netrw_curdir<'.b:netrw_curdir.">") |else|call Decho("(LocalListing) b:netrw_curdir doesn't exist") |endif +" if exists("g:netrw_sort_by")|call Decho('(LocalListing) g:netrw_sort_by<'.g:netrw_sort_by.">")|else|call Decho("(LocalListing) g:netrw_sort_by doesn't exist")|endif " get the list of files contained in the current directory - let dirname = escape(b:netrw_curdir,g:netrw_glob_escape) + let dirname = b:netrw_curdir let dirnamelen = s:Strlen(b:netrw_curdir) - let filelist = glob(s:ComposePath(dirname,"*")) -" call Decho("glob(dirname<".dirname."/*>)=".filelist) - if filelist != "" - let filelist= filelist."\n" - endif - let filelist= filelist.glob(s:ComposePath(dirname,".*")) -" call Decho("glob(dirname<".dirname."/.*>)=".filelist) - - " Coding choice: either elide ./ if present - " or include ./ if not present - if filelist =~ '[\\/]\.[\\/]\=\(\n\|$\)' - " elide /path/. from glob() entries if present -" call Decho("elide /path/. from glob entries if present") - let filelist = substitute(filelist,'\n','\t','g') - let filelist = substitute(filelist,'^[^\t]\+[/\\]\.\t','','') - let filelist = substitute(filelist,'[^\t]\+[/\\]\.$','','') - let filelist = substitute(filelist,'\t\zs[^\t]\+[/\\]\.\t','','') - let filelist = substitute(filelist,'\t','\n','g') - endif -" call Decho("filelist<".filelist.">") - if filelist !~ '[\\/]\.\.[\\/]\=\(\n\|$\)' + let filelist = glob(s:ComposePath(dirname,"*"),0,1) + let filelist = filelist + glob(s:ComposePath(dirname,".*"),0,1) +" call Decho("(LocalListing) filelist=".filelist) + + if g:netrw_cygwin == 0 && (has("win32") || has("win95") || has("win64") || has("win16")) +" call Decho("(LocalListing) filelist=".string(filelist)) + elseif index(filelist,'..') == -1 && b:netrw_curdir !~ '/' " include ../ in the glob() entry if its missing -" call Decho("forcibly tacking on ..") - let filelist= filelist."\n".s:ComposePath(b:netrw_curdir,"../") -" call Decho("filelist<".filelist.">") - endif - if b:netrw_curdir == '/' - " remove .. from filelist when current directory is root directory -" call Decho("remove .. from filelist") - let filelist= substitute(filelist,'/\.\.\n','','') +" call Decho("(LocalListing) forcibly including on \"..\"") + let filelist= filelist+[s:ComposePath(b:netrw_curdir,"../")] +" call Decho("(LocalListing) filelist=".string(filelist)) + endif + +" call Decho("(LocalListing) (before while) dirname<".dirname.">") +" call Decho("(LocalListing) (before while) dirnamelen<".dirnamelen.">") +" call Decho("(LocalListing) (before while) filelist=".string(filelist)) + + if get(g:, 'netrw_dynamic_maxfilenamelen', 0) + let filelistcopy = map(deepcopy(filelist),'fnamemodify(v:val, ":t")') + let g:netrw_maxfilenamelen = max(map(filelistcopy,'len(v:val)')) + 1 +" call Decho("(LocalListing) dynamic_maxfilenamelen: filenames =".string(filelistcopy)) +" call Decho("(LocalListing) dynamic_maxfilenamelen: g:netrw_maxfilenamelen=".g:netrw_maxfilenamelen) endif - " remove multiple contiguous newlines - let filelist= substitute(filelist,'\n\{2,}','\n','ge') - if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16")) - " change all \s to /s -" call Decho('change all \s to /s') - let filelist= substitute(filelist,'\','/','g') - else - " escape all \s to \\ -" call Decho('escape all \s to \\') - let filelist= substitute(filelist,'\','\\','g') - endif - -" call Decho("(before while) dirname<".dirname.">") -" call Decho("(before while) dirnamelen<".dirnamelen.">") -" call Decho("(before while) filelist<".filelist.">") - - while filelist != "" - if filelist =~ '\n' - let filename = substitute(filelist,'\n.*$','','e') - let filelist = substitute(filelist,'^.\{-}\n\(.*\)$','\1','e') - else - let filename = filelist - let filelist = "" - endif -" call Decho(" ") -" call Decho("(while) filelist<".filelist.">") -" call Decho("(while) filename<".filename.">") + + for filename in filelist +" call Decho("(LocalListing) ") +" call Decho("(LocalListing) (while) filename<".filename.">") if getftype(filename) == "link" " indicate a symbolic link -" call Decho("indicate <".filename."> is a symbolic link with trailing @") +" call Decho("(LocalListing) indicate <".filename."> is a symbolic link with trailing @") let pfile= filename."@" elseif getftype(filename) == "socket" " indicate a socket -" call Decho("indicate <".filename."> is a socket with trailing =") +" call Decho("(LocalListing) indicate <".filename."> is a socket with trailing =") let pfile= filename."=" elseif getftype(filename) == "fifo" " indicate a fifo -" call Decho("indicate <".filename."> is a fifo with trailing |") +" call Decho("(LocalListing) indicate <".filename."> is a fifo with trailing |") let pfile= filename."|" elseif isdirectory(filename) " indicate a directory -" call Decho("indicate <".filename."> is a directory with trailing /") +" call Decho("(LocalListing) indicate <".filename."> is a directory with trailing /") let pfile= filename."/" elseif exists("b:netrw_curdir") && b:netrw_curdir !~ '^.*://' && !isdirectory(filename) if (has("win32") || has("win95") || has("win64") || has("win16")) if filename =~ '\.[eE][xX][eE]$' || filename =~ '\.[cC][oO][mM]$' || filename =~ '\.[bB][aA][tT]$' " indicate an executable -" call Decho("indicate <".filename."> is executable with trailing *") +" call Decho("(LocalListing) indicate <".filename."> is executable with trailing *") let pfile= filename."*" else " normal file @@ -7194,7 +8564,7 @@ endif elseif executable(filename) " indicate an executable -" call Decho("indicate <".filename."> is executable with trailing *") +" call Decho("(LocalListing) indicate <".filename."> is executable with trailing *") let pfile= filename."*" else " normal file @@ -7205,55 +8575,55 @@ " normal file let pfile= filename endif -" call Decho("pfile<".pfile."> (after *@/ appending)") +" call Decho("(LocalListing) pfile<".pfile."> (after *@/ appending)") if pfile =~ '//$' let pfile= substitute(pfile,'//$','/','e') -" call Decho("change // to /: pfile<".pfile.">") +" call Decho("(LocalListing) change // to /: pfile<".pfile.">") endif let pfile= strpart(pfile,dirnamelen) let pfile= substitute(pfile,'^[/\\]','','e') -" call Decho("filename<".filename.">") -" call Decho("pfile <".pfile.">") +" call Decho("(LocalListing) filename<".filename.">") +" call Decho("(LocalListing) pfile <".pfile.">") if w:netrw_liststyle == s:LONGLIST let sz = getfsize(filename) let fsz = strpart(" ",1,15-strlen(sz)).sz let pfile= pfile."\t".fsz." ".strftime(g:netrw_timefmt,getftime(filename)) -" call Decho("sz=".sz." fsz=".fsz) +" call Decho("(LocalListing) sz=".sz." fsz=".fsz) endif if g:netrw_sort_by =~ "^t" " sort by time (handles time up to 1 quintillion seconds, US) -" call Decho("getftime(".filename.")=".getftime(filename)) +" call Decho("(LocalListing) getftime(".filename.")=".getftime(filename)) let t = getftime(filename) let ft = strpart("000000000000000000",1,18-strlen(t)).t -" call Decho("exe keepjumps put ='".ft.'/'.filename."'") +" call Decho("(LocalListing) exe keepjumps put ='".ft.'/'.filename."'") let ftpfile= ft.'/'.pfile sil! keepj put=ftpfile elseif g:netrw_sort_by =~ "^s" " sort by size (handles file sizes up to 1 quintillion bytes, US) -" call Decho("getfsize(".filename.")=".getfsize(filename)) +" call Decho("(LocalListing) getfsize(".filename.")=".getfsize(filename)) let sz = getfsize(filename) let fsz = strpart("000000000000000000",1,18-strlen(sz)).sz -" call Decho("exe keepjumps put ='".fsz.'/'.filename."'") +" call Decho("(LocalListing) exe keepj put ='".fsz.'/'.filename."'") let fszpfile= fsz.'/'.pfile sil! keepj put =fszpfile else " sort by name -" call Decho("exe keepjumps put ='".pfile."'") +" call Decho("(LocalListing) exe keepjumps put ='".pfile."'") sil! keepj put=pfile endif - endwhile + endfor " cleanup any windows mess at end-of-line sil! keepj g/^$/d sil! keepj %s/\r$//e call histdel("/",-1) - exe "setlocal ts=".g:netrw_maxfilenamelen -" call Decho("setlocal ts=".g:netrw_maxfilenamelen) +" call Decho("(LocalListing) exe setl ts=".(g:netrw_maxfilenamelen+1)) + exe "setl ts=".(g:netrw_maxfilenamelen+1) " call Dret("s:LocalListing") endfun @@ -7284,47 +8654,214 @@ endif let itab = 1 let buftablist = [] + let ykeep = @@ while itab <= tabpagenr("$") let buftablist = buftablist + tabpagebuflist() let itab = itab + 1 tabn endwhile -" call Decho("buftablist".string(buftablist)) -" call Decho("s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">") +" call Decho("(LocalBrowseShellCmdRefresh) buftablist".string(buftablist)) +" call Decho("(LocalBrowseShellCmdRefresh) s:netrw_browselist<".(exists("s:netrw_browselist")? string(s:netrw_browselist) : "").">") " GO through all buffers on netrw_browselist (ie. just local-netrw buffers): " | refresh any netrw window " | wipe out any non-displaying netrw buffer let curwin = winnr() let ibl = 0 for ibuf in s:netrw_browselist -" call Decho("bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf)) +" call Decho("(LocalBrowseShellCmdRefresh) bufwinnr(".ibuf.") index(buftablist,".ibuf.")=".index(buftablist,ibuf)) if bufwinnr(ibuf) == -1 && index(buftablist,ibuf) == -1 " wipe out any non-displaying netrw buffer -" call Decho("wiping buf#".ibuf,"<".bufname(ibuf).">") +" call Decho("(LocalBrowseShellCmdRefresh) wiping buf#".ibuf,"<".bufname(ibuf).">") exe "sil! bd ".fnameescape(ibuf) call remove(s:netrw_browselist,ibl) -" call Decho("browselist=".string(s:netrw_browselist)) +" call Decho("(LocalBrowseShellCmdRefresh) browselist=".string(s:netrw_browselist)) continue elseif index(tabpagebuflist(),ibuf) != -1 " refresh any netrw buffer -" call Decho("refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf)) +" call Decho("(LocalBrowseShellCmdRefresh) refresh buf#".ibuf.'-> win#'.bufwinnr(ibuf)) exe bufwinnr(ibuf)."wincmd w" - call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) + keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) endif let ibl= ibl + 1 endfor exe curwin."wincmd w" + let @@= ykeep " call Dret("LocalBrowseShellCmdRefresh") endfun " --------------------------------------------------------------------- +" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2 +" +" g:netrw_ Directory Is +" fastbrowse Local Remote +" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow) +" med 1 D H H=Hiding a buffer implies it may be re-used (fast) +" fast 2 H H +" +" Deleting a buffer means that it will be re-loaded when examined, hence "slow". +" Hiding a buffer means that it will be re-used when examined, hence "fast". +" (re-using a buffer may not be as accurate) +fun! s:LocalFastBrowser() +" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse." s:netrw_browser_shellcmd ".(exists("s:netrw_browser_shellcmd")? "exists" : "does not exist")) + + " initialize browselist, a list of buffer numbers that the local browser has used + if !exists("s:netrw_browselist") +" call Decho("(LocalFastBrowser) initialize s:netrw_browselist") + let s:netrw_browselist= [] + endif + + " append current buffer to fastbrowse list + if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1] +" call Decho("(LocalFastBrowser) appendng current buffer to browselist") + call add(s:netrw_browselist,bufnr("%")) +" call Decho("(LocalFastBrowser) browselist=".string(s:netrw_browselist)) + endif + + " enable autocmd events to handle refreshing/removing local browser buffers + " If local browse buffer is currently showing: refresh it + " If local browse buffer is currently hidden : wipe it + " g:netrw_fastbrowse=0 : slow speed, never re-use directory listing + " =1 : medium speed, re-use directory listing for remote only + " =2 : fast speed, always re-use directory listing when possible + if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1 +" call Decho("(LocalFastBrowser) setting up local-browser shell command refresh") + let s:netrw_browser_shellcmd= 1 + augroup AuNetrwShellCmd + au! + if (has("win32") || has("win95") || has("win64") || has("win16")) +" call Decho("(LocalFastBrowser) autocmd: ShellCmdPost * call s:LocalBrowseShellCmdRefresh()") + au ShellCmdPost * call s:LocalBrowseShellCmdRefresh() + else + au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh() +" call Decho("(LocalFastBrowser) autocmd: ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()") + endif + augroup END + endif + + " user must have changed fastbrowse to its fast setting, so remove + " the associated autocmd events + if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd") +" call Decho("(LocalFastBrowser) remove AuNetrwShellCmd autcmd group") + unlet s:netrw_browser_shellcmd + augroup AuNetrwShellCmd + au! + augroup END + augroup! AuNetrwShellCmd + endif + +" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">") +endfun + +" --------------------------------------------------------------------- +" s:NetrwLocalExecute: uses system() to execute command under cursor ("X" command support) {{{2 +fun! s:NetrwLocalExecute(cmd) +" call Dfunc("s:NetrwLocalExecute(cmd<".a:cmd.">)") + let ykeep= @@ + " sanity check + if !executable(a:cmd) + call netrw#ErrorMsg(s:ERROR,"the file<".a:cmd."> is not executable!",89) + let @@= ykeep +" call Dret("s:NetrwLocalExecute") + return + endif + + let optargs= input(":!".a:cmd,"","file") +" call Decho("optargs<".optargs.">") + let result= system(a:cmd.optargs) +" call Decho(result) + + " strip any ansi escape sequences off + let result = substitute(result,"\e\\[[0-9;]*m","","g") + + " show user the result(s) + echomsg result + let @@= ykeep + +" call Dret("s:NetrwLocalExecute") +endfun + +" --------------------------------------------------------------------- +" s:NetrwLocalRename: rename a remote file or directory {{{2 +fun! s:NetrwLocalRename(path) range +" call Dfunc("NetrwLocalRename(path<".a:path.">)") + + " preparation for removing multiple files/directories + let ykeep = @@ + let ctr = a:firstline + let svpos = netrw#NetrwSavePosn() + + " rename files given by the markfilelist + if exists("s:netrwmarkfilelist_{bufnr('%')}") + for oldname in s:netrwmarkfilelist_{bufnr("%")} +" call Decho("oldname<".oldname.">") + if exists("subfrom") + let newname= substitute(oldname,subfrom,subto,'') +" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") + else + call inputsave() + let newname= input("Moving ".oldname." to : ",oldname) + call inputrestore() + if newname =~ '^s/' + let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','') + let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','') +" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") + let newname = substitute(oldname,subfrom,subto,'') + endif + endif + call rename(oldname,newname) + endfor + call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir) + + else + + " attempt to rename files/directories + while ctr <= a:lastline + exe "keepj ".ctr + + " sanity checks + if line(".") < w:netrw_bannercnt + let ctr= ctr + 1 + continue + endif + let curword= s:NetrwGetWord() + if curword == "./" || curword == "../" + let ctr= ctr + 1 + continue + endif + + keepj norm! 0 + let oldname= s:ComposePath(a:path,curword) +" call Decho("oldname<".oldname.">") + + call inputsave() + let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e')) + call inputrestore() + + call rename(oldname,newname) +" call Decho("renaming <".oldname."> to <".newname.">") + + let ctr= ctr + 1 + endwhile + endif + + " refresh the directory +" call Decho("refresh the directory listing") + keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) + keepj call netrw#NetrwRestorePosn(svpos) + let @@= ykeep + +" call Dret("NetrwLocalRename") +endfun + +" --------------------------------------------------------------------- " s:NetrwLocalRm: {{{2 fun! s:NetrwLocalRm(path) range " call Dfunc("s:NetrwLocalRm(path<".a:path.">)") " call Decho("firstline=".a:firstline." lastline=".a:lastline) " preparation for removing multiple files/directories + let ykeep = @@ let ret = 0 let all = 0 let svpos = netrw#NetrwSavePosn() @@ -7373,9 +8910,10 @@ " refresh the directory " call Decho("bufname<".bufname("%").">") if bufname("%") != "NetrwMessage" - call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) - call netrw#NetrwRestorePosn(svpos) + keepj call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) + keepj call netrw#NetrwRestorePosn(svpos) endif + let @@= ykeep " call Dret("s:NetrwLocalRm") endfun @@ -7396,281 +8934,96 @@ " attempt to remove file " call Decho("attempt to remove file<".rmfile.">") if !all - echohl Statement - call inputsave() - let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") - call inputrestore() - echohl NONE - if ok == "" - let ok="no" - endif -" call Decho("response: ok<".ok.">") - let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') -" call Decho("response: ok<".ok."> (after sub)") - if ok =~ 'a\%[ll]' - let all= 1 - endif - endif - - if all || ok =~ 'y\%[es]' || ok == "" - let ret= s:NetrwDelete(rmfile) -" call Decho("errcode=".v:shell_error." ret=".ret) - endif - - else - " attempt to remove directory - if !all - echohl Statement - call inputsave() - let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") - call inputrestore() - let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') - if ok == "" - let ok="no" - endif - if ok =~ 'a\%[ll]' - let all= 1 - endif - endif - let rmfile= substitute(rmfile,'[\/]$','','e') - - if all || ok =~ 'y\%[es]' || ok == "" -" call Decho("1st attempt: system(netrw#WinPath(".g:netrw_local_rmdir.') '.shellescape(rmfile).')') - call system(netrw#WinPath(g:netrw_local_rmdir).' '.shellescape(rmfile)) -" call Decho("v:shell_error=".v:shell_error) - - if v:shell_error != 0 -" call Decho("2nd attempt to remove directory<".rmfile.">") - let errcode= s:NetrwDelete(rmfile) -" call Decho("errcode=".errcode) - - if errcode != 0 - if has("unix") -" call Decho("3rd attempt to remove directory<".rmfile.">") - call system("rm ".shellescape(rmfile)) - if v:shell_error != 0 && !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34) - let ok="no" - endif - elseif !exists("g:netrw_quiet") - call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35) - let ok="no" - endif - endif - endif - endif - endif - -" call Dret("s:NetrwLocalRmFile ".ok) - return ok -endfun - -" --------------------------------------------------------------------- -" s:NetrwLocalRename: rename a remote file or directory {{{2 -fun! s:NetrwLocalRename(path) range -" call Dfunc("NetrwLocalRename(path<".a:path.">)") - - " preparation for removing multiple files/directories - let ctr = a:firstline - let svpos= netrw#NetrwSavePosn() - - " rename files given by the markfilelist - if exists("s:netrwmarkfilelist_{bufnr('%')}") - for oldname in s:netrwmarkfilelist_{bufnr("%")} -" call Decho("oldname<".oldname.">") - if exists("subfrom") - let newname= substitute(oldname,subfrom,subto,'') -" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") - else - call inputsave() - let newname= input("Moving ".oldname." to : ",oldname) - call inputrestore() - if newname =~ '^s/' - let subfrom = substitute(newname,'^s/\([^/]*\)/.*/$','\1','') - let subto = substitute(newname,'^s/[^/]*/\(.*\)/$','\1','') -" call Decho("subfrom<".subfrom."> subto<".subto."> newname<".newname.">") - let newname = substitute(oldname,subfrom,subto,'') - endif - endif - call rename(oldname,newname) - endfor - call s:NetrwUnmarkList(bufnr("%"),b:netrw_curdir) - - else - - " attempt to rename files/directories - while ctr <= a:lastline - exe "keepj ".ctr - - " sanity checks - if line(".") < w:netrw_bannercnt - let ctr= ctr + 1 - continue + echohl Statement + call inputsave() + let ok= input("Confirm deletion of file<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") + call inputrestore() + echohl NONE + if ok == "" + let ok="no" endif - let curword= s:NetrwGetWord() - if curword == "./" || curword == "../" - let ctr= ctr + 1 - continue +" call Decho("response: ok<".ok.">") + let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') +" call Decho("response: ok<".ok."> (after sub)") + if ok =~ 'a\%[ll]' + let all= 1 endif + endif - keepj norm! 0 - let oldname= s:ComposePath(a:path,curword) -" call Decho("oldname<".oldname.">") + if all || ok =~ 'y\%[es]' || ok == "" + let ret= s:NetrwDelete(rmfile) +" call Decho("errcode=".v:shell_error." ret=".ret) + endif + else + " attempt to remove directory + if !all + echohl Statement call inputsave() - let newname= input("Moving ".oldname." to : ",substitute(oldname,'/*$','','e')) + let ok= input("Confirm deletion of directory<".rmfile."> ","[{y(es)},n(o),a(ll),q(uit)] ") call inputrestore() + let ok= substitute(ok,'\[{y(es)},n(o),a(ll),q(uit)]\s*','','e') + if ok == "" + let ok="no" + endif + if ok =~ 'a\%[ll]' + let all= 1 + endif + endif + let rmfile= substitute(rmfile,'[\/]$','','e') - call rename(oldname,newname) -" call Decho("renaming <".oldname."> to <".newname.">") - - let ctr= ctr + 1 - endwhile - endif - - " refresh the directory -" call Decho("refresh the directory listing") - call s:NetrwRefresh(1,s:NetrwBrowseChgDir(1,'./')) - call netrw#NetrwRestorePosn(svpos) - -" call Dret("NetrwLocalRename") -endfun - -" --------------------------------------------------------------------- -" s:LocalFastBrowser: handles setting up/taking down fast browsing for the local browser {{{2 -" -" g:netrw_ Directory Is -" fastbrowse Local Remote -" slow 0 D D D=Deleting a buffer implies it will not be re-used (slow) -" med 1 D H H=Hiding a buffer implies it may be re-used (fast) -" fast 2 H H -" -" Deleting a buffer means that it will be re-loaded when examined, hence "slow". -" Hiding a buffer means that it will be re-used when examined, hence "fast". -" (re-using a buffer may not be as accurate) -fun! s:LocalFastBrowser() -" call Dfunc("LocalFastBrowser() g:netrw_fastbrowse=".g:netrw_fastbrowse) - - " initialize browselist, a list of buffer numbers that the local browser has used - if !exists("s:netrw_browselist") -" call Decho("initialize s:netrw_browselist") - let s:netrw_browselist= [] - endif + if all || ok =~ 'y\%[es]' || ok == "" +" call Decho("1st attempt: system(netrw#WinPath(".g:netrw_localrmdir.') '.shellescape(rmfile).')') + call system(netrw#WinPath(g:netrw_localrmdir).' '.shellescape(rmfile)) +" call Decho("v:shell_error=".v:shell_error) - " append current buffer to fastbrowse list - if empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1] -" call Decho("appendng current buffer to browselist") - call add(s:netrw_browselist,bufnr("%")) -" call Decho("browselist=".string(s:netrw_browselist)) - endif + if v:shell_error != 0 +" call Decho("2nd attempt to remove directory<".rmfile.">") + let errcode= s:NetrwDelete(rmfile) +" call Decho("errcode=".errcode) - " enable autocmd events to handle refreshing/removing local browser buffers - " If local browse buffer is currently showing: refresh it - " If local browse buffer is currently hidden : wipe it - if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1 -" call Decho("setting up local-browser shell command refresh") - let s:netrw_browser_shellcmd= 1 - augroup AuNetrwShellCmd - au! - if (has("win32") || has("win95") || has("win64") || has("win16")) -" call Decho("autocmd: ShellCmdPost * call s:LocalBrowseShellCmdRefresh()") - au ShellCmdPost * call s:LocalBrowseShellCmdRefresh() - else - au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh() -" call Decho("autocmd: ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()") + if errcode != 0 + if has("unix") +" call Decho("3rd attempt to remove directory<".rmfile.">") + call system("rm ".shellescape(rmfile)) + if v:shell_error != 0 && !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",34) + let ok="no" + endif + elseif !exists("g:netrw_quiet") + call netrw#ErrorMsg(s:ERROR,"unable to remove directory<".rmfile."> -- is it empty?",35) + let ok="no" + endif + endif endif - augroup END - endif - - " user must have changed fastbrowse to its fast setting, so remove - " the associated autocmd events - if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd") -" call Decho("remove AuNetrwShellCmd autcmd group") - unlet s:netrw_browser_shellcmd - augroup AuNetrwShellCmd - au! - augroup END - augroup! AuNetrwShellCmd + endif endif -" call Dret("LocalFastBrowser : browselist<".string(s:netrw_browselist).">") +" call Dret("s:NetrwLocalRmFile ".ok) + return ok endfun " --------------------------------------------------------------------- " Support Functions: {{{1 " --------------------------------------------------------------------- -" netrw#ErrorMsg: {{{2 -" 0=note = s:NOTE -" 1=warning = s:WARNING -" 2=error = s:ERROR -" Dec 03, 2009 : max errnum currently is 76 -fun! netrw#ErrorMsg(level,msg,errnum) -" call Dfunc("netrw#ErrorMsg(level=".a:level." msg<".a:msg."> errnum=".a:errnum.") g:netrw_use_errorwindow=".g:netrw_use_errorwindow) - - if a:level == 1 - let level= "**warning** (netrw) " - elseif a:level == 2 - let level= "**error** (netrw) " - else - let level= "**note** (netrw) " - endif -" call Decho("level=".level) - - if g:netrw_use_errorwindow - " (default) netrw creates a one-line window to show error/warning - " messages (reliably displayed) - - " record current window number for NetrwRestorePosn()'s benefit - let s:winBeforeErr= winnr() -" call Decho("s:winBeforeErr=".s:winBeforeErr) - - " getting messages out reliably is just plain difficult! - " This attempt splits the current window, creating a one line window. - if bufexists("NetrwMessage") && bufwinnr("NetrwMessage") > 0 -" call Decho("write to NetrwMessage buffer") - exe bufwinnr("NetrwMessage")."wincmd w" -" call Decho("setlocal ma noro") - setlocal ma noro - call setline(line("$")+1,level.a:msg) - keepj $ - else -" call Decho("create a NetrwMessage buffer window") - bo 1split - call s:NetrwEnew() - call s:NetrwSafeOptions() - setlocal bt=nofile - file NetrwMessage -" call Decho("setlocal ma noro") - setlocal ma noro - call setline(line("$"),level.a:msg) - endif -" call Decho("wrote msg<".level.a:msg."> to NetrwMessage win#".winnr()) - if &fo !~ '[ta]' - syn clear - syn match netrwMesgNote "^\*\*note\*\*" - syn match netrwMesgWarning "^\*\*warning\*\*" - syn match netrwMesgError "^\*\*error\*\*" - hi link netrwMesgWarning WarningMsg - hi link netrwMesgError Error - endif - setlocal noma ro bh=wipe - +" netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2 +fun! netrw#WinPath(path) +" call Dfunc("netrw#WinPath(path<".a:path.">)") + if (!g:netrw_cygwin || &shell !~ '\%(\\|\\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16")) + " remove cygdrive prefix, if present + let path = substitute(a:path,'/cygdrive/\(.\)','\1:','') + " remove trailing slash (Win95) + let path = substitute(path, '\(\\\|/\)$', '', 'g') + " remove escaped spaces + let path = substitute(path, '\ ', ' ', 'g') + " convert slashes to backslashes + let path = substitute(path, '/', '\', 'g') else - " (optional) netrw will show messages using echomsg. Even if the - " message doesn't appear, at least it'll be recallable via :messages -" redraw! - if a:level == s:WARNING - echohl WarningMsg - elseif a:level == s:ERROR - echohl Error - endif - echomsg level.a:msg -" call Decho("echomsg ***netrw*** ".a:msg) - echohl None + let path= a:path endif - -" call Dret("netrw#ErrorMsg") +" call Dret("netrw#WinPath <".path.">") + return path endfun " --------------------------------------------------------------------- @@ -7680,16 +9033,18 @@ let eikeep= &ei set ei=all if expand("%") == "NetrwMessage" - exe s:winBeforeErr."wincmd w" + if exists("s:winBeforeErr") + exe s:winBeforeErr."wincmd w" + endif endif if a:0 > 0 - exe a:1 + exe "keepj ".a:1 endif " restore window if exists("w:netrw_winnr") -" call Decho("restore window: exe silent! ".w:netrw_winnr."wincmd w") +" call Decho("(NetrwRestorePosn) restore window: exe sil! ".w:netrw_winnr."wincmd w") exe "sil! ".w:netrw_winnr."wincmd w" endif if v:shell_error == 0 @@ -7700,29 +9055,29 @@ " restore top-of-screen line if exists("w:netrw_hline") -" call Decho("restore topofscreen: exe norm! ".w:netrw_hline."G0z") +" call Decho("(NetrwRestorePosn) restore topofscreen: exe keepj norm! ".w:netrw_hline."G0z") exe "keepj norm! ".w:netrw_hline."G0z\" endif " restore position if exists("w:netrw_line") && exists("w:netrw_col") -" call Decho("restore posn: exe norm! ".w:netrw_line."G0".w:netrw_col."|") +" call Decho("(NetrwRestorePosn) restore posn: exe keepj norm! ".w:netrw_line."G0".w:netrw_col."|") exe "keepj norm! ".w:netrw_line."G0".w:netrw_col."\" endif let &ei= eikeep -" call Dret("netrw#NetrwRestorePosn") +" call Dret("netrw#NetrwRestorePosn : line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol()) endfun " --------------------------------------------------------------------- " netrw#NetrwSavePosn: saves position of cursor on screen {{{2 fun! netrw#NetrwSavePosn() -" call Dfunc("netrw#NetrwSavePosn()") +" call Dfunc("netrw#NetrwSavePosn() line#".line(".")." col#".col(".")." winline#".winline()." wincol#".wincol()) " Save current line and column let w:netrw_winnr= winnr() let w:netrw_line = line(".") let w:netrw_col = virtcol(".") -" call Decho("currently, win#".w:netrw_winnr." line#".w:netrw_line." col#".w:netrw_col) +" call Decho("(NetrwSavePosn) currently, win#".w:netrw_winnr." line#".w:netrw_line." col#".w:netrw_col) " Save top-of-screen line keepj norm! H0 @@ -7731,11 +9086,26 @@ " set up string holding position parameters let ret = "let w:netrw_winnr=".w:netrw_winnr."|let w:netrw_line=".w:netrw_line."|let w:netrw_col=".w:netrw_col."|let w:netrw_hline=".w:netrw_hline - call netrw#NetrwRestorePosn() + keepj call netrw#NetrwRestorePosn() " call Dret("netrw#NetrwSavePosn : winnr=".w:netrw_winnr." line=".w:netrw_line." col=".w:netrw_col." hline=".w:netrw_hline) return ret endfun +" --------------------------------------------------------------------- +" netrw#NetrwAccess: intended to provide access to variable values for netrw's test suite {{{2 +" 0: marked file list of current buffer +" 1: marked file target +fun! netrw#NetrwAccess(ilist) + if a:ilist == 0 + if exists("s:netrwmarkfilelist_".bufnr('%')) + return s:netrwmarkfilelist_{bufnr('%')} + else + return "no-list-buf#".bufnr('%') + endif + elseif a:ilist == 1 + return s:netrwmftgt +endfun + " ------------------------------------------------------------------------ " netrw#RFC2396: converts %xx into characters {{{2 fun! netrw#RFC2396(fname) @@ -7750,7 +9120,7 @@ fun! s:ComposePath(base,subdir) " call Dfunc("s:ComposePath(base<".a:base."> subdir<".a:subdir.">)") - if(has("amiga")) + if has("amiga") " call Decho("amiga") let ec = a:base[s:Strlen(a:base)-1] if ec != '/' && ec != ':' @@ -7835,8 +9205,8 @@ " sanity check -- does the temporary file's directory exist? if !isdirectory(substitute(tmpfile,'[^/]\+$','','e')) -" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) - call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2) +" call Decho("(GetTempfile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") + keepj call netrw#ErrorMsg(s:ERROR,"your <".substitute(tmpfile,'[^/]\+$','','e')."> directory is missing!",2) " call Dret("s:GetTempfile getcwd<".getcwd().">") return "" endif @@ -7883,7 +9253,7 @@ endif endif -" call Decho("ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap) +" call Decho("(GetTempFile) ro=".&l:ro." ma=".&l:ma." mod=".&l:mod." wrap=".&l:wrap." (filename<".expand("%")."> win#".winnr()." ft<".&ft.">)") " call Dret("s:GetTempfile <".tmpfile.">") return tmpfile endfun @@ -7918,7 +9288,7 @@ if bmshowfuncs != [] let bmshowfunc = substitute(bmshowfuncs[0],'^.*:\(call.*BMShow()\).*$','\1','') if bmshowfunc =~ '^call.*BMShow()' - exe "sil! ".bmshowfunc + exe "sil! keepj ".bmshowfunc endif endif endif @@ -7926,43 +9296,78 @@ endfun " --------------------------------------------------------------------- -" s:NetrwCursorline: {{{2 -fun! s:NetrwCursorline() +" s:NetrwCursor: responsible for setting cursorline/cursorcolumn based upon g:netrw_cursor {{{2 +fun! s:NetrwCursor() if !exists("w:netrw_liststyle") let w:netrw_liststyle= g:netrw_liststyle endif -" call Dfunc("s:NetrwCursorline() liststyle=".w:netrw_liststyle." g:netrw_cursorline=".g:netrw_cursorline." s:netrw_usercuc=".s:netrw_usercuc." s:netrw_usercul=".s:netrw_usercul) - " - if w:netrw_liststyle != s:WIDELIST - " thin-long-tree listings - if g:netrw_cursorline == 2 - setlocal cursorline - let &l:cursorcolumn= s:netrw_usercuc -" call Decho("setlocal cursorline (cursorcolumn is ".((s:netrw_usercuc)? "on" : "off").")") - elseif g:netrw_cursorline - setlocal cursorline -" call Decho("setlocal cursorline") +" call Dfunc("s:NetrwCursor() ft<".&ft."> liststyle=".w:netrw_liststyle." g:netrw_cursor=".g:netrw_cursor." s:netrw_usercuc=".s:netrw_usercuc." s:netrw_usercul=".s:netrw_usercul) + + if &ft != "netrw" + " if the current window isn't a netrw directory listing window, then use user cursorline/column + " settings. Affects when netrw is used to read/write a file using scp/ftp/etc. +" call Decho("case ft!=netrw: use user cul,cuc") + let &l:cursorline = s:netrw_usercul + let &l:cursorcolumn = s:netrw_usercuc + + elseif g:netrw_cursor == 4 + " all styles: cursorline, cursorcolumn +" call Decho("case g:netrw_cursor==4: setl cul cuc") + setl cursorline + setl cursorcolumn + + elseif g:netrw_cursor == 3 + " thin-long-tree: cursorline, user's cursorcolumn + " wide : cursorline, cursorcolumn + if w:netrw_liststyle == s:WIDELIST +" call Decho("case g:netrw_cursor==3 and wide: setl cul cuc") + setl cursorline + setl cursorcolumn + else +" call Decho("case g:netrw_cursor==3 and not wide: setl cul (use user's cuc)") + setl cursorline + let &l:cursorcolumn = s:netrw_usercuc + endif + + elseif g:netrw_cursor == 2 + " thin-long-tree: cursorline, user's cursorcolumn + " wide : cursorline, user's cursorcolumn +" call Decho("case g:netrw_cursor==2: setl cuc (use user's cul)") + let &l:cursorcolumn = s:netrw_usercuc + setl cursorline + + elseif g:netrw_cursor == 1 + " thin-long-tree: user's cursorline, user's cursorcolumn + " wide : cursorline, user's cursorcolumn + let &l:cursorcolumn = s:netrw_usercuc + if w:netrw_liststyle == s:WIDELIST +" call Decho("case g:netrw_cursor==2 and wide: setl cul (use user's cuc)") + set cursorline + else +" call Decho("case g:netrw_cursor==2 and not wide: (use user's cul,cuc)") + let &l:cursorline = s:netrw_usercul endif else - " wide listings - if g:netrw_cursorline == 2 - setlocal cursorline cursorcolumn -" call Decho("setlocal cursorline cursorcolumn") - elseif g:netrw_cursorline - let &l:cursorline= s:netrw_usercul -" call Decho("cursorline is ".((s:netrw_usercul)? "on" : "off").")") - endif + " all styles: user's cursorline, user's cursorcolumn +" call Decho("default: (use user's cul,cuc)") + let &l:cursorline = s:netrw_usercul + let &l:cursorcolumn = s:netrw_usercuc endif -" call Dret("s:NetrwCursorline : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn) + +" call Dret("s:NetrwCursor : l:cursorline=".&l:cursorline." l:cursorcolumn=".&l:cursorcolumn) endfun " --------------------------------------------------------------------- " s:RestoreCursorline: restores cursorline/cursorcolumn to original user settings {{{2 fun! s:RestoreCursorline() -" call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%")) - let &l:cursorline = s:netrw_usercul - let &l:cursorcolumn = s:netrw_usercuc +" call Dfunc("s:RestoreCursorline() currently, cul=".&l:cursorline." cuc=".&l:cursorcolumn." win#".winnr()." buf#".bufnr("%")." mod=".&mod) + if exists("s:netrw_usercul") + let &l:cursorline = s:netrw_usercul + endif + if exists("s:netrw_usercuc") + let &l:cursorcolumn = s:netrw_usercuc + endif " call Dret("s:RestoreCursorline : restored cul=".&l:cursorline." cuc=".&l:cursorcolumn) endfun @@ -7978,7 +9383,7 @@ if !g:netrw_cygwin && (has("win32") || has("win95") || has("win64") || has("win16")) if exists("+shellslash") let sskeep= &shellslash - setlocal noshellslash + setl noshellslash let result = delete(path) let &shellslash = sskeep else @@ -7990,7 +9395,7 @@ let result= delete(path) endif if result < 0 - call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71) + keepj call netrw#ErrorMsg(s:WARNING,"delete(".path.") failed!",71) endif " call Dret("s:NetrwDelete ".result) @@ -8022,13 +9427,13 @@ if exists("b:netrw_option") |let netrw_option = b:netrw_option |endif if exists("b:netrw_prvdir") |let netrw_prvdir = b:netrw_prvdir |endif - call s:NetrwOptionRestore("w:") + keepj call s:NetrwOptionRestore("w:") " call Decho("generate a buffer with keepjumps keepalt enew!") let netrw_keepdiff= &l:diff keepj keepalt enew! let &l:diff= netrw_keepdiff " call Decho("bufnr($)=".bufnr("$")) - call s:NetrwOptionSave("w:") + keepj call s:NetrwOptionSave("w:") " copy function-local-variables to buffer variable equivalents " call Decho("copy function-local variables back to buffer netrw variables") @@ -8054,16 +9459,44 @@ if b:netrw_curdir =~ '/$' if exists("w:netrw_liststyle") && w:netrw_liststyle == s:TREELIST file NetrwTreeListing - set bt=nowrite noswf - nno [ :silent call TreeListMove('[') - nno ] :silent call TreeListMove(']') + set bt=nowrite noswf bh=hide + nno [ :sil call TreeListMove('[') + nno ] :sil call TreeListMove(']') else exe "sil! keepalt file ".fnameescape(b:netrw_curdir) endif endif endif -" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#").">") +" call Dret("s:NetrwEnew : buf#".bufnr("%")."<".bufname("%")."> expand(%)<".expand("%")."> expand(#)<".expand("#")."> bh=".&bh) +endfun + +" --------------------------------------------------------------------- +" s:NetrwInsureWinVars: insure that a netrw buffer has its w: variables in spite of a wincmd v or s {{{2 +fun! s:NetrwInsureWinVars() +" call Dfunc("s:NetrwInsureWinVars() win#".winnr()) + if !exists("w:netrw_liststyle") + let curbuf = bufnr("%") + let curwin = winnr() + let iwin = 1 + while iwin <= winnr("$") + exe iwin."wincmd w" + if winnr() != curwin && bufnr("%") == curbuf && exists("w:netrw_liststyle") + " looks like ctrl-w_s or ctrl-w_v was used to split a netrw buffer + let winvars= w: + break + endif + let iwin= iwin + 1 + endwhile + exe "keepalt ".curwin."wincmd w" + if exists("winvars") +" call Decho("copying w#".iwin." window variables to w#".curwin) + for k in keys(winvars) + let w:{k}= winvars[k] + endfor + endif + endif +" call Dret("s:NetrwInsureWinVars win#".winnr()) endfun " ------------------------------------------------------------------------ @@ -8080,7 +9513,7 @@ " changed sorting, etc. Also see s:NetrwSaveWordPosn(). fun! s:NetrwRestoreWordPosn() " call Dfunc("NetrwRestoreWordPosn()") - silent! call search(s:netrw_saveword,'w') + sil! call search(s:netrw_saveword,'w') " call Dret("NetrwRestoreWordPosn") endfun @@ -8102,7 +9535,7 @@ " --------------------------------------------------------------------- " s:RemotePathAnalysis: {{{2 fun! s:RemotePathAnalysis(dirname) -" call Dfunc("s:RemotePathAnalysis()") +" call Dfunc("s:RemotePathAnalysis(a:dirname<".a:dirname.">)") let dirpat = '^\(\w\{-}\)://\(\w\+@\)\=\([^/:#]\+\)\%([:#]\(\d\+\)\)\=/\(.*\)$' let s:method = substitute(a:dirname,dirpat,'\1','') @@ -8131,9 +9564,9 @@ fun! s:RemoteSystem(cmd) " call Dfunc("s:RemoteSystem(cmd<".a:cmd.">)") if !executable(g:netrw_ssh_cmd) - call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52) + keepj call netrw#ErrorMsg(s:ERROR,"g:netrw_ssh_cmd<".g:netrw_ssh_cmd."> is not executable!",52) elseif !exists("b:netrw_curdir") - call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53) + keepj call netrw#ErrorMsg(s:ERROR,"for some reason b:netrw_curdir doesn't exist!",53) else let cmd = s:MakeSshCmd(g:netrw_ssh_cmd." USEPORT HOSTNAME") let remotedir= substitute(b:netrw_curdir,'^.*//[^/]\+/\(.*\)$','\1','') @@ -8183,15 +9616,28 @@ " " s:nbcd_curpos_{bufnr('%')} is set up by s:NetrwBrowseChgDir() fun! s:NetrwRexplore(islocal,dirname) -" call Dfunc("s:NetrwRexplore(islocal=".a:islocal." dirname<".a:dirname.">)") - if a:islocal - call netrw#LocalBrowseCheck(a:dirname) + if exists("s:netrwdrag") + return + endif +" call Dfunc("s:NetrwRexplore() w:netrw_rexlocal=".w:netrw_rexlocal." w:netrw_rexdir<".w:netrw_rexdir.">") + if !exists("w:netrw_rexlocal") +" " call Dret("s:NetrwRexplore() w:netrw_rexlocal doesn't exist") + return + endif + if w:netrw_rexlocal + keepj call netrw#LocalBrowseCheck(w:netrw_rexdir) else - call s:NetrwBrowse(0,a:dirname) + keepj call s:NetrwBrowse(0,w:netrw_rexdir) endif - if exists("s:nbcd_curpos_{bufnr('%')}") - call netrw#NetrwRestorePosn(s:nbcd_curpos_{bufnr('%')}) - unlet s:nbcd_curpos_{bufnr('%')} + if exists("s:initbeval") + set beval + endif + if exists("s:rexposn_".bufnr("%")) +" call Decho("(NetrwRexplore) restore posn, then unlet s:rexposn_".bufnr('%')) + keepj call netrw#NetrwRestorePosn(s:rexposn_{bufnr('%')}) + unlet s:rexposn_{bufnr('%')} + else +" call Decho("(NetrwRexplore) s:rexposn_".bufnr('%')." doesn't exist") endif if exists("s:explore_match") exe "2match netrwMarkFile /".s:explore_match."/" @@ -8265,32 +9711,14 @@ " s:SetRexDir: set directory for :Rexplore {{{2 fun! s:SetRexDir(islocal,dirname) " call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)") - " set up Rex and leftmouse-double-click - if a:islocal - exe 'com! Rexplore call s:NetrwRexplore(1,"'.escape(a:dirname,'"\').'")' - if g:netrw_retmap - if !hasmapto("NetrwReturn") && maparg("<2-leftmouse>","n") == "" - nmap <2-leftmouse> NetrwReturn - endif - let dir = escape(a:dirname, s:netrw_map_escape) - exe 'nnoremap NetrwReturn :call NetrwRexplore(1,"'.dir.'")' - endif - else - exe 'com! Rexplore call s:NetrwRexplore(0,"'.escape(a:dirname,'"\').'")' - if g:netrw_retmap - if !hasmapto("NetrwReturn") && maparg("<2-leftmouse>","n") == "" - nmap <2-leftmouse> NetrwReturn - endif - let dir = escape(a:dirname, s:netrw_map_escape) - exe 'nnoremap NetrwReturn :call NetrwRexplore(0,"'.dir.'")' - endif - endif -" call Dret("s:SetRexDir") + let w:netrw_rexdir = a:dirname + let w:netrw_rexlocal = a:islocal +" call Dret("s:SetRexDir : win#".winnr()." ".(a:islocal? "local" : "remote")." dir: ".a:dirname) endfun " --------------------------------------------------------------------- " s:Strlen: this function returns the length of a string, even if its {{{2 -" using two-byte etc characters. +" using multiple-byte characters. " Solution from Nicolai Weibull, vim docs (:help strlen()), Tony Mechelynck, " and a bit from me. " if g:netrw_xstrlen is zero (default), then the builtin strlen() function is used. @@ -8317,6 +9745,7 @@ call setline(line("."),a:x) let ret= virtcol("$") - 1 keepj d + keepj norm! k let &mod= modkeep else @@ -8390,12 +9819,12 @@ " Buffers.Refresh; hence, s:NetrwBMShow() utilizes a "cheat" to call that function anyway. fun! s:UpdateBuffersMenu() " call Dfunc("s:UpdateBuffersMenu()") - if has("gui") && has("menu") && has("gui_running") && &go =~ 'm' && g:netrw_menu + if has("gui") && has("menu") && has("gui_running") && &go =~# 'm' && g:netrw_menu try - silent emenu Buffers.Refresh\ menu + sil emenu Buffers.Refresh\ menu catch /^Vim\%((\a\+)\)\=:E/ let v:errmsg= "" - silent call s:NetrwBMShow() + sil keepj call s:NetrwBMShow() endtry endif " call Dret("s:UpdateBuffersMenu") @@ -8403,7 +9832,7 @@ " --------------------------------------------------------------------- " s:UseBufWinVars: (used by NetrwBrowse() and LocalBrowseCheck() {{{2 -" Matching function to BufferWinVars() +" Matching function to s:SetBufWinVars() fun! s:UseBufWinVars() " call Dfunc("s:UseBufWinVars()") if exists("b:netrw_liststyle") && !exists("w:netrw_liststyle") |let w:netrw_liststyle = b:netrw_liststyle |endif @@ -8420,27 +9849,7 @@ endfun " --------------------------------------------------------------------- -" netrw#WinPath: tries to insure that the path is windows-acceptable, whether cygwin is used or not {{{2 -fun! netrw#WinPath(path) -" call Dfunc("netrw#WinPath(path<".a:path.">)") - if (!g:netrw_cygwin || &shell !~ '\%(\\|\\)\%(\.exe\)\=$') && (has("win32") || has("win95") || has("win64") || has("win16")) - " remove cygdrive prefix, if present - let path = substitute(a:path,'/cygdrive/\(.\)','\1:','') - " remove trailing slash (Win95) - let path = substitute(path, '\(\\\|/\)$', '', 'g') - " remove escaped spaces - let path = substitute(path, '\ ', ' ', 'g') - " convert slashes to backslashes - let path = substitute(path, '/', '\', 'g') - else - let path= a:path - endif -" call Dret("netrw#WinPath <".path.">") - return path -endfun - -" --------------------------------------------------------------------- -" Settings Restoration: {{{2 +" Settings Restoration: {{{1 let &cpo= s:keepcpo unlet s:keepcpo diff -Naur vim73.orig/runtime/autoload/netrwFileHandlers.vim vim73/runtime/autoload/netrwFileHandlers.vim --- vim73.orig/runtime/autoload/netrwFileHandlers.vim 2010-05-15 11:03:30.000000000 +0000 +++ vim73/runtime/autoload/netrwFileHandlers.vim 2013-06-07 17:07:06.775655991 +0000 @@ -1,9 +1,9 @@ " netrwFileHandlers: contains various extension-based file handlers for " netrw's browsers' x command ("eXecute launcher") -" Author: Charles E. Campbell, Jr. -" Date: Sep 30, 2008 -" Version: 10 -" Copyright: Copyright (C) 1999-2008 Charles E. Campbell, Jr. {{{1 +" Author: Charles E. Campbell +" Date: May 03, 2013 +" Version: 11b ASTRO-ONLY +" Copyright: Copyright (C) 1999-2012 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright " notice is copied with it. Like anything else that's free, @@ -20,7 +20,7 @@ if exists("g:loaded_netrwFileHandlers") || &cp finish endif -let g:loaded_netrwFileHandlers= "v10" +let g:loaded_netrwFileHandlers= "v11b" if v:version < 702 echohl WarningMsg echo "***warning*** this version of netrwFileHandlers needs vim 7.2" @@ -34,10 +34,10 @@ " netrwFileHandlers#Invoke: {{{1 fun! netrwFileHandlers#Invoke(exten,fname) " call Dfunc("netrwFileHandlers#Invoke(exten<".a:exten."> fname<".a:fname.">)") - let fname= a:fname + let exten= a:exten " list of supported special characters. Consider rcs,v --- that can be " supported with a NFH_rcsCOMMAv() handler - if a:fname =~ '[@:,$!=\-+%?;~]' + if exten =~ '[@:,$!=\-+%?;~]' let specials= { \ '@' : 'AT', \ ':' : 'COLON', @@ -51,20 +51,20 @@ \ '?' : 'QUESTION', \ ';' : 'SEMICOLON', \ '~' : 'TILDE'} - let fname= substitute(a:fname,'[@:,$!=\-+%?;~]','\=specials[submatch(0)]','ge') + let exten= substitute(a:exten,'[@:,$!=\-+%?;~]','\=specials[submatch(0)]','ge') " call Decho('fname<'.fname.'> done with dictionary') endif - if a:exten != "" && exists("*NFH_".a:exten) + if a:exten != "" && exists("*NFH_".exten) " support user NFH_*() functions " call Decho("let ret= netrwFileHandlers#NFH_".a:exten.'("'.fname.'")') - exe "let ret= NFH_".a:exten.'("'.fname.'")' - elseif a:exten != "" && exists("*s:NFH_".a:exten) + exe "let ret= NFH_".exten.'("'.a:fname.'")' + elseif a:exten != "" && exists("*s:NFH_".exten) " use builtin-NFH_*() functions " call Decho("let ret= netrwFileHandlers#NFH_".a:exten.'("'.fname.'")') - exe "let ret= s:NFH_".a:exten.'("'.fname.'")' + exe "let ret= s:NFH_".a:exten.'("'.a:fname.'")' endif - + " call Dret("netrwFileHandlers#Invoke 0 : ret=".ret) return 0 endfun @@ -356,6 +356,7 @@ endfun let &cpo= s:keepcpo +unlet s:keepcpo " --------------------------------------------------------------------- " Modelines: {{{1 " vim: fdm=marker diff -Naur vim73.orig/runtime/autoload/netrwSettings.vim vim73/runtime/autoload/netrwSettings.vim --- vim73.orig/runtime/autoload/netrwSettings.vim 2010-05-15 11:03:29.000000000 +0000 +++ vim73/runtime/autoload/netrwSettings.vim 2013-06-07 17:07:06.792322610 +0000 @@ -1,8 +1,8 @@ " netrwSettings.vim: makes netrw settings simpler -" Date: Sep 03, 2008 -" Maintainer: Charles E Campbell, Jr -" Version: 13 -" Copyright: Copyright (C) 1999-2007 Charles E. Campbell, Jr. {{{1 +" Date: May 03, 2013 +" Maintainer: Charles E Campbell +" Version: 14a ASTRO-ONLY +" Copyright: Copyright (C) 1999-2007 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright " notice is copied with it. Like anything else that's free, @@ -19,7 +19,7 @@ if exists("g:loaded_netrwSettings") || &cp finish endif -let g:loaded_netrwSettings = "v13" +let g:loaded_netrwSettings = "v14a" if v:version < 700 echohl WarningMsg echo "***warning*** this version of netrwSettings needs vim 7.0" @@ -63,7 +63,7 @@ endif put ='+ ---------------------------------------------' - put ='+ NetrwSettings: by Charles E. Campbell, Jr.' + put ='+ NetrwSettings: by Charles E. Campbell' put ='+ Press with cursor atop any line for help' put ='+ ---------------------------------------------' let s:netrw_settings_stop= line(".") @@ -88,6 +88,7 @@ put = 'let g:netrw_ftpmode = '.g:netrw_ftpmode put = 'let g:netrw_ignorenetrc = '.g:netrw_ignorenetrc put = 'let g:netrw_sshport = '.g:netrw_sshport + put = 'let g:netrw_silent = '.g:netrw_silent put = 'let g:netrw_use_nt_rcp = '.g:netrw_use_nt_rcp put = 'let g:netrw_win95ftp = '.g:netrw_win95ftp let s:netrw_xfer_stop= line(".") @@ -99,51 +100,81 @@ put ='+ Netrw Browser Control' put = 'let g:netrw_alto = '.g:netrw_alto put = 'let g:netrw_altv = '.g:netrw_altv + put = 'let g:netrw_banner = '.g:netrw_banner + if exists("g:netrw_bannerbackslash") + put = 'let g:netrw_bannerbackslash = '.g:netrw_bannerbackslash + else + put = '\" let g:netrw_bannerbackslash = (not defined)' + endif put = 'let g:netrw_browse_split = '.g:netrw_browse_split if exists("g:netrw_browsex_viewer") - put = 'let g:netrw_browsex_viewer = '.g:netrw_browsex_viewer + put = 'let g:netrw_browsex_viewer = '.g:netrw_browsex_viewer else - put = 'let g:netrw_browsex_viewer = (not defined)' + put = '\" let g:netrw_browsex_viewer = (not defined)' endif put = 'let g:netrw_compress = '.g:netrw_compress - put = 'let g:netrw_cursorline = '.g:netrw_cursorline + if exists("g:Netrw_corehandler") + put = 'let g:Netrw_corehandler = '.g:Netrw_corehandler + else + put = '\" let g:Netrw_corehandler = (not defined)' + endif + put = 'let g:netrw_ctags = '.g:netrw_ctags + put = 'let g:netrw_cursor = '.g:netrw_cursor let decompressline= line("$") - put ='let g:netrw_decompress...' + put = 'let g:netrw_decompress = '.string(g:netrw_decompress) + if exists("g:netrw_dynamic_maxfilenamelen") + put = 'let g:netrw_dynamic_maxfilenamelen='.g:netrw_dynamic_maxfilenamelen + else + put = '\" let g:netrw_dynamic_maxfilenamelen= (not defined)' + endif put = 'let g:netrw_dirhistmax = '.g:netrw_dirhistmax + put = 'let g:netrw_errorlvl = '.g:netrw_errorlvl put = 'let g:netrw_fastbrowse = '.g:netrw_fastbrowse let fnameescline= line("$") - put = 'let g:netrw_fname_escape...' + put = 'let g:netrw_fname_escape = '.string(g:netrw_fname_escape) put = 'let g:netrw_ftp_browse_reject = '.g:netrw_ftp_browse_reject put = 'let g:netrw_ftp_list_cmd = '.g:netrw_ftp_list_cmd put = 'let g:netrw_ftp_sizelist_cmd = '.g:netrw_ftp_sizelist_cmd put = 'let g:netrw_ftp_timelist_cmd = '.g:netrw_ftp_timelist_cmd let globescline= line("$") - put ='let g:netrw_glob_escape...' + put = 'let g:netrw_glob_escape = '.string(g:netrw_glob_escape) put = 'let g:netrw_hide = '.g:netrw_hide + if exists("g:netrw_home") + put = 'let g:netrw_home = '.g:netrw_home + else + put = '\" let g:netrw_home = (not defined)' + endif put = 'let g:netrw_keepdir = '.g:netrw_keepdir put = 'let g:netrw_list_cmd = '.g:netrw_list_cmd put = 'let g:netrw_list_hide = '.g:netrw_list_hide put = 'let g:netrw_liststyle = '.g:netrw_liststyle put = 'let g:netrw_localcopycmd = '.g:netrw_localcopycmd - put = 'let g:netrw_local_mkdir = '.g:netrw_local_mkdir + put = 'let g:netrw_localmkdir = '.g:netrw_localmkdir put = 'let g:netrw_localmovecmd = '.g:netrw_localmovecmd - put = 'let g:netrw_local_rmdir = '.g:netrw_local_rmdir + put = 'let g:netrw_localrmdir = '.g:netrw_localrmdir put = 'let g:netrw_maxfilenamelen = '.g:netrw_maxfilenamelen put = 'let g:netrw_menu = '.g:netrw_menu + put = 'let g:netrw_mousemaps = '.g:netrw_mousemaps put = 'let g:netrw_mkdir_cmd = '.g:netrw_mkdir_cmd + if exists("g:netrw_nobeval") + put = 'let g:netrw_nobeval = '.g:netrw_nobeval + else + put = '\" let g:netrw_nobeval = (not defined)' + endif + put = 'let g:netrw_remote_mkdir = '.g:netrw_remote_mkdir put = 'let g:netrw_preview = '.g:netrw_preview put = 'let g:netrw_rename_cmd = '.g:netrw_rename_cmd put = 'let g:netrw_retmap = '.g:netrw_retmap put = 'let g:netrw_rm_cmd = '.g:netrw_rm_cmd put = 'let g:netrw_rmdir_cmd = '.g:netrw_rmdir_cmd put = 'let g:netrw_rmf_cmd = '.g:netrw_rmf_cmd - put = 'let g:netrw_silent = '.g:netrw_silent put = 'let g:netrw_sort_by = '.g:netrw_sort_by put = 'let g:netrw_sort_direction = '.g:netrw_sort_direction put = 'let g:netrw_sort_options = '.g:netrw_sort_options put = 'let g:netrw_sort_sequence = '.g:netrw_sort_sequence put = 'let g:netrw_special_syntax = '.g:netrw_special_syntax put = 'let g:netrw_ssh_browse_reject = '.g:netrw_ssh_browse_reject + put = 'let g:netrw_ssh_cmd = '.g:netrw_ssh_cmd put = 'let g:netrw_scpport = '.g:netrw_scpport put = 'let g:netrw_sepchr = '.g:netrw_sepchr put = 'let g:netrw_sshport = '.g:netrw_sshport diff -Naur vim73.orig/runtime/autoload/phpcomplete.vim vim73/runtime/autoload/phpcomplete.vim --- vim73.orig/runtime/autoload/phpcomplete.vim 2010-05-15 11:03:30.000000000 +0000 +++ vim73/runtime/autoload/phpcomplete.vim 2013-06-07 17:07:06.818989201 +0000 @@ -1,7 +1,7 @@ " Vim completion script " Language: PHP " Maintainer: Mikolaj Machowski ( mikmach AT wp DOT pl ) -" Last Change: 2006 May 9 +" Last Change: 2011 Dec 08 " " TODO: " - Class aware completion: @@ -650,6 +650,7 @@ " this is the most efficient way. The other way " is to go through the looong string looking for " matching {} + let original_window = winnr() below 1new 0put =cfile call search('class\s\+'.a:name) @@ -667,6 +668,9 @@ let classcontent = join(classc, "\n") bw! % + " go back to where we started + exe original_window.'wincmd w' + if extends_class != '' let classlocation = phpcomplete#GetClassLocation(extends_class) if filereadable(classlocation) diff -Naur vim73.orig/runtime/autoload/spellfile.vim vim73/runtime/autoload/spellfile.vim --- vim73.orig/runtime/autoload/spellfile.vim 2010-05-15 11:03:31.000000000 +0000 +++ vim73/runtime/autoload/spellfile.vim 2013-06-07 17:07:06.878989030 +0000 @@ -1,6 +1,6 @@ " Vim script to download a missing spell file " Maintainer: Bram Moolenaar -" Last Change: 2008 Nov 29 +" Last Change: 2012 Jan 08 if !exists('g:spellfile_URL') " Prefer using http:// when netrw should be able to use it, since @@ -70,7 +70,7 @@ " Remember the buffer number, we check it below. new let newbufnr = winbufnr(0) - setlocal bin + setlocal bin fenc= echo 'Downloading ' . fname . '...' call spellfile#Nread(fname) if getline(2) !~ 'VIMspell' @@ -83,7 +83,7 @@ " Our buffer has vanished!? Open a new window. echomsg "download buffer disappeared, opening a new one" new - setlocal bin + setlocal bin fenc= else exe winnr . "wincmd w" endif @@ -120,6 +120,7 @@ else let dirname = escape(dirlist[dirchoice], ' ') endif + setlocal fenc= exe "write " . dirname . '/' . fname " Also download the .sug file, if the user wants to. diff -Naur vim73.orig/runtime/autoload/sqlcomplete.vim vim73/runtime/autoload/sqlcomplete.vim --- vim73.orig/runtime/autoload/sqlcomplete.vim 2010-08-01 13:55:41.000000000 +0000 +++ vim73/runtime/autoload/sqlcomplete.vim 2013-06-07 17:07:06.892322325 +0000 @@ -1,16 +1,63 @@ " Vim OMNI completion script for SQL " Language: SQL " Maintainer: David Fishburn -" Version: 10.0 -" Last Change: 2010 Jun 11 +" Version: 15.0 +" Last Change: 2013 May 13 +" Homepage: http://www.vim.org/scripts/script.php?script_id=1572 " Usage: For detailed help -" ":help sql.txt" -" or ":help ft-sql-omni" +" ":help sql.txt" +" or ":help ft-sql-omni" " or read $VIMRUNTIME/doc/sql.txt " History +" +" TODO +" - Jonas Enberg - if no table is found when using column completion +" look backwards to a FROM clause and find the first table +" and complete it. +" +" Version 15.0 (May 2013) +" - NF: Changed the SQL precached syntax items, omni_sql_precache_syntax_groups, +" to use regular expressions to pick up extended syntax group names. +" This requires an updated SyntaxComplete plugin version 13.0. +" If the required versions have not been installed, previous +" behaviour will not be impacted. +" +" Version 14.0 (Dec 2012) +" - BF: Added check for cpo +" +" Version 13.0 (Dec 2012) +" - NF: When completing column lists or drilling into a table +" and g:omni_sql_include_owner is enabled, the +" only the table name would be replaced with the column +" list instead of the table name and owner (if specified). +" - NF: When completing column lists using table aliases +" and g:omni_sql_include_owner is enabled, account +" for the owner name when looking up the table +" list instead of the table name and owner (if specified). +" - BF: When completing column lists or drilling into a table +" and g:omni_sql_include_owner is enabled, the +" column list could often not be found for the table. +" - BF: When OMNI popped up, possibly the wrong word +" would be replaced for column and column list options. +" +" Version 12.0 (Feb 2012) +" - Partial column name completion did not work when a table +" name or table alias was provided (Jonas Enberg). +" - Improved the handling of column completion. First we match any +" columns from a previous completion. If not matches are found, we +" consider the partial name to be a table or table alias for the +" query and attempt to match on it. +" +" Version 11.0 (Jan 2012) +" Added g:omni_sql_default_compl_type variable +" - You can specify which type of completion to default to +" when pressing . The entire list of available +" choices can be found in the calls to sqlcomplete#Map in: +" ftplugin/sql.vim +" " Version 10.0 -" Updated PreCacheSyntax() +" Updated PreCacheSyntax() " - Now returns a List of the syntax items it finds. " This allows other plugins / scripts to use this list for their own " purposes. In this case XPTemplate can use them for a Choose list. @@ -18,33 +65,33 @@ " warning if not. " - Verifies the parameters are the correct type and displays a " warning if not. -" Updated SQLCWarningMsg() +" Updated SQLCWarningMsg() " - Prepends warning message with SQLComplete so you know who issued " the warning. -" Updated SQLCErrorMsg() +" Updated SQLCErrorMsg() " - Prepends error message with SQLComplete so you know who issued " the error. -" -" Version 9.0 +" +" Version 9.0 (May 2010) " This change removes some of the support for tables with spaces in their -" names in order to simplify the regexes used to pull out query table +" names in order to simplify the regexes used to pull out query table " aliases for more robust table name and column name code completion. " Full support for "table names with spaces" can be added in again " after 7.3. " " Version 8.0 -" Incorrectly re-executed the g:ftplugin_sql_omni_key_right and g:ftplugin_sql_omni_key_left +" Incorrectly re-executed the g:ftplugin_sql_omni_key_right and g:ftplugin_sql_omni_key_left " when drilling in and out of a column list for a table. " -" Version 7.0 +" Version 7.0 (Jan 2010) " Better handling of object names " -" Version 6.0 +" Version 6.0 (Apr 2008) " Supports object names with spaces "my table name" " " Set completion with CTRL-X CTRL-O to autoloaded function. " This check is in place in case this script is -" sourced directly instead of using the autoload feature. +" sourced directly instead of using the autoload feature. if exists('&omnifunc') " Do not set the option if already set since this " results in an E117 warning. @@ -54,9 +101,11 @@ endif if exists('g:loaded_sql_completion') - finish + finish endif -let g:loaded_sql_completion = 100 +let g:loaded_sql_completion = 150 +let s:keepcpo= &cpo +set cpo&vim " Maintains filename of dictionary let s:sql_file_table = "" @@ -69,17 +118,19 @@ let s:tbl_cols = [] let s:syn_list = [] let s:syn_value = [] - + " Used in conjunction with the syntaxcomplete plugin let s:save_inc = "" let s:save_exc = "" -if exists('g:omni_syntax_group_include_sql') - let s:save_inc = g:omni_syntax_group_include_sql +if !exists('g:omni_syntax_group_include_sql') + let g:omni_syntax_group_include_sql = '' endif -if exists('g:omni_syntax_group_exclude_sql') - let s:save_exc = g:omni_syntax_group_exclude_sql +if !exists('g:omni_syntax_group_exclude_sql') + let g:omni_syntax_group_exclude_sql = '' endif - +let s:save_inc = g:omni_syntax_group_include_sql +let s:save_exc = g:omni_syntax_group_exclude_sql + " Used with the column list let s:save_prev_table = "" @@ -90,12 +141,12 @@ " Default syntax items to precache if !exists('g:omni_sql_precache_syntax_groups') let g:omni_sql_precache_syntax_groups = [ - \ 'syntax', - \ 'sqlKeyword', - \ 'sqlFunction', - \ 'sqlOption', - \ 'sqlType', - \ 'sqlStatement' + \ 'syntax\w*', + \ 'sqlKeyword\w*', + \ 'sqlFunction\w*', + \ 'sqlOption\w*', + \ 'sqlType\w*', + \ 'sqlStatement\w*' \ ] endif " Set ignorecase to the ftplugin standard @@ -110,14 +161,25 @@ if g:loaded_dbext >= 300 " New to dbext 3.00, by default the table lists include the owner " name of the table. This is used when determining how much of - " whatever has been typed should be replaced as part of the + " whatever has been typed should be replaced as part of the " code replacement. let g:omni_sql_include_owner = 1 endif endif endif +" Default type of completion used when is pressed +if !exists('g:omni_sql_default_compl_type') + let g:omni_sql_default_compl_type = 'table' +endif " This function is used for the 'omnifunc' option. +" It is called twice by omni and it is responsible +" for returning the completion list of items. +" But it must also determine context of what to complete +" and what to "replace" with the completion. +" The a:base, is replaced directly with what the user +" chooses from the choices. +" The s:prepend provides context for the completion. function! sqlcomplete#Complete(findstart, base) " Default to table name completion @@ -126,6 +188,7 @@ if exists('b:sql_compl_type') let compl_type = b:sql_compl_type endif + let begindot = 0 " First pass through this function determines how much of the line should " be replaced by whatever is chosen from the completion list @@ -134,13 +197,12 @@ let line = getline('.') let start = col('.') - 1 let lastword = -1 - let begindot = 0 " Check if the first character is a ".", for column completion if line[start - 1] == '.' let begindot = 1 endif while start > 0 - " Additional code was required to handle objects which + " Additional code was required to handle objects which " can contain spaces like "my table name". if line[start - 1] !~ '\(\w\|\.\)' " If the previous character is not a period or word character @@ -150,7 +212,7 @@ elseif line[start - 1] =~ '\w' " If the previous character is word character continue back let start -= 1 - elseif line[start - 1] =~ '\.' && + elseif line[start - 1] =~ '\.' && \ compl_type =~ 'column\|table\|view\|procedure' " If the previous character is a period and we are completing " an object which can be specified with a period like this: @@ -160,7 +222,10 @@ " If lastword has already been set for column completion " break from the loop, since we do not also want to pickup " a table name if it was also supplied. - if lastword != -1 && compl_type == 'column' + " Unless g:omni_sql_include_owner == 1, then we can + " include the ownername. + if lastword != -1 && compl_type == 'column' + \ && g:omni_sql_include_owner == 0 break endif " If column completion was specified stop at the "." if @@ -171,8 +236,8 @@ endif " If omni_sql_include_owner = 0, do not include the table " name as part of the substitution, so break here - if lastword == -1 && - \ compl_type =~ 'table\|view\|procedure\column_csv' && + if lastword == -1 && + \ compl_type =~ '\<\(table\|view\|procedure\|column\|column_csv\)\>' && \ g:omni_sql_include_owner == 0 let lastword = start break @@ -202,7 +267,7 @@ let compl_list = [] " Default to table name completion - let compl_type = 'table' + let compl_type = g:omni_sql_default_compl_type " Allow maps to specify what type of object completion they want if exists('b:sql_compl_type') let compl_type = b:sql_compl_type @@ -216,7 +281,7 @@ if compl_type == 'table' || \ compl_type == 'procedure' || - \ compl_type == 'view' + \ compl_type == 'view' " This type of completion relies upon the dbext.vim plugin if s:SQLCCheck4dbext() == -1 @@ -254,7 +319,7 @@ if base == "" " The last time we displayed a column list we stored - " the table name. If the user selects a column list + " the table name. If the user selects a column list " without a table name of alias present, assume they want " the previous column list displayed. let base = s:save_prev_table @@ -269,20 +334,26 @@ let table = matchstr( base, '^\(.*\.\)\?\zs.*\ze\..*' ) let column = matchstr( base, '.*\.\zs.*' ) + if g:omni_sql_include_owner == 1 && owner == '' && table != '' && column != '' + let owner = table + let table = column + let column = '' + endif + " It is pretty well impossible to determine if the user " has entered: " owner.table " table.column_prefix - " So there are a couple of things we can do to mitigate + " So there are a couple of things we can do to mitigate " this issue. " 1. Check if the dbext plugin has the option turned " on to even allow owners " 2. Based on 1, if the user is showing a table list - " and the DrillIntoTable (using ) then + " and the DrillIntoTable (using ) then " this will be owner.table. In this case, we can - " check to see the table.column exists in the + " check to see the table.column exists in the " cached table list. If it does, then we have - " determined the user has actually chosen + " determined the user has actually chosen " owner.table, not table.column_prefix. let found = -1 if g:omni_sql_include_owner == 1 && owner == '' @@ -297,17 +368,46 @@ " If the user has indicated not to use table owners at all and " the base ends in a '.' we know they are not providing a column " name, so we can shift the items appropriately. - if found != -1 || (g:omni_sql_include_owner == 0 && base !~ '\.$') - let owner = table - let table = column - let column = '' - endif + " if found != -1 || (g:omni_sql_include_owner == 0 && base !~ '\.$') + " let owner = table + " let table = column + " let column = '' + " endif else + " If no "." was provided and the user asked for + " column level completion, first attempt the match + " on any previous column lists. If the user asked + " for a list of columns comma separated, continue as usual. + if compl_type == 'column' && s:save_prev_table != '' + " The last time we displayed a column list we stored + " the table name. If the user selects a column list + " without a table name of alias present, assume they want + " the previous column list displayed. + let table = s:save_prev_table + let list_type = '' + + let compl_list = s:SQLCGetColumns(table, list_type) + if ! empty(compl_list) + " If no column prefix has been provided and the table + " name was provided, append it to each of the items + " returned. + let compl_list = filter(deepcopy(compl_list), 'v:val=~"^'.base.'"' ) + + " If not empty, we have a match on columns + " return the list + if ! empty(compl_list) + return compl_list + endif + endif + endif + " Since no columns were found to match the base supplied + " assume the user is trying to complete the column list + " for a table (and or an alias to a table). let table = base endif " Get anything after the . and consider this the table name - " If an owner has been specified, then we must consider the + " If an owner has been specified, then we must consider the " base to be a partial column name " let base = matchstr( base, '^\(.*\.\)\?\zs.*' ) @@ -322,16 +422,25 @@ let list_type = 'csv' endif - let compl_list = s:SQLCGetColumns(table, list_type) + " If we are including the OWNER for the objects, then for + " table completion, if we have it, it should be included + " as there can be the same table names in a database yet + " with different owner names. + if g:omni_sql_include_owner == 1 && owner != '' && table != '' + let compl_list = s:SQLCGetColumns(owner.'.'.table, list_type) + else + let compl_list = s:SQLCGetColumns(table, list_type) + endif + if column != '' " If no column prefix has been provided and the table " name was provided, append it to each of the items " returned. - let compl_list = map(compl_list, "table.'.'.v:val") + let compl_list = map(compl_list, 'table.".".v:val') if owner != '' " If an owner has been provided append it to each of the " items returned. - let compl_list = map(compl_list, "owner.'.'.v:val") + let compl_list = map(compl_list, 'owner.".".v:val') endif else let base = '' @@ -345,11 +454,14 @@ endif elseif compl_type == 'resetCache' " Reset all cached items - let s:tbl_name = [] - let s:tbl_alias = [] - let s:tbl_cols = [] - let s:syn_list = [] - let s:syn_value = [] + let s:tbl_name = [] + let s:tbl_alias = [] + let s:tbl_cols = [] + let s:syn_list = [] + let s:syn_value = [] + let s:sql_file_table = "" + let s:sql_file_procedure = "" + let s:sql_file_view = "" let msg = "All SQL cached items have been removed." call s:SQLCWarningMsg(msg) @@ -361,22 +473,41 @@ if base != '' " Filter the list based on the first few characters the user entered. - " Check if the text matches at the beginning - " or + " Check if the text matches at the beginning + " \\(^.base.'\\) + " or " Match to a owner.table or alias.column type match + " ^\\(\\w\\+\\.\\)\\?'.base.'\\) " or " Handle names with spaces "my table name" + " "\\(^'.base.'\\|^\\(\\w\\+\\.\\)\\?'.base.'\\)"' + " let expr = 'v:val '.(g:omni_sql_ignorecase==1?'=~?':'=~#').' "\\(^'.base.'\\|^\\(\\w\\+\\.\\)\\?'.base.'\\)"' " let expr = 'v:val '.(g:omni_sql_ignorecase==1?'=~?':'=~#').' "\\(^'.base.'\\)"' " let expr = 'v:val '.(g:omni_sql_ignorecase==1?'=~?':'=~#').' "\\(^'.base.'\\|\\(\\.\\)\\?'.base.'\\)"' " let expr = 'v:val '.(g:omni_sql_ignorecase==1?'=~?':'=~#').' "\\(^'.base.'\\|\\([^.]*\\)\\?'.base.'\\)"' let compl_list = filter(deepcopy(compl_list), expr) + + if empty(compl_list) && compl_type == 'table' && base =~ '\.$' + " It is possible we could be looking for column name completion + " and the user simply hit C-X C-O to lets try it as well + " since we had no hits with the tables. + " If the base ends with a . it is hard to know if we are + " completing table names or column names. + let list_type = '' + + let compl_list = s:SQLCGetColumns(base, list_type) + endif endif if exists('b:sql_compl_savefunc') && b:sql_compl_savefunc != "" let &omnifunc = b:sql_compl_savefunc endif + if empty(compl_list) + call s:SQLCWarningMsg( 'Could not find type['.compl_type.'] using prepend[.'.s:prepended.'] base['.a:base.']' ) + endif + return compl_list endfunc @@ -384,7 +515,7 @@ let syn_group_arr = [] let syn_items = [] - if a:0 > 0 + if a:0 > 0 if type(a:1) != 3 call s:SQLCWarningMsg("Parameter is not a list. Example:['syntaxGroup1', 'syntaxGroup2']") return '' @@ -407,7 +538,7 @@ function! sqlcomplete#ResetCacheSyntax(...) let syn_group_arr = [] - if a:0 > 0 + if a:0 > 0 if type(a:1) != 3 call s:SQLCWarningMsg("Parameter is not a list. Example:['syntaxGroup1', 'syntaxGroup2']") return '' @@ -458,7 +589,7 @@ " If the popup is not visible, simple perform the normal " key behaviour. " Must use exec since they key must be preceeded by "\" - " or feedkeys will simply push each character of the string + " or feedkeys will simply push each character of the string " rather than the "key press". exec 'call feedkeys("\'.g:ftplugin_sql_omni_key_right.'", "n")' endif @@ -475,7 +606,7 @@ " If the popup is not visible, simple perform the normal " key behaviour. " Must use exec since they key must be preceeded by "\" - " or feedkeys will simply push each character of the string + " or feedkeys will simply push each character of the string " rather than the "key press". exec 'call feedkeys("\'.g:ftplugin_sql_omni_key_left.'", "n")' endif @@ -484,16 +615,16 @@ function! s:SQLCWarningMsg(msg) echohl WarningMsg - echomsg 'SQLComplete:'.a:msg + echomsg 'SQLComplete:'.a:msg echohl None endfunction - + function! s:SQLCErrorMsg(msg) echohl ErrorMsg - echomsg 'SQLComplete:'.a:msg + echomsg 'SQLComplete:'.a:msg echohl None endfunction - + function! s:SQLCGetSyntaxList(syn_group) let syn_group = a:syn_group let compl_list = [] @@ -504,19 +635,23 @@ " Return previously cached value let compl_list = s:syn_value[list_idx] else - " Request the syntax list items from the + let s:save_inc = g:omni_syntax_group_include_sql + let s:save_exc = g:omni_syntax_group_exclude_sql + let g:omni_syntax_group_include_sql = '' + let g:omni_syntax_group_exclude_sql = '' + + " Request the syntax list items from the " syntax completion plugin if syn_group == 'syntax' " Handle this special case. This allows the user " to indicate they want all the syntax items available, " so do not specify a specific include list. - let g:omni_syntax_group_include_sql = '' + let syn_value = syntaxcomplete#OmniSyntaxList() else " The user has specified a specific syntax group let g:omni_syntax_group_include_sql = syn_group + let syn_value = syntaxcomplete#OmniSyntaxList(syn_group) endif - let g:omni_syntax_group_exclude_sql = '' - let syn_value = syntaxcomplete#OmniSyntaxList() let g:omni_syntax_group_include_sql = s:save_inc let g:omni_syntax_group_exclude_sql = s:save_exc " Cache these values for later use @@ -552,7 +687,7 @@ let table_alias = a:table_alias let cols = a:cols - if g:omni_sql_use_tbl_alias != 'n' + if g:omni_sql_use_tbl_alias != 'n' if table_alias == '' if 'da' =~? g:omni_sql_use_tbl_alias if table_name =~ '_' @@ -562,13 +697,13 @@ setlocal iskeyword-=_ " Get the first letter of each word - " [[:alpha:]] is used instead of \w + " [[:alpha:]] is used instead of \w " to catch extended accented characters " - let table_alias = substitute( - \ table_name, - \ '\<[[:alpha:]]\+\>_\?', - \ '\=strpart(submatch(0), 0, 1)', + let table_alias = substitute( + \ table_name, + \ '\<[[:alpha:]]\+\>_\?', + \ '\=strpart(submatch(0), 0, 1)', \ 'g' \ ) " Restore original value @@ -596,7 +731,7 @@ return cols endfunction -function! s:SQLCGetObjectOwner(object) +function! s:SQLCGetObjectOwner(object) " The owner regex matches a word at the start of the string which is " followed by a dot, but doesn't include the dot in the result. " ^ - from beginning of line @@ -609,11 +744,29 @@ " let owner = matchstr( a:object, '^\s*\zs.*\ze\.' ) let owner = matchstr( a:object, '^\("\|\[\)\?\zs\.\{-}\ze\("\|\]\)\?\.' ) return owner -endfunction +endfunction function! s:SQLCGetColumns(table_name, list_type) + if a:table_name =~ '\.' + " Check if the owner/creator has been specified + let owner = matchstr( a:table_name, '^\zs.*\ze\..*\..*' ) + let table = matchstr( a:table_name, '^\(.*\.\)\?\zs.*\ze\..*' ) + let column = matchstr( a:table_name, '.*\.\zs.*' ) + + if g:omni_sql_include_owner == 1 && owner == '' && table != '' && column != '' + let owner = table + let table = column + let column = '' + endif + else + let owner = '' + let table = matchstr(a:table_name, '^["\[\]a-zA-Z0-9_ ]\+\ze\.\?') + let column = '' + endif + " Check if the table name was provided as part of the column name - let table_name = matchstr(a:table_name, '^["\[\]a-zA-Z0-9_ ]\+\ze\.\?') + " let table_name = matchstr(a:table_name, '^["\[\]a-zA-Z0-9_ ]\+\ze\.\?') + let table_name = table let table_cols = [] let table_alias = '' let move_to_top = 1 @@ -636,7 +789,7 @@ if list_idx > -1 let table_cols = split(s:tbl_cols[list_idx], '\n') else - " Check if we have already cached the column list for this table + " Check if we have already cached the column list for this table " by its alias, assuming the table_name provided was actually " the alias for the table instead " select * @@ -654,7 +807,7 @@ " And the table ends in a "." or we are looking for a column list " if list_idx == -1 && (a:table_name =~ '\.' || b:sql_compl_type =~ 'column') " if list_idx == -1 && (a:table_name =~ '\.' || a:list_type =~ 'csv') - if list_idx == -1 + if list_idx == -1 let saveY = @y let saveSearch = @/ let saveWScan = &wrapscan @@ -665,7 +818,7 @@ setlocal nowrapscan " If . was entered, look at the word just before the . " We are looking for something like this: - " select * + " select * " from customer c " where c. " So when . is pressed, we need to find 'c' @@ -692,15 +845,15 @@ " if query =~? '^\c\(select\)' if query =~? '^\(select\|update\|delete\)' let found = 1 - " \(\(\<\w\+\>\)\.\)\? - + " \(\(\<\w\+\>\)\.\)\? - " '\c\(from\|join\|,\).\{-}' - Starting at the from clause (case insensitive) " '\zs\(\(\<\w\+\>\)\.\)\?' - Get the owner name (optional) - " '\<\w\+\>\ze' - Get the table name + " '\<\w\+\>\ze' - Get the table name " '\s\+\<'.table_name.'\>' - Followed by the alias " '\s*\.\@!.*' - Cannot be followed by a . " '\(\\|$\)' - Must be followed by a WHERE clause " '.*' - Exclude the rest of the line in the match - " let table_name_new = matchstr(@y, + " let table_name_new = matchstr(@y, " \ '\c\(from\|join\|,\).\{-}'. " \ '\zs\(\("\|\[\)\?.\{-}\("\|\]\)\.\)\?'. " \ '\("\|\[\)\?.\{-}\("\|\]\)\?\ze'. @@ -711,7 +864,16 @@ " \ '\(\\|$\)'. " \ '.*' " \ ) - let table_name_new = matchstr(@y, + " + " + " ''\c\(\\|\\|,\)\s*' - Starting at the from clause (case insensitive) + " '\zs\(\("\|\[\)\?\w\+\("\|\]\)\?\.\)\?' - Get the owner name (optional) + " '\("\|\[\)\?\w\+\("\|\]\)\?\ze' - Get the table name + " '\s\+\%(as\s\+\)\?\<'.matchstr(table_name, '.\{-}\ze\.\?$').'\>' - Followed by the alias + " '\s*\.\@!.*' - Cannot be followed by a . + " '\(\\|$\)' - Must be followed by a WHERE clause + " '.*' - Exclude the rest of the line in the match + let table_name_new = matchstr(@y, \ '\c\(\\|\\|,\)\s*'. \ '\zs\(\("\|\[\)\?\w\+\("\|\]\)\?\.\)\?'. \ '\("\|\[\)\?\w\+\("\|\]\)\?\ze'. @@ -725,7 +887,12 @@ if table_name_new != '' let table_alias = table_name - let table_name = matchstr( table_name_new, '^\(.*\.\)\?\zs.*\ze' ) + if g:omni_sql_include_owner == 1 + let table_name = matchstr( table_name_new, '^\zs\(.\{-}\.\)\?\(.\{-}\.\)\?.*\ze' ) + else + " let table_name = matchstr( table_name_new, '^\(.*\.\)\?\zs.*\ze' ) + let table_name = matchstr( table_name_new, '^\(.\{-}\.\)\?\zs\(.\{-}\.\)\?.*\ze' ) + endif let list_idx = index(s:tbl_name, table_name, 0, &ignorecase) if list_idx > -1 @@ -753,7 +920,7 @@ " Return to previous location call cursor(curline, curcol) - + if found == 0 if g:loaded_dbext > 300 exec 'DBSetOption use_tbl_alias='.saveSettingAlias @@ -762,12 +929,13 @@ " Not a SQL statement, do not display a list return [] endif - endif + endif if empty(table_cols) " Specify silent mode, no messages to the user (tbl, 1) " Specify do not comma separate (tbl, 1, 1) - let table_cols_str = DB_getListColumn(table_name, 1, 1) + " let table_cols_str = DB_getListColumn(table_name, 1, 1) + let table_cols_str = DB_getListColumn((owner!=''?owner.'.':'').table_name, 1, 1) if table_cols_str != "" let s:tbl_name = add( s:tbl_name, table_name ) @@ -793,3 +961,7 @@ return table_cols endfunction +" Restore: +let &cpo= s:keepcpo +unlet s:keepcpo +" vim: ts=4 fdm=marker diff -Naur vim73.orig/runtime/autoload/syntaxcomplete.vim vim73/runtime/autoload/syntaxcomplete.vim --- vim73.orig/runtime/autoload/syntaxcomplete.vim 2010-07-29 19:21:15.000000000 +0000 +++ vim73/runtime/autoload/syntaxcomplete.vim 2013-06-07 17:07:06.905655620 +0000 @@ -1,38 +1,80 @@ " Vim completion script " Language: All languages, uses existing syntax highlighting rules " Maintainer: David Fishburn -" Version: 7.0 -" Last Change: 2010 Jul 29 -" Usage: For detailed help, ":help ft-syntax-omni" +" Version: 13.0 +" Last Change: 2013 May 14 +" Usage: For detailed help, ":help ft-syntax-omni" " History " +" Version 13.0 +" - Extended the option omni_syntax_group_include_{filetype} +" to accept a comma separated list of regex's rather than +" string. For example, for the javascript filetype you could +" use: +" let g:omni_syntax_group_include_javascript = 'javascript\w\+,jquery\w\+' +" - Some syntax files (perl.vim) use the match // syntax as a mechanism +" to identify keywords. This update attempts to parse the +" match syntax and pull out syntax items which are at least +" 3 words or more. +" +" Version 12.0 +" - It is possible to have '-' as part of iskeyword, when +" checking for character ranges, tighten up the regex. +" E688: More targets than List items. +" +" Version 11.0 +" - Corrected which characters required escaping during +" substitution calls. +" +" Version 10.0 +" - Cycle through all the character ranges specified in the +" iskeyword option and build a list of valid word separators. +" Prior to this change, only actual characters were used, +" where for example ASCII "45" == "-". If "45" were used +" in iskeyword the hyphen would not be picked up. +" This introduces a new option, since the character ranges +" specified could be multibyte: +" let g:omni_syntax_use_single_byte = 1 +" - This by default will only allow single byte ASCII +" characters to be added and an additional check to ensure +" the charater is printable (see documentation for isprint). +" +" Version 9.0 +" - Add the check for cpo. +" +" Version 8.0 +" - Updated SyntaxCSyntaxGroupItems() +" - Some additional syntax items were also allowed +" on nextgroup= lines which were ignored by default. +" Now these lines are processed independently. +" " Version 7.0 -" Updated syntaxcomplete#OmniSyntaxList() +" - Updated syntaxcomplete#OmniSyntaxList() " - Looking up the syntax groups defined from a syntax file -" looked for only 1 format of {filetype}GroupName, but some +" looked for only 1 format of {filetype}GroupName, but some " syntax writers use this format as well: " {b:current_syntax}GroupName -" OmniSyntaxList() will now check for both if the first +" - OmniSyntaxList() will now check for both if the first " method does not find a match. " " Version 6.0 -" Added syntaxcomplete#OmniSyntaxList() -" - Allows other plugins to use this for their own +" - Added syntaxcomplete#OmniSyntaxList() +" - Allows other plugins to use this for their own " purposes. " - It will return a List of all syntax items for the -" syntax group name passed in. -" - XPTemplate for SQL will use this function via the +" syntax group name passed in. +" - XPTemplate for SQL will use this function via the " sqlcomplete plugin to populate a Choose box. " " Version 5.0 -" Updated SyntaxCSyntaxGroupItems() +" - Updated SyntaxCSyntaxGroupItems() " - When processing a list of syntax groups, the final group " was missed in function SyntaxCSyntaxGroupItems. " " Set completion with CTRL-X CTRL-O to autoloaded function. " This check is in place in case this script is -" sourced directly instead of using the autoload feature. +" sourced directly instead of using the autoload feature. if exists('+omnifunc') " Do not set the option if already set since this " results in an E117 warning. @@ -42,9 +84,13 @@ endif if exists('g:loaded_syntax_completion') - finish + finish endif -let g:loaded_syntax_completion = 70 +let g:loaded_syntax_completion = 130 + +" Turn on support for line continuations when creating the script +let s:cpo_save = &cpo +set cpo&vim " Set ignorecase to the ftplugin standard " This is the default setting, but if you define a buffer local @@ -61,6 +107,18 @@ let g:omni_syntax_use_iskeyword = 1 endif +" When using iskeyword, this setting controls whether the characters +" should be limited to single byte characters. +if !exists('g:omni_syntax_use_single_byte') + let g:omni_syntax_use_single_byte = 1 +endif + +" When using iskeyword, this setting controls whether the characters +" should be limited to single byte characters. +if !exists('g:omni_syntax_use_iskeyword_numeric') + let g:omni_syntax_use_iskeyword_numeric = 1 +endif + " Only display items in the completion window that are at least " this many characters in length. " This is the default setting, but if you define a buffer local @@ -71,8 +129,10 @@ " This script will build a completion list based on the syntax " elements defined by the files in $VIMRUNTIME/syntax. -let s:syn_remove_words = 'match,matchgroup=,contains,'. - \ 'links to,start=,end=,nextgroup=' +" let s:syn_remove_words = 'match,matchgroup=,contains,'. +let s:syn_remove_words = 'matchgroup=,contains,'. + \ 'links to,start=,end=' + " \ 'links to,start=,end=,nextgroup=' let s:cache_name = [] let s:cache_list = [] @@ -151,7 +211,7 @@ function! syntaxcomplete#OmniSyntaxList(...) if a:0 > 0 let parms = [] - if 3 == type(a:1) + if 3 == type(a:1) let parms = a:1 elseif 1 == type(a:1) let parms = split(a:1, ',') @@ -165,7 +225,7 @@ function! OmniSyntaxList(...) let list_parms = [] if a:0 > 0 - if 3 == type(a:1) + if 3 == type(a:1) let list_parms = a:1 elseif 1 == type(a:1) let list_parms = split(a:1, ',') @@ -201,18 +261,18 @@ let saveL = @l let filetype = substitute(&filetype, '\.', '_', 'g') - + if empty(list_parms) " Default the include group to include the requested syntax group let syntax_group_include_{filetype} = '' " Check if there are any overrides specified for this filetype if exists('g:omni_syntax_group_include_'.filetype) let syntax_group_include_{filetype} = - \ substitute( g:omni_syntax_group_include_{filetype},'\s\+','','g') + \ substitute( g:omni_syntax_group_include_{filetype},'\s\+','','g') let list_parms = split(g:omni_syntax_group_include_{filetype}, ',') if syntax_group_include_{filetype} =~ '\w' - let syntax_group_include_{filetype} = - \ substitute( syntax_group_include_{filetype}, + let syntax_group_include_{filetype} = + \ substitute( syntax_group_include_{filetype}, \ '\s*,\s*', '\\|', 'g' \ ) endif @@ -222,24 +282,34 @@ endif " Loop through all the syntax groupnames, and build a - " syntax file which contains these names. This can + " syntax file which contains these names. This can " work generically for any filetype that does not already " have a plugin defined. " This ASSUMES the syntax groupname BEGINS with the name - " of the filetype. From my casual viewing of the vim7\syntax + " of the filetype. From my casual viewing of the vim7\syntax " directory this is true for almost all syntax definitions. " As an example, the SQL syntax groups have this pattern: " sqlType " sqlOperators " sqlKeyword ... - redir @l - silent! exec 'syntax list '.join(list_parms) - redir END + if !empty(list_parms) && empty(substitute(join(list_parms), '[a-zA-Z ]', '', 'g')) + " If list_parms only includes word characters, use it to limit + " the syntax elements. + " If using regex syntax list will fail to find those items, so + " simply grab the who syntax list. + redir @l + silent! exec 'syntax list '.join(list_parms) + redir END + else + redir @l + silent! exec 'syntax list' + redir END + endif let syntax_full = "\n".@l let @l = saveL - if syntax_full =~ 'E28' + if syntax_full =~ 'E28' \ || syntax_full =~ 'E411' \ || syntax_full =~ 'E415' \ || syntax_full =~ 'No Syntax items' @@ -249,7 +319,7 @@ let filetype = substitute(&filetype, '\.', '_', 'g') let list_exclude_groups = [] - if a:0 > 0 + if a:0 > 0 " Do nothing since we have specific a specific list of groups else " Default the exclude group to nothing @@ -257,93 +327,178 @@ " Check if there are any overrides specified for this filetype if exists('g:omni_syntax_group_exclude_'.filetype) let syntax_group_exclude_{filetype} = - \ substitute( g:omni_syntax_group_exclude_{filetype},'\s\+','','g') + \ substitute( g:omni_syntax_group_exclude_{filetype},'\s\+','','g') let list_exclude_groups = split(g:omni_syntax_group_exclude_{filetype}, ',') - if syntax_group_exclude_{filetype} =~ '\w' - let syntax_group_exclude_{filetype} = - \ substitute( syntax_group_exclude_{filetype}, + if syntax_group_exclude_{filetype} =~ '\w' + let syntax_group_exclude_{filetype} = + \ substitute( syntax_group_exclude_{filetype}, \ '\s*,\s*', '\\|', 'g' \ ) endif endif endif - " Sometimes filetypes can be composite names, like c.doxygen - " Loop through each individual part looking for the syntax - " items specific to each individual filetype. - let syn_list = '' - let ftindex = 0 - let ftindex = match(&filetype, '\w\+', ftindex) - - while ftindex > -1 - let ft_part_name = matchstr( &filetype, '\w\+', ftindex ) + if empty(list_parms) + let list_parms = [&filetype.'\w\+'] + endif - " Syntax rules can contain items for more than just the current - " filetype. They can contain additional items added by the user - " via autocmds or their vimrc. - " Some syntax files can be combined (html, php, jsp). - " We want only items that begin with the filetype we are interested in. - let next_group_regex = '\n' . - \ '\zs'.ft_part_name.'\w\+\ze'. - \ '\s\+xxx\s\+' - let index = 0 - let index = match(syntax_full, next_group_regex, index) - - if index == -1 && exists('b:current_syntax') && ft_part_name != b:current_syntax - " There appears to be two standards when writing syntax files. - " Either items begin as: - " syn keyword {filetype}Keyword values ... - " let b:current_syntax = "sql" - " let b:current_syntax = "sqlanywhere" - " Or - " syn keyword {syntax_filename}Keyword values ... - " let b:current_syntax = "mysql" - " So, we will make the format of finding the syntax group names - " a bit more flexible and look for both if the first fails to - " find a match. + let syn_list = '' + let index = 0 + for group_regex in list_parms + " Sometimes filetypes can be composite names, like c.doxygen + " Loop through each individual part looking for the syntax + " items specific to each individual filetype. + " let ftindex = 0 + " let ftindex = match(syntax_full, group_regex, ftindex) + + " while ftindex > -1 + " let ft_part_name = matchstr( syntax_full, '\w\+', ftindex ) + + " Syntax rules can contain items for more than just the current + " filetype. They can contain additional items added by the user + " via autocmds or their vimrc. + " Some syntax files can be combined (html, php, jsp). + " We want only items that begin with the filetype we are interested in. let next_group_regex = '\n' . - \ '\zs'.b:current_syntax.'\w\+\ze'. - \ '\s\+xxx\s\+' - let index = 0 + \ '\zs'.group_regex.'\ze'. + \ '\s\+xxx\s\+' let index = match(syntax_full, next_group_regex, index) - endif - while index > -1 - let group_name = matchstr( syntax_full, '\w\+', index ) - - let get_syn_list = 1 - for exclude_group_name in list_exclude_groups - if '\<'.exclude_group_name.'\>' =~ '\<'.group_name.'\>' - let get_syn_list = 0 - endif - endfor - - " This code is no longer needed in version 6.0 since we have - " augmented the syntax list command to only retrieve the syntax - " groups we are interested in. - " - " if get_syn_list == 1 - " if syntax_group_include_{filetype} != '' - " if '\<'.syntax_group_include_{filetype}.'\>' !~ '\<'.group_name.'\>' - " let get_syn_list = 0 - " endif - " endif - " endif - - if get_syn_list == 1 - " Pass in the full syntax listing, plus the group name we - " are interested in. - let extra_syn_list = s:SyntaxCSyntaxGroupItems(group_name, syntax_full) - let syn_list = syn_list . extra_syn_list . "\n" + " For the matched group name, strip off any of the regex special + " characters and see if we get a match with the current syntax + if index == -1 && exists('b:current_syntax') && substitute(group_regex, '[^a-zA-Z ]\+.*', '', 'g') !~ '^'.b:current_syntax + " There appears to be two standards when writing syntax files. + " Either items begin as: + " syn keyword {filetype}Keyword values ... + " let b:current_syntax = "sql" + " let b:current_syntax = "sqlanywhere" + " Or + " syn keyword {syntax_filename}Keyword values ... + " let b:current_syntax = "mysql" + " So, we will make the format of finding the syntax group names + " a bit more flexible and look for both if the first fails to + " find a match. + let next_group_regex = '\n' . + \ '\zs'.b:current_syntax.'\w\+\ze'. + \ '\s\+xxx\s\+' + let index = 0 + let index = match(syntax_full, next_group_regex, index) endif - let index = index + strlen(group_name) - let index = match(syntax_full, next_group_regex, index) - endwhile + while index > -1 + let group_name = matchstr( syntax_full, '\w\+', index ) + + let get_syn_list = 1 + for exclude_group_name in list_exclude_groups + if '\<'.exclude_group_name.'\>' =~ '\<'.group_name.'\>' + let get_syn_list = 0 + endif + endfor + + " This code is no longer needed in version 6.0 since we have + " augmented the syntax list command to only retrieve the syntax + " groups we are interested in. + " + " if get_syn_list == 1 + " if syntax_group_include_{filetype} != '' + " if '\<'.syntax_group_include_{filetype}.'\>' !~ '\<'.group_name.'\>' + " let get_syn_list = 0 + " endif + " endif + " endif + + if get_syn_list == 1 + " Pass in the full syntax listing, plus the group name we + " are interested in. + let extra_syn_list = s:SyntaxCSyntaxGroupItems(group_name, syntax_full) + let syn_list = syn_list . extra_syn_list . "\n" + endif - let ftindex = ftindex + len(ft_part_name) - let ftindex = match( &filetype, '\w\+', ftindex ) - endwhile + let index = index + strlen(group_name) + let index = match(syntax_full, next_group_regex, index) + endwhile + + " let ftindex = ftindex + len(ft_part_name) + " let ftindex = match( syntax_full, group_regex, ftindex ) + " endwhile + endfor + +" " Sometimes filetypes can be composite names, like c.doxygen +" " Loop through each individual part looking for the syntax +" " items specific to each individual filetype. +" let syn_list = '' +" let ftindex = 0 +" let ftindex = match(&filetype, '\w\+', ftindex) + +" while ftindex > -1 +" let ft_part_name = matchstr( &filetype, '\w\+', ftindex ) + +" " Syntax rules can contain items for more than just the current +" " filetype. They can contain additional items added by the user +" " via autocmds or their vimrc. +" " Some syntax files can be combined (html, php, jsp). +" " We want only items that begin with the filetype we are interested in. +" let next_group_regex = '\n' . +" \ '\zs'.ft_part_name.'\w\+\ze'. +" \ '\s\+xxx\s\+' +" let index = 0 +" let index = match(syntax_full, next_group_regex, index) + +" if index == -1 && exists('b:current_syntax') && ft_part_name != b:current_syntax +" " There appears to be two standards when writing syntax files. +" " Either items begin as: +" " syn keyword {filetype}Keyword values ... +" " let b:current_syntax = "sql" +" " let b:current_syntax = "sqlanywhere" +" " Or +" " syn keyword {syntax_filename}Keyword values ... +" " let b:current_syntax = "mysql" +" " So, we will make the format of finding the syntax group names +" " a bit more flexible and look for both if the first fails to +" " find a match. +" let next_group_regex = '\n' . +" \ '\zs'.b:current_syntax.'\w\+\ze'. +" \ '\s\+xxx\s\+' +" let index = 0 +" let index = match(syntax_full, next_group_regex, index) +" endif + +" while index > -1 +" let group_name = matchstr( syntax_full, '\w\+', index ) + +" let get_syn_list = 1 +" for exclude_group_name in list_exclude_groups +" if '\<'.exclude_group_name.'\>' =~ '\<'.group_name.'\>' +" let get_syn_list = 0 +" endif +" endfor + +" " This code is no longer needed in version 6.0 since we have +" " augmented the syntax list command to only retrieve the syntax +" " groups we are interested in. +" " +" " if get_syn_list == 1 +" " if syntax_group_include_{filetype} != '' +" " if '\<'.syntax_group_include_{filetype}.'\>' !~ '\<'.group_name.'\>' +" " let get_syn_list = 0 +" " endif +" " endif +" " endif + +" if get_syn_list == 1 +" " Pass in the full syntax listing, plus the group name we +" " are interested in. +" let extra_syn_list = s:SyntaxCSyntaxGroupItems(group_name, syntax_full) +" let syn_list = syn_list . extra_syn_list . "\n" +" endif + +" let index = index + strlen(group_name) +" let index = match(syntax_full, next_group_regex, index) +" endwhile + +" let ftindex = ftindex + len(ft_part_name) +" let ftindex = match( &filetype, '\w\+', ftindex ) +" endwhile " Convert the string to a List and sort it. let compl_list = sort(split(syn_list)) @@ -385,7 +540,7 @@ " \| - 2nd potential match " \%$ - matches end of the file or string " \) - end a group - let syntax_group = matchstr(a:syntax_full, + let syntax_group = matchstr(a:syntax_full, \ "\n".a:group_name.'\s\+xxx\s\+\zs.\{-}\ze\(\n\w\|\%$\)' \ ) @@ -395,26 +550,97 @@ " We only want the words for the lines begining with " containedin, but there could be other items. - + " Tried to remove all lines that do not begin with contained " but this does not work in all cases since you can have " contained nextgroup=... " So this will strip off the ending of lines with known " keywords. - let syn_list = substitute( + let syn_list = substitute( \ syntax_group, '\<\('. \ substitute( \ escape(s:syn_remove_words, '\\/.*$^~[]') \ , ',', '\\|', 'g' \ ). \ '\).\{-}\%($\|'."\n".'\)' - \ , "\n", 'g' + \ , "\n", 'g' \ ) - " Now strip off the newline + blank space + contained - let syn_list = substitute( - \ syn_list, '\%(^\|\n\)\@<=\s*\<\(contained\)' - \ , "", 'g' + " Attempt to deal with lines using the match syntax + " javaScriptDocTags xxx match /@\(param\|argument\|requires\|file\)\>/ + " Though it can use any types of regex, so this plugin will attempt + " to restrict it + " 1. Only use \( or \%( constructs remove all else + " 2 Remove and []s + " 3. Account for match //constructs + " \%(\%(ms\|me\|hs\|he\|rs\|re\|lc\)\S\+\)\? + " 4. Hope for the best + " + " + let syn_list_old = syn_list + while syn_list =~ '\\s\+\/' + if syn_list =~ 'perlElseIfError' + let syn_list = syn_list + endif + " Check if the match has words at least 3 characters long + if syn_list =~ '\.\{-}\ze\\\@\ze.\{-}\\\@.\{-}\ze\/ ', "", 'g' ) + " let syn_list = substitute( syn_list, '\%(\\s\+\/' + " Problem removing the match / / tags + let syn_list = '' + endif + endwhile + + + " Now strip off the newline + blank space + contained. + " Also include lines with nextgroup=@someName skip_key_words syntax_element + " \ syn_list, '\%(^\|\n\)\@<=\s*\<\(contained\|nextgroup=\)' + " \ syn_list, '\%(^\|\n\)\@<=\s*\<\(contained\|nextgroup=[@a-zA-Z,]*\)' + let syn_list = substitute( + \ syn_list, '\<\(contained\|nextgroup=[@a-zA-Z,]*\)' + \ , "", 'g' + \ ) + + " This can leave lines like this + " =@vimMenuList skipwhite onoremenu + " Strip the special option keywords first + " :h :syn-skipwhite* + let syn_list = substitute( + \ syn_list, '\<\(skipwhite\|skipnl\|skipempty\)\>' + \ , "", 'g' + \ ) + + " Now remove the remainder of the nextgroup=@someName lines + let syn_list = substitute( + \ syn_list, '\%(^\|\n\)\@<=\s*\(@\w\+\)' + \ , "", 'g' \ ) if b:omni_syntax_use_iskeyword == 0 @@ -423,19 +649,74 @@ " This will replace non-word characters with spaces. let syn_list = substitute( syn_list, '[^0-9A-Za-z_ ]', ' ', 'g' ) else - let accept_chars = ','.&iskeyword.',' - " Remove all character ranges - " let accept_chars = substitute(accept_chars, ',[^,]\+-[^,]\+,', ',', 'g') - let accept_chars = substitute(accept_chars, ',\@<=[^,]\+-[^,]\+,', '', 'g') - " Remove all numeric specifications - " let accept_chars = substitute(accept_chars, ',\d\{-},', ',', 'g') - let accept_chars = substitute(accept_chars, ',\@<=\d\{-},', '', 'g') - " Remove all commas - let accept_chars = substitute(accept_chars, ',', '', 'g') - " Escape special regex characters - let accept_chars = escape(accept_chars, '\\/.*$^~[]' ) - " Remove all characters that are not acceptable - let syn_list = substitute( syn_list, '[^0-9A-Za-z_ '.accept_chars.']', ' ', 'g' ) + if g:omni_syntax_use_iskeyword_numeric == 1 + " iskeyword can contain value like this + " 38,42,43,45,47-58,60-62,64-90,97-122,_,+,-,*,/,%,<,=,>,:,$,?,!,@-@,94 + " Numeric values convert to their ASCII equivalent using the + " nr2char() function. + " & 38 + " * 42 + " + 43 + " - 45 + " ^ 94 + " Iterate through all numeric specifications and convert those + " to their ascii equivalent ensuring the character is printable. + " If so, add it to the list. + let accepted_chars = '' + for item in split(&iskeyword, ',') + if item =~ '\d-\d' + " This is a character range (ie 47-58), + " cycle through each character within the range + let [b:start, b:end] = split(item, '-') + for range_item in range( b:start, b:end ) + if range_item <= 127 || g:omni_syntax_use_single_byte == 0 + if nr2char(range_item) =~ '\p' + let accepted_chars = accepted_chars . nr2char(range_item) + endif + endif + endfor + elseif item =~ '^\d\+$' + " Only numeric, translate to a character + if item < 127 || g:omni_syntax_use_single_byte == 0 + if nr2char(item) =~ '\p' + let accepted_chars = accepted_chars . nr2char(item) + endif + endif + else + if char2nr(item) < 127 || g:omni_syntax_use_single_byte == 0 + if item =~ '\p' + let accepted_chars = accepted_chars . item + endif + endif + endif + endfor + " Escape special regex characters + " Looks like the wrong chars are escaped. In a collection, + " :h /[] + " only `]', `\', `-' and `^' are special: + " let accepted_chars = escape(accepted_chars, '\\/.*$^~[]' ) + let accepted_chars = escape(accepted_chars, ']\-^' ) + " Remove all characters that are not acceptable + let syn_list = substitute( syn_list, '[^A-Za-z'.accepted_chars.']', ' ', 'g' ) + else + let accept_chars = ','.&iskeyword.',' + " Remove all character ranges + " let accept_chars = substitute(accept_chars, ',[^,]\+-[^,]\+,', ',', 'g') + let accept_chars = substitute(accept_chars, ',\@<=[^,]\+-[^,]\+,', '', 'g') + " Remove all numeric specifications + " let accept_chars = substitute(accept_chars, ',\d\{-},', ',', 'g') + let accept_chars = substitute(accept_chars, ',\@<=\d\{-},', '', 'g') + " Remove all commas + let accept_chars = substitute(accept_chars, ',', '', 'g') + " Escape special regex characters + " Looks like the wrong chars are escaped. In a collection, + " :h /[] + " only `]', `\', `-' and `^' are special: + " let accept_chars = escape(accept_chars, '\\/.*$^~[]' ) + let accept_chars = escape(accept_chars, ']\-^' ) + " Remove all characters that are not acceptable + let syn_list = substitute( syn_list, '[^0-9A-Za-z_'.accept_chars.']', ' ', 'g' ) + endif endif if b:omni_syntax_minimum_length > 0 @@ -448,3 +729,27 @@ return syn_list endfunction + +function! OmniSyntaxShowChars(spec) + let result = [] + for item in split(a:spec, ',') + if len(item) > 1 + if item == '@-@' + call add(result, char2nr(item)) + else + call extend(result, call('range', split(item, '-'))) + endif + else + if item == '@' " assume this is [A-Za-z] + for [c1, c2] in [['A', 'Z'], ['a', 'z']] + call extend(result, range(char2nr(c1), char2nr(c2))) + endfor + else + call add(result, char2nr(item)) + endif + endif + endfor + return join(map(result, 'nr2char(v:val)'), ', ') +endfunction +let &cpo = s:cpo_save +unlet s:cpo_save diff -Naur vim73.orig/runtime/autoload/tar.vim vim73/runtime/autoload/tar.vim --- vim73.orig/runtime/autoload/tar.vim 2010-08-10 00:02:24.000000000 +0000 +++ vim73/runtime/autoload/tar.vim 2013-06-07 17:07:06.915655592 +0000 @@ -1,13 +1,13 @@ " tar.vim: Handles browsing tarfiles " AUTOLOAD PORTION -" Date: Aug 09, 2010 -" Version: 26 -" Maintainer: Charles E Campbell, Jr +" Date: Apr 17, 2013 +" Version: 29 +" Maintainer: Charles E Campbell " License: Vim License (see vim's :help license) " " Contains many ideas from Michael Toren's " -" Copyright: Copyright (C) 2005-2009 Charles E. Campbell, Jr. {{{1 +" Copyright: Copyright (C) 2005-2011 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright " notice is copied with it. Like anything else that's free, @@ -22,7 +22,7 @@ if &cp || exists("g:loaded_tar") finish endif -let g:loaded_tar= "v26" +let g:loaded_tar= "v29" if v:version < 702 echohl WarningMsg echo "***warning*** this version of tar needs vim 7.2" @@ -31,6 +31,7 @@ endif let s:keepcpo= &cpo set cpo&vim +"DechoTabOn "call Decho("loading autoload/tar.vim") " --------------------------------------------------------------------- @@ -47,6 +48,17 @@ if !exists("g:tar_writeoptions") let g:tar_writeoptions= "uf" endif +if !exists("g:netrw_cygwin") + if has("win32") || has("win95") || has("win64") || has("win16") + if &shell =~ '\%(\\|\\)\%(\.exe\)\=$' + let g:netrw_cygwin= 1 + else + let g:netrw_cygwin= 0 + endif + else + let g:netrw_cygwin= 0 + endif +endif if !exists("g:tar_copycmd") if !exists("g:netrw_localcopycmd") if has("win32") || has("win95") || has("win64") || has("win16") @@ -63,24 +75,13 @@ endif let g:tar_copycmd= g:netrw_localcopycmd endif -if !exists("g:netrw_cygwin") - if has("win32") || has("win95") || has("win64") || has("win16") - if &shell =~ '\%(\\|\\)\%(\.exe\)\=$' - let g:netrw_cygwin= 1 - else - let g:netrw_cygwin= 0 - endif - else - let g:netrw_cygwin= 0 - endif -endif if !exists("g:tar_extractcmd") let g:tar_extractcmd= "tar -xf" endif " set up shell quoting character if !exists("g:tar_shq") - if exists("&shq") && &shq != "" + if exists("+shq") && exists("&shq") && &shq != "" let g:tar_shq= &shq elseif has("win32") || has("win95") || has("win64") || has("win16") if exists("g:netrw_cygwin") && g:netrw_cygwin @@ -142,38 +143,38 @@ call setline(lastline+1,'" tar.vim version '.g:loaded_tar) call setline(lastline+2,'" Browsing tarfile '.a:tarfile) call setline(lastline+3,'" Select a file with cursor and press ENTER') - $put ='' - 0d - $ + keepj $put ='' + keepj sil! 0d + keepj $ let tarfile= a:tarfile - if has("win32") && executable("cygpath") + if has("win32unix") && executable("cygpath") " assuming cygwin let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') endif let curlast= line("$") if tarfile =~# '\.\(gz\|tgz\)$' " call Decho("1: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") - exe "silent r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " + exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " elseif tarfile =~# '\.lrp' " call Decho("2: exe silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - ") - exe "silent r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - " - elseif tarfile =~# '\.bz2$' + exe "sil! r! cat -- ".shellescape(tarfile,1)."|gzip -d -c -|".g:tar_cmd." -".g:tar_browseoptions." - " + elseif tarfile =~# '\.\(bz2\|tbz\|tb2\)$' " call Decho("3: exe silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") - exe "silent r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " - elseif tarfile =~# '\.lzma$' + exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " + elseif tarfile =~# '\.\(lzma\|tlz\)$' " call Decho("3: exe silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") - exe "silent r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " + exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " elseif tarfile =~# '\.\(xz\|txz\)$' " call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - ") - exe "silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " + exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_browseoptions." - " else if tarfile =~ '^\s*-' " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. let tarfile = substitute(tarfile, '-', './-', '') endif " call Decho("4: exe silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,0)) - exe "silent r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1) + exe "sil! r! ".g:tar_cmd." -".g:tar_browseoptions." ".shellescape(tarfile,1) endif if v:shell_error != 0 redraw! @@ -184,12 +185,12 @@ if line("$") == curlast || ( line("$") == (curlast + 1) && getline("$") =~ '\c\%(warning\|error\|inappropriate\|unrecognized\)') redraw! echohl WarningMsg | echo "***warning*** (tar#Browse) ".a:tarfile." doesn't appear to be a tar file" | echohl None - silent %d + keepj sil! %d let eikeep= &ei set ei=BufReadCmd,FileReadCmd exe "r ".fnameescape(a:tarfile) let &ei= eikeep - 1d + keepj sil! 1d " call Dret("tar#Browse : a:tarfile<".a:tarfile.">") return endif @@ -227,7 +228,7 @@ " about to make a new window, need to use b:tarfile let tarfile= b:tarfile let curfile= expand("%") - if has("win32") && executable("cygpath") + if has("win32unix") && executable("cygpath") " assuming cygwin let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') endif @@ -239,6 +240,8 @@ let s:tblfile_{winnr()}= curfile call tar#Read("tarfile:".tarfile.'::'.fname,1) filetype detect + set nomod + exe 'com! -buffer -nargs=? -complete=file TarDiff :call tar#Diff(,"'.fnameescape(fname).'")' let &report= repkeep " call Dret("TarBrowseSelect : s:tblfile_".winnr()."<".s:tblfile_{winnr()}.">") @@ -252,7 +255,7 @@ set report=10 let tarfile = substitute(a:fname,'tarfile:\(.\{-}\)::.*$','\1','') let fname = substitute(a:fname,'tarfile:.\{-}::\(.*\)$','\1','') - if has("win32") && executable("cygpath") + if has("win32unix") && executable("cygpath") " assuming cygwin let tarfile=substitute(system("cygpath -u ".shellescape(tarfile,0)),'\n$','','e') endif @@ -286,19 +289,19 @@ endif if tarfile =~# '\.bz2$' " call Decho("7: exe silent r! bzip2 -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp) - exe "silent r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp + exe "sil! r! bzip2 -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp elseif tarfile =~# '\.\(gz\|tgz\)$' " call Decho("5: exe silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd.' -'.g:tar_readoptions.' - '.tar_secure.shellescape(fname,1)) - exe "silent r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp + exe "sil! r! gzip -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp elseif tarfile =~# '\.lrp$' " call Decho("6: exe silent r! cat ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp) - exe "silent r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp + exe "sil! r! cat -- ".shellescape(tarfile,1)." | gzip -d -c - | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp elseif tarfile =~# '\.lzma$' " call Decho("7: exe silent r! lzma -d -c ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp) - exe "silent r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp + exe "sil! r! lzma -d -c -- ".shellescape(tarfile,1)."| ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp elseif tarfile =~# '\.\(xz\|txz\)$' " call Decho("3: exe silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp) - exe "silent r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp + exe "sil! r! xz --decompress --stdout -- ".shellescape(tarfile,1)." | ".g:tar_cmd." -".g:tar_readoptions." - ".tar_secure.shellescape(fname,1).decmp else if tarfile =~ '^\s*-' " A file name starting with a dash is taken as an option. Prepend ./ to avoid that. @@ -317,7 +320,7 @@ exe "file tarfile::".fnameescape(fname) " cleanup - 0d + keepj sil! 0d set nomod let &report= repkeep @@ -425,7 +428,7 @@ if fname =~ '/' let dirpath = substitute(fname,'/[^/]\+$','','e') - if executable("cygpath") + if has("win32unix") && executable("cygpath") let dirpath = substitute(system("cygpath ".shellescape(dirpath, 0)),'\n','','e') endif call mkdir(dirpath,"p") @@ -445,7 +448,7 @@ let tar_secure= " " endif exe "w! ".fnameescape(fname) - if executable("cygpath") + if has("win32unix") && executable("cygpath") let tarfile = substitute(system("cygpath ".shellescape(tarfile,0)),'\n','','e') endif @@ -501,6 +504,30 @@ endfun " --------------------------------------------------------------------- +" tar#Diff: {{{2 +fun! tar#Diff(userfname,fname) +" call Dfunc("tar#Diff(userfname<".a:userfname."> fname<".a:fname.")") + let fname= a:fname + if a:userfname != "" + let fname= a:userfname + endif + if filereadable(fname) + " sets current file (from tarball) for diff'ing + " splits window vertically + " opens original file, sets it for diff'ing + " sets up b:tardiff_otherbuf variables so each buffer knows about the other (for closing purposes) + diffthis + wincmd v + exe "e ".fnameescape(fname) + diffthis + else + redraw! + echo "***warning*** unable to read file<".fname.">" + endif +" call Dret("tar#Diff") +endfun + +" --------------------------------------------------------------------- " s:Rmdir: {{{2 fun! s:Rmdir(fname) " call Dfunc("Rmdir(fname<".a:fname.">)") diff -Naur vim73.orig/runtime/autoload/tohtml.vim vim73/runtime/autoload/tohtml.vim --- vim73.orig/runtime/autoload/tohtml.vim 2010-08-12 19:59:40.000000000 +0000 +++ vim73/runtime/autoload/tohtml.vim 2013-06-07 17:07:06.928988887 +0000 @@ -1,6 +1,6 @@ " Vim autoload file for the tohtml plugin. " Maintainer: Ben Fritz -" Last Change: 2010 Aug 12 +" Last Change: 2013 May 31 " " Additional contributors: " @@ -11,12 +11,286 @@ " this file uses line continuations let s:cpo_sav = &cpo -set cpo-=C +set cpo&vim -func! tohtml#Convert2HTML(line1, line2) +" Automatically find charsets from all encodings supported natively by Vim. With +" the 8bit- and 2byte- prefixes, Vim can actually support more encodings than +" this. Let the user specify these however since they won't be supported on +" every system. +" +" Note, not all of Vim's supported encodings have a charset to use. +" +" Names in this list are from: +" http://www.iana.org/assignments/character-sets +" g:tohtml#encoding_to_charset: {{{ +let g:tohtml#encoding_to_charset = { + \ 'latin1' : 'ISO-8859-1', + \ 'iso-8859-2' : 'ISO-8859-2', + \ 'iso-8859-3' : 'ISO-8859-3', + \ 'iso-8859-4' : 'ISO-8859-4', + \ 'iso-8859-5' : 'ISO-8859-5', + \ 'iso-8859-6' : 'ISO-8859-6', + \ 'iso-8859-7' : 'ISO-8859-7', + \ 'iso-8859-8' : 'ISO-8859-8', + \ 'iso-8859-9' : 'ISO-8859-9', + \ 'iso-8859-10' : '', + \ 'iso-8859-13' : 'ISO-8859-13', + \ 'iso-8859-14' : '', + \ 'iso-8859-15' : 'ISO-8859-15', + \ 'koi8-r' : 'KOI8-R', + \ 'koi8-u' : 'KOI8-U', + \ 'macroman' : 'macintosh', + \ 'cp437' : '', + \ 'cp775' : '', + \ 'cp850' : '', + \ 'cp852' : '', + \ 'cp855' : '', + \ 'cp857' : '', + \ 'cp860' : '', + \ 'cp861' : '', + \ 'cp862' : '', + \ 'cp863' : '', + \ 'cp865' : '', + \ 'cp866' : 'IBM866', + \ 'cp869' : '', + \ 'cp874' : '', + \ 'cp1250' : 'windows-1250', + \ 'cp1251' : 'windows-1251', + \ 'cp1253' : 'windows-1253', + \ 'cp1254' : 'windows-1254', + \ 'cp1255' : 'windows-1255', + \ 'cp1256' : 'windows-1256', + \ 'cp1257' : 'windows-1257', + \ 'cp1258' : 'windows-1258', + \ 'euc-jp' : 'EUC-JP', + \ 'sjis' : 'Shift_JIS', + \ 'cp932' : 'Shift_JIS', + \ 'cp949' : '', + \ 'euc-kr' : 'EUC-KR', + \ 'cp936' : 'GBK', + \ 'euc-cn' : 'GB2312', + \ 'big5' : 'Big5', + \ 'cp950' : 'Big5', + \ 'utf-8' : 'UTF-8', + \ 'ucs-2' : 'UTF-8', + \ 'ucs-2le' : 'UTF-8', + \ 'utf-16' : 'UTF-8', + \ 'utf-16le' : 'UTF-8', + \ 'ucs-4' : 'UTF-8', + \ 'ucs-4le' : 'UTF-8', + \ } +lockvar g:tohtml#encoding_to_charset +" Notes: +" 1. All UCS/UTF are converted to UTF-8 because it is much better supported +" 2. Any blank spaces are there because Vim supports it but at least one major +" web browser does not according to http://wiki.whatwg.org/wiki/Web_Encodings. +" }}} + +" Only automatically find encodings supported natively by Vim, let the user +" specify the encoding if it's not natively supported. This function is only +" used when the user specifies the charset, they better know what they are +" doing! +" +" Names in this list are from: +" http://www.iana.org/assignments/character-sets +" g:tohtml#charset_to_encoding: {{{ +let g:tohtml#charset_to_encoding = { + \ 'iso_8859-1:1987' : 'latin1', + \ 'iso-ir-100' : 'latin1', + \ 'iso_8859-1' : 'latin1', + \ 'iso-8859-1' : 'latin1', + \ 'latin1' : 'latin1', + \ 'l1' : 'latin1', + \ 'ibm819' : 'latin1', + \ 'cp819' : 'latin1', + \ 'csisolatin1' : 'latin1', + \ 'iso_8859-2:1987' : 'iso-8859-2', + \ 'iso-ir-101' : 'iso-8859-2', + \ 'iso_8859-2' : 'iso-8859-2', + \ 'iso-8859-2' : 'iso-8859-2', + \ 'latin2' : 'iso-8859-2', + \ 'l2' : 'iso-8859-2', + \ 'csisolatin2' : 'iso-8859-2', + \ 'iso_8859-3:1988' : 'iso-8859-3', + \ 'iso-ir-109' : 'iso-8859-3', + \ 'iso_8859-3' : 'iso-8859-3', + \ 'iso-8859-3' : 'iso-8859-3', + \ 'latin3' : 'iso-8859-3', + \ 'l3' : 'iso-8859-3', + \ 'csisolatin3' : 'iso-8859-3', + \ 'iso_8859-4:1988' : 'iso-8859-4', + \ 'iso-ir-110' : 'iso-8859-4', + \ 'iso_8859-4' : 'iso-8859-4', + \ 'iso-8859-4' : 'iso-8859-4', + \ 'latin4' : 'iso-8859-4', + \ 'l4' : 'iso-8859-4', + \ 'csisolatin4' : 'iso-8859-4', + \ 'iso_8859-5:1988' : 'iso-8859-5', + \ 'iso-ir-144' : 'iso-8859-5', + \ 'iso_8859-5' : 'iso-8859-5', + \ 'iso-8859-5' : 'iso-8859-5', + \ 'cyrillic' : 'iso-8859-5', + \ 'csisolatincyrillic' : 'iso-8859-5', + \ 'iso_8859-6:1987' : 'iso-8859-6', + \ 'iso-ir-127' : 'iso-8859-6', + \ 'iso_8859-6' : 'iso-8859-6', + \ 'iso-8859-6' : 'iso-8859-6', + \ 'ecma-114' : 'iso-8859-6', + \ 'asmo-708' : 'iso-8859-6', + \ 'arabic' : 'iso-8859-6', + \ 'csisolatinarabic' : 'iso-8859-6', + \ 'iso_8859-7:1987' : 'iso-8859-7', + \ 'iso-ir-126' : 'iso-8859-7', + \ 'iso_8859-7' : 'iso-8859-7', + \ 'iso-8859-7' : 'iso-8859-7', + \ 'elot_928' : 'iso-8859-7', + \ 'ecma-118' : 'iso-8859-7', + \ 'greek' : 'iso-8859-7', + \ 'greek8' : 'iso-8859-7', + \ 'csisolatingreek' : 'iso-8859-7', + \ 'iso_8859-8:1988' : 'iso-8859-8', + \ 'iso-ir-138' : 'iso-8859-8', + \ 'iso_8859-8' : 'iso-8859-8', + \ 'iso-8859-8' : 'iso-8859-8', + \ 'hebrew' : 'iso-8859-8', + \ 'csisolatinhebrew' : 'iso-8859-8', + \ 'iso_8859-9:1989' : 'iso-8859-9', + \ 'iso-ir-148' : 'iso-8859-9', + \ 'iso_8859-9' : 'iso-8859-9', + \ 'iso-8859-9' : 'iso-8859-9', + \ 'latin5' : 'iso-8859-9', + \ 'l5' : 'iso-8859-9', + \ 'csisolatin5' : 'iso-8859-9', + \ 'iso-8859-10' : 'iso-8859-10', + \ 'iso-ir-157' : 'iso-8859-10', + \ 'l6' : 'iso-8859-10', + \ 'iso_8859-10:1992' : 'iso-8859-10', + \ 'csisolatin6' : 'iso-8859-10', + \ 'latin6' : 'iso-8859-10', + \ 'iso-8859-13' : 'iso-8859-13', + \ 'iso-8859-14' : 'iso-8859-14', + \ 'iso-ir-199' : 'iso-8859-14', + \ 'iso_8859-14:1998' : 'iso-8859-14', + \ 'iso_8859-14' : 'iso-8859-14', + \ 'latin8' : 'iso-8859-14', + \ 'iso-celtic' : 'iso-8859-14', + \ 'l8' : 'iso-8859-14', + \ 'iso-8859-15' : 'iso-8859-15', + \ 'iso_8859-15' : 'iso-8859-15', + \ 'latin-9' : 'iso-8859-15', + \ 'koi8-r' : 'koi8-r', + \ 'cskoi8r' : 'koi8-r', + \ 'koi8-u' : 'koi8-u', + \ 'macintosh' : 'macroman', + \ 'mac' : 'macroman', + \ 'csmacintosh' : 'macroman', + \ 'ibm437' : 'cp437', + \ 'cp437' : 'cp437', + \ '437' : 'cp437', + \ 'cspc8codepage437' : 'cp437', + \ 'ibm775' : 'cp775', + \ 'cp775' : 'cp775', + \ 'cspc775baltic' : 'cp775', + \ 'ibm850' : 'cp850', + \ 'cp850' : 'cp850', + \ '850' : 'cp850', + \ 'cspc850multilingual' : 'cp850', + \ 'ibm852' : 'cp852', + \ 'cp852' : 'cp852', + \ '852' : 'cp852', + \ 'cspcp852' : 'cp852', + \ 'ibm855' : 'cp855', + \ 'cp855' : 'cp855', + \ '855' : 'cp855', + \ 'csibm855' : 'cp855', + \ 'ibm857' : 'cp857', + \ 'cp857' : 'cp857', + \ '857' : 'cp857', + \ 'csibm857' : 'cp857', + \ 'ibm860' : 'cp860', + \ 'cp860' : 'cp860', + \ '860' : 'cp860', + \ 'csibm860' : 'cp860', + \ 'ibm861' : 'cp861', + \ 'cp861' : 'cp861', + \ '861' : 'cp861', + \ 'cp-is' : 'cp861', + \ 'csibm861' : 'cp861', + \ 'ibm862' : 'cp862', + \ 'cp862' : 'cp862', + \ '862' : 'cp862', + \ 'cspc862latinhebrew' : 'cp862', + \ 'ibm863' : 'cp863', + \ 'cp863' : 'cp863', + \ '863' : 'cp863', + \ 'csibm863' : 'cp863', + \ 'ibm865' : 'cp865', + \ 'cp865' : 'cp865', + \ '865' : 'cp865', + \ 'csibm865' : 'cp865', + \ 'ibm866' : 'cp866', + \ 'cp866' : 'cp866', + \ '866' : 'cp866', + \ 'csibm866' : 'cp866', + \ 'ibm869' : 'cp869', + \ 'cp869' : 'cp869', + \ '869' : 'cp869', + \ 'cp-gr' : 'cp869', + \ 'csibm869' : 'cp869', + \ 'windows-1250' : 'cp1250', + \ 'windows-1251' : 'cp1251', + \ 'windows-1253' : 'cp1253', + \ 'windows-1254' : 'cp1254', + \ 'windows-1255' : 'cp1255', + \ 'windows-1256' : 'cp1256', + \ 'windows-1257' : 'cp1257', + \ 'windows-1258' : 'cp1258', + \ 'extended_unix_code_packed_format_for_japanese' : 'euc-jp', + \ 'cseucpkdfmtjapanese' : 'euc-jp', + \ 'euc-jp' : 'euc-jp', + \ 'shift_jis' : 'sjis', + \ 'ms_kanji' : 'sjis', + \ 'sjis' : 'sjis', + \ 'csshiftjis' : 'sjis', + \ 'ibm-thai' : 'cp874', + \ 'csibmthai' : 'cp874', + \ 'ks_c_5601-1987' : 'cp949', + \ 'iso-ir-149' : 'cp949', + \ 'ks_c_5601-1989' : 'cp949', + \ 'ksc_5601' : 'cp949', + \ 'korean' : 'cp949', + \ 'csksc56011987' : 'cp949', + \ 'euc-kr' : 'euc-kr', + \ 'cseuckr' : 'euc-kr', + \ 'gbk' : 'cp936', + \ 'cp936' : 'cp936', + \ 'ms936' : 'cp936', + \ 'windows-936' : 'cp936', + \ 'gb_2312-80' : 'euc-cn', + \ 'iso-ir-58' : 'euc-cn', + \ 'chinese' : 'euc-cn', + \ 'csiso58gb231280' : 'euc-cn', + \ 'big5' : 'big5', + \ 'csbig5' : 'big5', + \ 'utf-8' : 'utf-8', + \ 'iso-10646-ucs-2' : 'ucs-2', + \ 'csunicode' : 'ucs-2', + \ 'utf-16' : 'utf-16', + \ 'utf-16be' : 'utf-16', + \ 'utf-16le' : 'utf-16le', + \ 'utf-32' : 'ucs-4', + \ 'utf-32be' : 'ucs-4', + \ 'utf-32le' : 'ucs-4le', + \ 'iso-10646-ucs-4' : 'ucs-4', + \ 'csucs4' : 'ucs-4' + \ } +lockvar g:tohtml#charset_to_encoding +"}}} + +func! tohtml#Convert2HTML(line1, line2) "{{{ let s:settings = tohtml#GetUserSettings() - if !&diff || s:settings.diff_one_file + if !&diff || s:settings.diff_one_file "{{{ if a:line2 >= a:line1 let g:html_start_line = a:line1 let g:html_end_line = a:line2 @@ -24,31 +298,51 @@ let g:html_start_line = a:line2 let g:html_end_line = a:line1 endif - runtime syntax/2html.vim - else + runtime syntax/2html.vim "}}} + else "{{{ let win_list = [] let buf_list = [] windo | if &diff | call add(win_list, winbufnr(0)) | endif let s:settings.whole_filler = 1 let g:html_diff_win_num = 0 for window in win_list + " switch to the next buffer to convert exe ":" . bufwinnr(window) . "wincmd w" + + " figure out whether current charset and encoding will work, if not + " default to UTF-8 + if !exists('g:html_use_encoding') && + \ (((&l:fileencoding=='' || (&l:buftype!='' && &l:buftype!=?'help')) + \ && &encoding!=?s:settings.vim_encoding) + \ || &l:fileencoding!='' && &l:fileencoding!=?s:settings.vim_encoding) + echohl WarningMsg + echomsg "TOhtml: mismatched file encodings in Diff buffers, using UTF-8" + echohl None + let s:settings.vim_encoding = 'utf-8' + let s:settings.encoding = 'UTF-8' + endif + + " set up for diff-mode conversion let g:html_start_line = 1 let g:html_end_line = line('$') let g:html_diff_win_num += 1 + + " convert this file runtime syntax/2html.vim + + " remember the HTML buffer for later combination call add(buf_list, bufnr('%')) endfor unlet g:html_diff_win_num call tohtml#Diff2HTML(win_list, buf_list) - endif + endif "}}} unlet g:html_start_line unlet g:html_end_line unlet s:settings -endfunc +endfunc "}}} -func! tohtml#Diff2HTML(win_list, buf_list) +func! tohtml#Diff2HTML(win_list, buf_list) "{{{ let xml_line = "" let tag_close = '>' @@ -87,7 +381,7 @@ call add(html, '') " include encoding as close to the top as possible, but only if not already - " contained in XML information (to avoid haggling over content type) + " contained in XML information if s:settings.encoding != "" && !s:settings.use_xhtml call add(html, "') let body_line_num = len(html) - call add(html, '') - call add(html, '') + if !empty(s:settings.prevent_copy) + call add(html, "") + call add(html, "") + call add(html, "
0
") + call add(html, "
") + call add(html, "
") + else + call add(html, '') + endif + call add(html, "
") call add(html, '') for buf in a:win_list @@ -133,7 +440,8 @@ let s:body_end_line = getline('.') endif - " Grab the style information. Some of this will be duplicated... + " Grab the style information. Some of this will be duplicated so only insert + " it if it's not already there. {{{ 1 let style_start = search('^' - \ ]) - endif + \]) + endif "}}} endif let &paste = s:old_paste let &magic = s:old_magic -endfunc +endfunc "}}} " Gets a single user option and sets it in the passed-in Dict, or gives it the " default value if the option doesn't actually exist. -func! tohtml#GetOption(settings, option, default) +func! tohtml#GetOption(settings, option, default) "{{{ if exists('g:html_'.a:option) let a:settings[a:option] = g:html_{a:option} else let a:settings[a:option] = a:default endif -endfunc +endfunc "}}} " returns a Dict containing the values of all user options for 2html, including " default values for those not given an explicit value by the user. Discards the " html_ prefix of the option for nicer looking code. -func! tohtml#GetUserSettings() +func! tohtml#GetUserSettings() "{{{ if exists('s:settings') " just restore the known options if we've already retrieved them return s:settings @@ -289,21 +707,24 @@ let g:html_use_xhtml = g:use_xhtml endif - " get current option settings with appropriate defaults - call tohtml#GetOption(user_settings, 'no_progress', !has("statusline") ) - call tohtml#GetOption(user_settings, 'diff_one_file', 0 ) - call tohtml#GetOption(user_settings, 'number_lines', &number ) - call tohtml#GetOption(user_settings, 'use_css', 1 ) - call tohtml#GetOption(user_settings, 'ignore_conceal', 0 ) - call tohtml#GetOption(user_settings, 'ignore_folding', 0 ) - call tohtml#GetOption(user_settings, 'dynamic_folds', 0 ) - call tohtml#GetOption(user_settings, 'no_foldcolumn', 0 ) - call tohtml#GetOption(user_settings, 'hover_unfold', 0 ) - call tohtml#GetOption(user_settings, 'no_pre', 0 ) - call tohtml#GetOption(user_settings, 'whole_filler', 0 ) - call tohtml#GetOption(user_settings, 'use_xhtml', 0 ) + " get current option settings with appropriate defaults {{{ + call tohtml#GetOption(user_settings, 'no_progress', !has("statusline") ) + call tohtml#GetOption(user_settings, 'diff_one_file', 0 ) + call tohtml#GetOption(user_settings, 'number_lines', &number ) + call tohtml#GetOption(user_settings, 'pre_wrap', &wrap ) + call tohtml#GetOption(user_settings, 'use_css', 1 ) + call tohtml#GetOption(user_settings, 'ignore_conceal', 0 ) + call tohtml#GetOption(user_settings, 'ignore_folding', 0 ) + call tohtml#GetOption(user_settings, 'dynamic_folds', 0 ) + call tohtml#GetOption(user_settings, 'no_foldcolumn', user_settings.ignore_folding) + call tohtml#GetOption(user_settings, 'hover_unfold', 0 ) + call tohtml#GetOption(user_settings, 'no_pre', 0 ) + call tohtml#GetOption(user_settings, 'no_invalid', 0 ) + call tohtml#GetOption(user_settings, 'whole_filler', 0 ) + call tohtml#GetOption(user_settings, 'use_xhtml', 0 ) + " }}} - " override those settings that need it + " override those settings that need it {{{ " hover opening implies dynamic folding if user_settings.hover_unfold @@ -324,6 +745,8 @@ " dynamic folding implies css if user_settings.dynamic_folds let user_settings.use_css = 1 + else + let user_settings.no_foldcolumn = 1 " won't do anything but for consistency and for the test suite endif " if we're not using CSS we cannot use a pre section because tags @@ -332,47 +755,154 @@ let user_settings.no_pre = 1 endif - " Figure out proper MIME charset from the 'encoding' option. - if exists("g:html_use_encoding") + " pre_wrap doesn't do anything if not using pre or not using CSS + if user_settings.no_pre || !user_settings.use_css + let user_settings.pre_wrap=0 + endif + "}}} + + " set up expand_tabs option after all the overrides so we know the + " appropriate defaults {{{ + if user_settings.no_pre == 0 + call tohtml#GetOption(user_settings, + \ 'expand_tabs', + \ &expandtab || &ts != 8 || user_settings.number_lines || + \ (user_settings.dynamic_folds && !user_settings.no_foldcolumn)) + else + let user_settings.expand_tabs = 1 + endif + " }}} + + " textual options + if exists("g:html_use_encoding") "{{{ + " user specified the desired MIME charset, figure out proper + " 'fileencoding' from it or warn the user if we cannot let user_settings.encoding = g:html_use_encoding + let user_settings.vim_encoding = tohtml#EncodingFromCharset(g:html_use_encoding) + if user_settings.vim_encoding == '' + echohl WarningMsg + echomsg "TOhtml: file encoding for" + \ g:html_use_encoding + \ "unknown, please set 'fileencoding'" + echohl None + endif else - let vim_encoding = &encoding - if vim_encoding =~ '^8bit\|^2byte' - let vim_encoding = substitute(vim_encoding, '^8bit-\|^2byte-', '', '') + " Figure out proper MIME charset from 'fileencoding' if possible + if &l:fileencoding != '' + " If the buffer is not a "normal" type, the 'fileencoding' value may not + " be trusted; since the buffer should not be written the fileencoding is + " not intended to be used. + if &l:buftype=='' || &l:buftype==?'help' + let user_settings.vim_encoding = &l:fileencoding + call tohtml#CharsetFromEncoding(user_settings) + else + let user_settings.encoding = '' " trigger detection using &encoding + endif endif - if vim_encoding == 'latin1' - let user_settings.encoding = 'iso-8859-1' - elseif vim_encoding =~ "^cp12" - let user_settings.encoding = substitute(vim_encoding, 'cp', 'windows-', '') - elseif vim_encoding == 'sjis' || vim_encoding == 'cp932' - let user_settings.encoding = 'Shift_JIS' - elseif vim_encoding == 'big5' || vim_encoding == 'cp950' - let user_settings.encoding = "Big5" - elseif vim_encoding == 'euc-cn' - let user_settings.encoding = 'GB_2312-80' - elseif vim_encoding == 'euc-tw' - let user_settings.encoding = "" - elseif vim_encoding =~ '^euc\|^iso\|^koi' - let user_settings.encoding = substitute(vim_encoding, '.*', '\U\0', '') - elseif vim_encoding == 'cp949' - let user_settings.encoding = 'KS_C_5601-1987' - elseif vim_encoding == 'cp936' - let user_settings.encoding = 'GBK' - elseif vim_encoding =~ '^ucs\|^utf' + + " else from 'encoding' if possible + if &l:fileencoding == '' || user_settings.encoding == '' + let user_settings.vim_encoding = &encoding + call tohtml#CharsetFromEncoding(user_settings) + endif + + " else default to UTF-8 and warn user + if user_settings.encoding == '' + let user_settings.vim_encoding = 'utf-8' let user_settings.encoding = 'UTF-8' + echohl WarningMsg + echomsg "TOhtml: couldn't determine MIME charset, using UTF-8" + echohl None + endif + endif "}}} + + " Default to making nothing uncopyable, because we default to + " not-standards way of doing things, and also because Microsoft Word and + " others paste the elements anyway. + " + " html_prevent_copy only has an effect when using CSS. + " + " All options: + " f - fold column + " n - line numbers (also within fold text) + " t - fold text + " d - diff filler + " c - concealed text (reserved future) + " l - listchars (reserved possible future) + " s - signs (reserved possible future) + " + " Normal text is always selectable. + let user_settings.prevent_copy = "" + if user_settings.use_css + if exists("g:html_prevent_copy") + if user_settings.dynamic_folds && !user_settings.no_foldcolumn && g:html_prevent_copy =~# 'f' + let user_settings.prevent_copy .= 'f' + endif + if user_settings.number_lines && g:html_prevent_copy =~# 'n' + let user_settings.prevent_copy .= 'n' + endif + if &diff && g:html_prevent_copy =~# 'd' + let user_settings.prevent_copy .= 'd' + endif + if !user_settings.ignore_folding && g:html_prevent_copy =~# 't' + let user_settings.prevent_copy .= 't' + endif else - let user_settings.encoding = "" + let user_settings.prevent_copy = "" endif endif + if empty(user_settings.prevent_copy) + let user_settings.no_invalid = 0 + endif " TODO: font return user_settings endif -endfunc +endfunc "}}} + +" get the proper HTML charset name from a Vim encoding option. +function! tohtml#CharsetFromEncoding(settings) "{{{ + let l:vim_encoding = a:settings.vim_encoding + if exists('g:html_charset_override') && has_key(g:html_charset_override, l:vim_encoding) + let a:settings.encoding = g:html_charset_override[l:vim_encoding] + else + if l:vim_encoding =~ '^8bit\|^2byte' + " 8bit- and 2byte- prefixes are to indicate encodings available on the + " system that Vim will convert with iconv(), look up just the encoding name, + " not Vim's prefix. + let l:vim_encoding = substitute(l:vim_encoding, '^8bit-\|^2byte-', '', '') + endif + if has_key(g:tohtml#encoding_to_charset, l:vim_encoding) + let a:settings.encoding = g:tohtml#encoding_to_charset[l:vim_encoding] + else + let a:settings.encoding = "" + endif + endif + if a:settings.encoding != "" + let l:vim_encoding = tohtml#EncodingFromCharset(a:settings.encoding) + if l:vim_encoding != "" + " if the Vim encoding to HTML encoding conversion is set up (by default or + " by the user) to convert to a different encoding, we need to also change + " the Vim encoding of the new buffer + let a:settings.vim_encoding = l:vim_encoding + endif + endif +endfun "}}} + +" Get the proper Vim encoding option setting from an HTML charset name. +function! tohtml#EncodingFromCharset(encoding) "{{{ + if exists('g:html_encoding_override') && has_key(g:html_encoding_override, a:encoding) + return g:html_encoding_override[a:encoding] + elseif has_key(g:tohtml#charset_to_encoding, tolower(a:encoding)) + return g:tohtml#charset_to_encoding[tolower(a:encoding)] + else + return "" + endif +endfun "}}} let &cpo = s:cpo_sav unlet s:cpo_sav " Make sure any patches will probably use consistent indent -" vim: ts=8 sw=2 sts=2 noet +" vim: ts=8 sw=2 sts=2 noet fdm=marker diff -Naur vim73.orig/runtime/autoload/vimball.vim vim73/runtime/autoload/vimball.vim --- vim73.orig/runtime/autoload/vimball.vim 2010-05-15 11:03:30.000000000 +0000 +++ vim73/runtime/autoload/vimball.vim 2013-06-07 17:07:06.945655506 +0000 @@ -1,9 +1,9 @@ " vimball.vim : construct a file containing both paths and files " Author: Charles E. Campbell, Jr. -" Date: Apr 12, 2010 -" Version: 31 +" Date: Jan 17, 2012 +" Version: 35 " GetLatestVimScripts: 1502 1 :AutoInstall: vimball.vim -" Copyright: (c) 2004-2009 by Charles E. Campbell, Jr. +" Copyright: (c) 2004-2011 by Charles E. Campbell, Jr. " The VIM LICENSE applies to Vimball.vim, and Vimball.txt " (see |copyright|) except use "Vimball" instead of "Vim". " No warranty, express or implied. @@ -14,7 +14,7 @@ if &cp || exists("g:loaded_vimball") finish endif -let g:loaded_vimball = "v31" +let g:loaded_vimball = "v35" if v:version < 702 echohl WarningMsg echo "***warning*** this version of vimball needs vim 7.2" @@ -67,10 +67,10 @@ " vimball#MkVimball: creates a vimball given a list of paths to files {{{2 " Input: " line1,line2: a range of lines containing paths to files to be included in the vimball -" writelevel : if true, force a write to filename.vba, even if it exists +" writelevel : if true, force a write to filename.vmb, even if it exists " (usually accomplished with :MkVimball! ... -" filename : base name of file to be created (ie. filename.vba) -" Output: a filename.vba using vimball format: +" filename : base name of file to be created (ie. filename.vmb) +" Output: a filename.vmb using vimball format: " path " filesize " [file] @@ -80,12 +80,12 @@ fun! vimball#MkVimball(line1,line2,writelevel,...) range " call Dfunc("MkVimball(line1=".a:line1." line2=".a:line2." writelevel=".a:writelevel." vimballname<".a:1.">) a:0=".a:0) if a:1 =~ '\.vim$' || a:1 =~ '\.txt$' - let vbname= substitute(a:1,'\.\a\{3}$','.vba','') + let vbname= substitute(a:1,'\.\a\{3}$','.vmb','') else let vbname= a:1 endif - if vbname !~ '\.vba$' - let vbname= vbname.'.vba' + if vbname !~ '\.vmb$' + let vbname= vbname.'.vmb' endif " call Decho("vbname<".vbname.">") if !a:writelevel && a:1 =~ '[\/]' @@ -134,7 +134,7 @@ " create/switch to mkvimball tab if !exists("vbtabnr") tabnew - silent! file Vimball + sil! file Vimball let vbtabnr= tabpagenr() else exe "tabn ".vbtabnr @@ -195,8 +195,8 @@ " call Dfunc("vimball#Vimball(really=".a:really.") a:0=".a:0) if v:version < 701 || (v:version == 701 && !exists('*fnameescape')) - echoerr "your vim is missing the fnameescape() function" -" call Dret("vimball#Vimball : needs 7.1 with patch 299") + echoerr "your vim is missing the fnameescape() function (pls upgrade to vim 7.2 or later)" +" call Dret("vimball#Vimball : needs 7.1 with patch 299 or later") return endif @@ -214,13 +214,22 @@ " set up vimball tab " call Decho("setting up vimball tab") tabnew - silent! file Vimball + sil! file Vimball let vbtabnr= tabpagenr() let didhelp= "" " go to vim plugin home if a:0 > 0 + " let user specify the directory where the vimball is to be unpacked. + " If, however, the user did not specify a full path, set the home to be below the current directory let home= expand(a:1) + if has("win32") || has("win95") || has("win64") || has("win16") + if home !~ '^\a:[/\\]' + let home= getcwd().'/'.a:1 + endif + elseif home !~ '^/' + let home= getcwd().'/'.a:1 + endif else let home= vimball#VimballHome() endif @@ -254,11 +263,10 @@ while 1 < linenr && linenr < line("$") let fname = substitute(getline(linenr),'\t\[\[\[1$','','') let fname = substitute(fname,'\\','/','g') -" let fsize = getline(linenr+1)+0 let fsize = substitute(getline(linenr+1),'^\(\d\+\).\{-}$','\1','')+0 - let fenc = substitute(getline(linenr+1),'^\d\+\s*\(\S\+\)$','\1','') + let fenc = substitute(getline(linenr+1),'^\d\+\s*\(\S\{-}\)$','\1','') let filecnt = filecnt + 1 -" call Decho("fname<".fname."> fsize=".fsize." filecnt=".filecnt) +" call Decho("fname<".fname."> fsize=".fsize." filecnt=".filecnt. " fenc=".fenc) if a:really echomsg "extracted <".fname.">: ".fsize." lines" @@ -283,11 +291,14 @@ " call Decho("making directories if they don't exist yet (fname<".fname.">)") let fnamebuf= substitute(fname,'\\','/','g') let dirpath = substitute(home,'\\','/','g') +" call Decho("init: fnamebuf<".fnamebuf.">") +" call Decho("init: dirpath <".dirpath.">") while fnamebuf =~ '/' let dirname = dirpath."/".substitute(fnamebuf,'/.*$','','') let dirpath = dirname let fnamebuf = substitute(fnamebuf,'^.\{-}/\(.*\)$','\1','') " call Decho("dirname<".dirname.">") +" call Decho("dirpath<".dirpath.">") if !isdirectory(dirname) " call Decho("making <".dirname.">") if exists("g:vimball_mkdir") @@ -306,20 +317,22 @@ let linenr = linenr + 2 let lastline = linenr + fsize - 1 " call Decho("exe ".linenr.",".lastline."yank a") - exe "silent ".linenr.",".lastline."yank a" + " no point in handling a zero-length file + if lastline >= linenr + exe "silent ".linenr.",".lastline."yank a" - " copy "a" buffer into tab + " copy "a" buffer into tab " call Decho('copy "a buffer into tab#'.vbtabnr) - exe "tabn ".vbtabnr - setlocal ma - silent! %d - silent put a - 1 - silent d - - " write tab to file - if a:really - let fnamepath= home."/".fname + exe "tabn ".vbtabnr + setlocal ma + sil! %d + silent put a + 1 + sil! d + + " write tab to file + if a:really + let fnamepath= home."/".fname " call Decho("exe w! ".fnameescape(fnamepath)) if fenc != "" exe "silent w! ++enc=".fnameescape(fenc)." ".fnameescape(fnamepath) @@ -328,17 +341,18 @@ endif echo "wrote ".fnameescape(fnamepath) call s:RecordInVar(home,"call delete('".fnamepath."')") - endif + endif - " return to tab with vimball + " return to tab with vimball " call Decho("exe tabn ".curtabnr) - exe "tabn ".curtabnr + exe "tabn ".curtabnr - " set up help if its a doc/*.txt file + " set up help if its a doc/*.txt file " call Decho("didhelp<".didhelp."> fname<".fname.">") - if a:really && didhelp == "" && fname =~ 'doc/[^/]\+\.\(txt\|..x\)$' - let didhelp= substitute(fname,'^\(.*\") + endif endif " update for next file @@ -400,7 +414,9 @@ let curfile= a:1 " call Decho("case a:0=".a:0.": curfile<".curfile.">") endif - if curfile =~ '\.vba$' + if curfile =~ '\.vmb$' + let curfile= substitute(curfile,'\.vmb','','') + elseif curfile =~ '\.vba$' let curfile= substitute(curfile,'\.vba','','') endif if a:0 >= 2 @@ -418,13 +434,17 @@ " call Decho(".VimballRecord is readable") " call Decho("curfile<".curfile.">") keepalt keepjumps 1split - silent! keepalt keepjumps e .VimballRecord + sil! keepalt keepjumps e .VimballRecord let keepsrch= @/ " call Decho('search for ^\M'.curfile.'.\m: ') -" call Decho('search for ^\M'.curfile.'.\mvba: ') -" call Decho('search for ^\M'.curfile.'\m[-0-9.]*\.vba: ') +" call Decho('search for ^\M'.curfile.'.\m{vba|vmb}: ') +" call Decho('search for ^\M'.curfile.'\m[-0-9.]*\.{vba|vmb}: ') if search('^\M'.curfile."\m: ".'cw') let foundit= 1 + elseif search('^\M'.curfile.".\mvmb: ",'cw') + let foundit= 2 + elseif search('^\M'.curfile.'\m[-0-9.]*\.vmb: ','cw') + let foundit= 2 elseif search('^\M'.curfile.".\mvba: ",'cw') let foundit= 1 elseif search('^\M'.curfile.'\m[-0-9.]*\.vba: ','cw') @@ -433,25 +453,29 @@ let foundit = 0 endif if foundit - let exestring = substitute(getline("."),'^\M'.curfile.'\m\S\{-}\.vba: ','','') + if foundit == 1 + let exestring = substitute(getline("."),'^\M'.curfile.'\m\S\{-}\.vba: ','','') + else + let exestring = substitute(getline("."),'^\M'.curfile.'\m\S\{-}\.vmb: ','','') + endif let s:VBRstring= substitute(exestring,'call delete(','','g') let s:VBRstring= substitute(s:VBRstring,"[')]",'','g') " call Decho("exe ".exestring) - silent! keepalt keepjumps exe exestring - silent! keepalt keepjumps d + sil! keepalt keepjumps exe exestring + sil! keepalt keepjumps d let exestring= strlen(substitute(exestring,'call delete(.\{-})|\=',"D","g")) " call Decho("exestring<".exestring.">") echomsg "removed ".exestring." files" else let s:VBRstring= '' - let curfile = substitute(curfile,'\.vba','','') + let curfile = substitute(curfile,'\.vmb','','') " call Decho("unable to find <".curfile."> in .VimballRecord") if !exists("s:ok_unablefind") call vimball#ShowMesg(s:WARNING,"(RmVimball) unable to find <".curfile."> in .VimballRecord") endif endif - silent! keepalt keepjumps g/^\s*$/d - silent! keepalt keepjumps wq! + sil! keepalt keepjumps g/^\s*$/d + sil! keepalt keepjumps wq! let @/= keepsrch endif call s:ChgDir(curdir) @@ -557,9 +581,19 @@ fun! s:ChgDir(newdir) " call Dfunc("ChgDir(newdir<".a:newdir.">)") if (has("win32") || has("win95") || has("win64") || has("win16")) - exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g')) - else - exe 'silent cd '.fnameescape(a:newdir) + try + exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g')) + catch /^Vim\%((\a\+)\)\=:E/ + call mkdir(fnameescape(substitute(a:newdir,'/','\\','g'))) + exe 'silent cd '.fnameescape(substitute(a:newdir,'/','\\','g')) + endtry + else + try + exe 'silent cd '.fnameescape(a:newdir) + catch /^Vim\%((\a\+)\)\=:E/ + call mkdir(fnameescape(a:newdir)) + exe 'silent cd '.fnameescape(a:newdir) + endtry endif " call Dret("ChgDir : curdir<".getcwd().">") endfun @@ -599,7 +633,7 @@ let cmd= expand("%:tr").": " " call Decho("cmd<".cmd.">") - silent! keepalt keepjumps e .VimballRecord + sil! keepalt keepjumps e .VimballRecord setlocal ma $ if exists("s:recordfile") && exists("s:recorddir") @@ -616,8 +650,8 @@ " put command into buffer, write .VimballRecord `file keepalt keepjumps put=cmd - silent! keepalt keepjumps g/^\s*$/d - silent! keepalt keepjumps wq! + sil! keepalt keepjumps g/^\s*$/d + sil! keepalt keepjumps wq! call s:ChgDir(curdir) if exists("s:recorddir") @@ -693,10 +727,11 @@ let s:repkeep = &report let s:vekeep = &ve let s:ffkeep = &l:ff + let s:swfkeep = &l:swf if exists("&acd") - setlocal ei=all ve=all noacd nofen noic report=999 nohid bt= ma lz pm= ff=unix + setlocal ei=all ve=all noacd nofen noic report=999 nohid bt= ma lz pm= ff=unix noswf else - setlocal ei=all ve=all nofen noic report=999 nohid bt= ma lz pm= ff=unix + setlocal ei=all ve=all nofen noic report=999 nohid bt= ma lz pm= ff=unix noswf endif " vimballs should be in unix format setlocal ff=unix @@ -732,6 +767,9 @@ " call Dret("RestoreSettings") endfun +let &cpo = s:keepcpo +unlet s:keepcpo + " --------------------------------------------------------------------- " Modelines: {{{1 " vim: fdm=marker diff -Naur vim73.orig/runtime/autoload/zip.vim vim73/runtime/autoload/zip.vim --- vim73.orig/runtime/autoload/zip.vim 2010-05-15 11:03:30.000000000 +0000 +++ vim73/runtime/autoload/zip.vim 2013-06-07 17:07:07.148988259 +0000 @@ -1,10 +1,10 @@ " zip.vim: Handles browsing zipfiles " AUTOLOAD PORTION -" Date: Apr 12, 2010 -" Version: 23 -" Maintainer: Charles E Campbell, Jr +" Date: Apr 17, 2013 +" Version: 26 +" Maintainer: Charles E Campbell " License: Vim License (see vim's :help license) -" Copyright: Copyright (C) 2005-2008 Charles E. Campbell, Jr. {{{1 +" Copyright: Copyright (C) 2005-2012 Charles E. Campbell {{{1 " Permission is hereby granted to use and distribute this code, " with or without modifications, provided that this copyright " notice is copied with it. Like anything else that's free, @@ -19,7 +19,7 @@ if &cp || exists("g:loaded_zip") finish endif -let g:loaded_zip= "v23" +let g:loaded_zip= "v26" if v:version < 702 echohl WarningMsg echo "***warning*** this version of zip needs vim 7.2" @@ -103,38 +103,26 @@ set ft=tar " give header - let lastline= line("$") - call setline(lastline+1,'" zip.vim version '.g:loaded_zip) - call setline(lastline+2,'" Browsing zipfile '.a:zipfile) - call setline(lastline+3,'" Select a file with cursor and press ENTER') - $put ='' - 0d - $ + call append(0, ['" zip.vim version '.g:loaded_zip, + \ '" Browsing zipfile '.a:zipfile, + \ '" Select a file with cursor and press ENTER']) + keepj $ " call Decho("exe silent r! ".g:zip_unzipcmd." -l -- ".s:Escape(a:zipfile,1)) - exe "silent r! ".g:zip_unzipcmd." -l -- ".s:Escape(a:zipfile,1) + exe "keepj sil! r! ".g:zip_unzipcmd." -Z -1 -- ".s:Escape(a:zipfile,1) if v:shell_error != 0 redraw! echohl WarningMsg | echo "***warning*** (zip#Browse) ".fnameescape(a:zipfile)." is not a zip file" | echohl None " call inputsave()|call input("Press to continue")|call inputrestore() - silent %d + keepj sil! %d let eikeep= &ei set ei=BufReadCmd,FileReadCmd - exe "r ".fnameescape(a:zipfile) + exe "keepj r ".fnameescape(a:zipfile) let &ei= eikeep - 1d + keepj 1d " call Dret("zip#Browse") return endif -" call Decho("line 6: ".getline(6)) - let namecol= stridx(getline(6),'Name') + 1 -" call Decho("namecol=".namecol) - 4,$g/^\s*----/d - 4,$g/^\s*\a/d - $d - if namecol > 0 - exe 'silent 4,$s/^.*\%'.namecol.'c//' - endif setlocal noma nomod ro noremap :call ZipBrowseSelect() @@ -200,16 +188,27 @@ else let zipfile = substitute(a:fname,'^.\{-}zipfile:\(.\{-}\)::[^\\].*$','\1','') let fname = substitute(a:fname,'^.\{-}zipfile:.\{-}::\([^\\].*\)$','\1','') - let fname = substitute(fname, '[', '[[]', 'g') + let fname = substitute(fname, '[', '[[]', 'g') endif " call Decho("zipfile<".zipfile.">") " call Decho("fname <".fname.">") -" call Decho("exe r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fname,1)) - exe "silent r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fname,1) + " the following code does much the same thing as + " exe "keepj sil! r! ".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1) + " but allows zipfile:... entries in quickfix lists + let temp = tempname() + let fn = expand('%:p') + exe "sil! !".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1).' > '.temp +" call Decho("exe sil! !".g:zip_unzipcmd." -p -- ".s:Escape(zipfile,1)." ".s:Escape(fnameescape(fname),1).' > '.temp) + sil exe 'keepalt file '.temp + sil keepj e! + sil exe 'keepalt file '.fnameescape(fn) + call delete(temp) + + filetype detect " cleanup - 0d + keepj 0d set nomod let &report= repkeep @@ -278,7 +277,7 @@ if fname =~ '/' let dirpath = substitute(fname,'/[^/]\+$','','e') - if executable("cygpath") + if has("win32unix") && executable("cygpath") let dirpath = substitute(system("cygpath ".s:Escape(dirpath,0)),'\n','','e') endif " call Decho("mkdir(dirpath<".dirpath.">,p)") @@ -290,7 +289,7 @@ " call Decho("zipfile<".zipfile."> fname<".fname.">") exe "w! ".fnameescape(fname) - if executable("cygpath") + if has("win32unix") && executable("cygpath") let zipfile = substitute(system("cygpath ".s:Escape(zipfile,0)),'\n','','e') endif diff -Naur vim73.orig/runtime/colors/koehler.vim vim73/runtime/colors/koehler.vim --- vim73.orig/runtime/colors/koehler.vim 2010-05-15 11:03:31.000000000 +0000 +++ vim73/runtime/colors/koehler.vim 2013-06-07 17:07:07.305654478 +0000 @@ -2,7 +2,7 @@ " vim: tw=0 ts=4 sw=4 " Vim color file " Maintainer: Ron Aaron -" Last Change: 2006 Dec 10 +" Last Change: 2013 May 23 hi clear set background=dark @@ -43,6 +43,8 @@ hi TabLine term=bold,reverse cterm=bold ctermfg=lightblue ctermbg=white gui=bold guifg=blue guibg=white hi TabLineFill term=bold,reverse cterm=bold ctermfg=lightblue ctermbg=white gui=bold guifg=blue guibg=white hi TabLineSel term=reverse ctermfg=white ctermbg=lightblue guifg=white guibg=blue +hi Underlined term=underline cterm=bold,underline ctermfg=lightblue guifg=lightblue gui=bold,underline +hi Ignore ctermfg=black ctermbg=black guifg=black guibg=black hi link IncSearch Visual hi link String Constant hi link Character Constant diff -Naur vim73.orig/runtime/colors/ron.vim vim73/runtime/colors/ron.vim --- vim73.orig/runtime/colors/ron.vim 2010-05-15 11:03:31.000000000 +0000 +++ vim73/runtime/colors/ron.vim 2013-06-07 17:07:07.348987688 +0000 @@ -2,7 +2,7 @@ " vim: tw=0 ts=4 sw=4 " Vim color file " Maintainer: Ron Aaron -" Last Change: 2003 May 02 +" Last Change: 2013 May 24 set background=dark hi clear @@ -11,7 +11,7 @@ endif let g:colors_name = "ron" hi Normal guifg=cyan guibg=black -hi NonText guifg=brown +hi NonText guifg=yellow guibg=#303030 hi comment guifg=green hi constant guifg=cyan gui=bold hi identifier guifg=cyan gui=NONE @@ -24,10 +24,11 @@ hi Error guibg=Red hi Todo guifg=Black guibg=orange hi Cursor guibg=#60a060 guifg=#00ff00 -hi Search guibg=lightslateblue +hi Search guibg=darkgray guifg=black gui=bold hi IncSearch gui=NONE guibg=steelblue hi LineNr guifg=darkgrey hi title guifg=darkgrey +hi ShowMarksHL ctermfg=cyan ctermbg=lightblue cterm=bold guifg=yellow guibg=black gui=bold hi StatusLineNC gui=NONE guifg=lightblue guibg=darkblue hi StatusLine gui=bold guifg=cyan guibg=blue hi label guifg=gold2 @@ -41,3 +42,4 @@ hi Folded guibg=gray30 hi FoldColumn guibg=gray30 guifg=white hi cIf0 guifg=gray +hi diffOnly guifg=red gui=bold diff -Naur vim73.orig/runtime/compiler/cs.vim vim73/runtime/compiler/cs.vim --- vim73.orig/runtime/compiler/cs.vim 2010-05-15 11:03:29.000000000 +0000 +++ vim73/runtime/compiler/cs.vim 2013-06-07 17:07:07.458987374 +0000 @@ -1,19 +1,26 @@ " Vim compiler file -" Compiler: ms C# -" Maintainer: Joseph H. Yao (hyao@sina.com) -" Last Change: 2004 Mar 27 +" Compiler: Microsoft Visual Studio C# +" Maintainer: Zhou YiChao (broken.zhou@gmail.com) +" Previous Maintainer: Joseph H. Yao (hyao@sina.com) +" Last Change: 2012 Apr 30 if exists("current_compiler") finish endif let current_compiler = "cs" +let s:keepcpo= &cpo +set cpo&vim if exists(":CompilerSet") != 2 " older Vim always used :setlocal command -nargs=* CompilerSet setlocal endif -" default errorformat CompilerSet errorformat& +CompilerSet errorformat+=%f(%l\\,%v):\ %t%*[^:]:\ %m, + \%trror%*[^:]:\ %m, + \%tarning%*[^:]:\ %m -" default make CompilerSet makeprg=csc\ % + +let &cpo = s:keepcpo +unlet s:keepcpo diff -Naur vim73.orig/runtime/compiler/decada.vim vim73/runtime/compiler/decada.vim --- vim73.orig/runtime/compiler/decada.vim 2010-05-15 11:03:29.000000000 +0000 +++ vim73/runtime/compiler/decada.vim 2013-06-07 17:07:07.485653965 +0000 @@ -15,11 +15,11 @@ " Help Page: compiler-decada "------------------------------------------------------------------------------ -if (exists("current_compiler") && - \ current_compiler == "decada") || - \ version < 700 +if (exists("current_compiler") && current_compiler == "decada") || version < 700 finish endif +let s:keepcpo= &cpo +set cpo&vim let current_compiler = "decada" @@ -44,6 +44,9 @@ execute "CompilerSet makeprg=" . escape (g:decada.Make_Command, ' ') execute "CompilerSet errorformat=" . escape (g:decada.Error_Format, ' ') +let &cpo = s:keepcpo +unlet s:keepcpo + finish " 1}}} "------------------------------------------------------------------------------ diff -Naur vim73.orig/runtime/compiler/erlang.vim vim73/runtime/compiler/erlang.vim --- vim73.orig/runtime/compiler/erlang.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim73/runtime/compiler/erlang.vim 2013-06-07 17:07:07.515653879 +0000 @@ -0,0 +1,13 @@ +" Vim compiler file +" Compiler: Erlang +" Maintainer: Dmitry Vasiliev +" Last Change: 2012-02-13 + +if exists("current_compiler") + finish +endif +let current_compiler = "erlang" + +CompilerSet makeprg=erlc\ -Wall\ % + +CompilerSet errorformat=%f:%l:\ %m diff -Naur vim73.orig/runtime/compiler/g95.vim vim73/runtime/compiler/g95.vim --- vim73.orig/runtime/compiler/g95.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim73/runtime/compiler/g95.vim 2013-06-07 17:07:07.602320298 +0000 @@ -0,0 +1,28 @@ +" Compiler: G95 +" Maintainer: H Xu +" Version: 0.1.3 +" Last Change: 2012 Apr 30 +" Homepage: http://www.vim.org/scripts/script.php?script_id=3492 +" https://bitbucket.org/xuhdev/compiler-g95.vim +" License: Same as Vim + +if exists('current_compiler') + finish +endif +let current_compiler = 'g95' +let s:keepcpo= &cpo +set cpo&vim + +if exists(":CompilerSet") != 2 " older Vim always used :setlocal + command -nargs=* CompilerSet setlocal +endif + +CompilerSet errorformat= + \%AIn\ file\ %f:%l, + \%-C%p1, + \%-Z%trror:\ %m, + \%-Z%tarning\ (%n):\ %m, + \%-C%.%# + +let &cpo = s:keepcpo +unlet s:keepcpo diff -Naur vim73.orig/runtime/compiler/gcc.vim vim73/runtime/compiler/gcc.vim --- vim73.orig/runtime/compiler/gcc.vim 2010-05-30 15:24:23.000000000 +0000 +++ vim73/runtime/compiler/gcc.vim 2013-06-07 17:07:07.618986917 +0000 @@ -1,7 +1,7 @@ " Vim compiler file " Compiler: GNU C Compiler " Maintainer: Nikolai Weibull -" Latest Revision: 2010-05-30 +" Latest Revision: 2010-10-14 if exists("current_compiler") finish @@ -9,7 +9,7 @@ let current_compiler = "gcc" let s:cpo_save = &cpo -set cpo-=C +set cpo&vim CompilerSet errorformat= \%*[^\"]\"%f\"%*\\D%l:%c:\ %m, @@ -18,10 +18,10 @@ \\"%f\"%*\\D%l:\ %m, \%-G%f:%l:\ %trror:\ (Each\ undeclared\ identifier\ is\ reported\ only\ once, \%-G%f:%l:\ %trror:\ for\ each\ function\ it\ appears\ in.), - \%f:%l:%c:\ %terror:\ %m, + \%f:%l:%c:\ %trror:\ %m, \%f:%l:%c:\ %tarning:\ %m, \%f:%l:%c:\ %m, - \%f:%l:\ %terror:\ %m, + \%f:%l:\ %trror:\ %m, \%f:%l:\ %tarning:\ %m, \%f:%l:\ %m, \\"%f\"\\,\ line\ %l%*\\D%c%*[^\ ]\ %m, diff -Naur vim73.orig/runtime/compiler/gfortran.vim vim73/runtime/compiler/gfortran.vim --- vim73.orig/runtime/compiler/gfortran.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim73/runtime/compiler/gfortran.vim 2013-06-07 17:07:07.632320213 +0000 @@ -0,0 +1,27 @@ +" Compiler: GNU Fortran Compiler +" Maintainer: H Xu +" Version: 0.1.3 +" Last Change: 2012 Apr 30 +" Homepage: http://www.vim.org/scripts/script.php?script_id=3496 +" https://bitbucket.org/xuhdev/compiler-gfortran.vim +" License: Same as Vim + +if exists('current_compiler') + finish +endif +let current_compiler = 'gfortran' +let s:keepcpo= &cpo +set cpo&vim + +if exists(":CompilerSet") != 2 " older Vim always used :setlocal + command -nargs=* CompilerSet setlocal +endif + +CompilerSet errorformat= + \%A%f:%l.%c:, + \%-Z%trror:\ %m, + \%-Z%tarning:\ %m, + \%-C%.%# + +let &cpo = s:keepcpo +unlet s:keepcpo diff -Naur vim73.orig/runtime/compiler/gnat.vim vim73/runtime/compiler/gnat.vim --- vim73.orig/runtime/compiler/gnat.vim 2010-05-15 11:03:29.000000000 +0000 +++ vim73/runtime/compiler/gnat.vim 2013-06-07 17:07:07.648986832 +0000 @@ -17,11 +17,11 @@ " Help Page: compiler-gnat "------------------------------------------------------------------------------ -if (exists("current_compiler") && - \ current_compiler == "gnat") || - \ version < 700 +if (exists("current_compiler")&& current_compiler == "gnat") || version < 700 finish endif +let s:keepcpo= &cpo +set cpo&vim let current_compiler = "gnat" @@ -62,6 +62,9 @@ execute "CompilerSet makeprg=" . escape (g:gnat.Get_Command('Make'), ' ') execute "CompilerSet errorformat=" . escape (g:gnat.Error_Format, ' ') +let &cpo = s:keepcpo +unlet s:keepcpo + finish " 1}}} "------------------------------------------------------------------------------ diff -Naur vim73.orig/runtime/compiler/haml.vim vim73/runtime/compiler/haml.vim --- vim73.orig/runtime/compiler/haml.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim73/runtime/compiler/haml.vim 2013-06-07 17:07:07.652320155 +0000 @@ -0,0 +1,28 @@ +" Vim compiler file +" Compiler: Haml +" Maintainer: Tim Pope +" Last Change: 2013 May 30 + +if exists("current_compiler") + finish +endif +let current_compiler = "haml" + +if exists(":CompilerSet") != 2 " older Vim always used :setlocal + command -nargs=* CompilerSet setlocal +endif + +let s:cpo_save = &cpo +set cpo-=C + +CompilerSet makeprg=haml\ -c + +CompilerSet errorformat= + \Haml\ %trror\ on\ line\ %l:\ %m, + \Syntax\ %trror\ on\ line\ %l:\ %m, + \%-G%.%# + +let &cpo = s:cpo_save +unlet s:cpo_save + +" vim:set sw=2 sts=2: diff -Naur vim73.orig/runtime/compiler/hp_acc.vim vim73/runtime/compiler/hp_acc.vim --- vim73.orig/runtime/compiler/hp_acc.vim 2010-05-15 11:03:29.000000000 +0000 +++ vim73/runtime/compiler/hp_acc.vim 2013-06-07 17:07:07.712319984 +0000 @@ -2,7 +2,7 @@ " Compiler: HP aCC " Maintainer: Matthias Ulrich " URL: http://www.subhome.de/vim/hp_acc.vim -" Last Change: 2005 Nov 19 +" Last Change: 2012 Apr 30 " " aCC --version says: "HP ANSI C++ B3910B A.03.13" " This compiler has been tested on: @@ -19,6 +19,8 @@ finish endif let current_compiler = "hp_acc" +let s:keepcpo= &cpo +set cpo&vim if exists(":CompilerSet") != 2 " older Vim always used :setlocal command -nargs=* CompilerSet setlocal @@ -30,4 +32,7 @@ \%Z\ \ \ \ %p^%.%#, \%-C%.%# +let &cpo = s:keepcpo +unlet s:keepcpo + " vim:ts=8:sw=4:cindent diff -Naur vim73.orig/runtime/compiler/ifort.vim vim73/runtime/compiler/ifort.vim --- vim73.orig/runtime/compiler/ifort.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim73/runtime/compiler/ifort.vim 2013-06-07 17:07:07.762319841 +0000 @@ -0,0 +1,27 @@ +" Compiler: Intel Fortran Compiler +" Maintainer: H Xu +" Version: 0.1.1 +" Last Change: 2012 Apr 30 +" Homepage: http://www.vim.org/scripts/script.php?script_id=3497 +" https://bitbucket.org/xuhdev/compiler-ifort.vim +" License: Same as Vim + +if exists('current_compiler') + finish +endif +let current_compiler = 'ifort' +let s:keepcpo= &cpo +set cpo&vim + +if exists(":CompilerSet") != 2 " older Vim always used :setlocal + command -nargs=* CompilerSet setlocal +endif + +CompilerSet errorformat= + \%A%f(%l):\ %trror\ \#%n:\ %m, + \%A%f(%l):\ %tarning\ \#%n:\ %m, + \%-Z%p^, + \%-G%.%# + +let &cpo = s:keepcpo +unlet s:keepcpo diff -Naur vim73.orig/runtime/compiler/intel.vim vim73/runtime/compiler/intel.vim --- vim73.orig/runtime/compiler/intel.vim 2010-05-15 11:03:29.000000000 +0000 +++ vim73/runtime/compiler/intel.vim 2013-06-07 17:07:07.768986489 +0000 @@ -1,12 +1,14 @@ " Vim compiler file " Compiler: Intel C++ 7.1 " Maintainer: David Harrison -" Last Change: 2004 May 16 +" Last Change: 2012 Apr 30 if exists("current_compiler") finish endif let current_compiler = "intel" +let s:keepcpo= &cpo +set cpo&vim if exists(":CompilerSet") != 2 " older Vim always used :setlocal command -nargs=* CompilerSet setlocal @@ -19,3 +21,6 @@ \%-Z\ \ %p^, \%-G\\s%#, \%-G%.%# + +let &cpo = s:keepcpo +unlet s:keepcpo diff -Naur vim73.orig/runtime/compiler/irix5_c.vim vim73/runtime/compiler/irix5_c.vim --- vim73.orig/runtime/compiler/irix5_c.vim 2010-05-15 11:03:29.000000000 +0000 +++ vim73/runtime/compiler/irix5_c.vim 2013-06-07 17:07:07.778986461 +0000 @@ -1,12 +1,14 @@ " Vim compiler file " Compiler: SGI IRIX 5.3 cc " Maintainer: David Harrison -" Last Change: 2004 Mar 27 +" Last Change: 2012 Apr 30 if exists("current_compiler") finish endif let current_compiler = "irix5_c" +let s:keepcpo= &cpo +set cpo&vim if exists(":CompilerSet") != 2 " older Vim always used :setlocal command -nargs=* CompilerSet setlocal @@ -19,3 +21,6 @@ \%-Z\ %p^, \-G\\s%#, \%-G%.%# + +let &cpo = s:keepcpo +unlet s:keepcpo diff -Naur vim73.orig/runtime/compiler/irix5_cpp.vim vim73/runtime/compiler/irix5_cpp.vim --- vim73.orig/runtime/compiler/irix5_cpp.vim 2010-05-15 11:03:29.000000000 +0000 +++ vim73/runtime/compiler/irix5_cpp.vim 2013-06-07 17:07:07.795653080 +0000 @@ -1,12 +1,14 @@ " Vim compiler file " Compiler: SGI IRIX 5.3 CC or NCC " Maintainer: David Harrison -" Last Change: 2004 Mar 27 +" Last Change: 2012 Apr 30 if exists("current_compiler") finish endif let current_compiler = "irix5_cpp" +let s:keepcpo= &cpo +set cpo&vim if exists(":CompilerSet") != 2 " older Vim always used :setlocal command -nargs=* CompilerSet setlocal @@ -19,3 +21,6 @@ \%-Z\ \ %p%^, \%+C\ %\\{10}%.%#, \%-G%.%# + +let &cpo = s:keepcpo +unlet s:keepcpo diff -Naur vim73.orig/runtime/compiler/mcs.vim vim73/runtime/compiler/mcs.vim --- vim73.orig/runtime/compiler/mcs.vim 2010-05-15 11:03:29.000000000 +0000 +++ vim73/runtime/compiler/mcs.vim 2013-06-07 17:07:07.822319670 +0000 @@ -1,7 +1,8 @@ " Vim compiler file " Compiler: Mono C# Compiler " Maintainer: Jarek Sobiecki -" Latest Revision: 2006-06-18 +" Last Updated By: Peter Collingbourne +" Latest Revision: 2012 Jul 19 if exists("current_compiler") finish @@ -12,13 +13,18 @@ set cpo-=C setlocal errorformat= + \%D%.%#Project\ \"%f/%[%^/\"]%#\"%.%#, + \%X%.%#Done\ building\ project\ \"%f/%[%^/\"]%#\"%.%#, + \%-G%\\s%.%#, + \%E%f(%l):\ error\ CS%n:%m, + \%W%f(%l):\ warning\ CS%n:%m, \%E%f(%l\\,%c):\ error\ CS%n:%m, \%W%f(%l\\,%c):\ warning\ CS%n:%m, \%E%>syntax\ error\\,%m,%Z%f(%l\\,%c):\ error\ CS%n:%m, \%D%*\\a[%*\\d]:\ Entering\ directory\ `%f', \%X%*\\a[%*\\d]:\ Leaving\ directory\ `%f', \%DMaking\ %*\\a\ in\ %f, - \%G-%.%# + \%-G%.%# let &cpo = s:cpo_save unlet s:cpo_save diff -Naur vim73.orig/runtime/compiler/mips_c.vim vim73/runtime/compiler/mips_c.vim --- vim73.orig/runtime/compiler/mips_c.vim 2010-05-15 11:03:29.000000000 +0000 +++ vim73/runtime/compiler/mips_c.vim 2013-06-07 17:07:07.852319585 +0000 @@ -1,12 +1,14 @@ " Vim compiler file " Compiler: SGI IRIX 6.5 MIPS C (cc) " Maintainer: David Harrison -" Last Change: 2004 Mar 27 +" Last Change: 2012 Apr 30 if exists("current_compiler") finish endif let current_compiler = "mips_c" +let s:keepcpo= &cpo +set cpo&vim if exists(":CompilerSet") != 2 " older Vim always used :setlocal command -nargs=* CompilerSet setlocal @@ -19,3 +21,6 @@ \%-Z\ \ %p^, \%-G\\s%#, \%-G%.%# + +let &cpo = s:keepcpo +unlet s:keepcpo diff -Naur vim73.orig/runtime/compiler/mipspro_c89.vim vim73/runtime/compiler/mipspro_c89.vim --- vim73.orig/runtime/compiler/mipspro_c89.vim 2010-05-15 11:03:29.000000000 +0000 +++ vim73/runtime/compiler/mipspro_c89.vim 2013-06-07 17:07:07.855652908 +0000 @@ -1,12 +1,14 @@ " Vim compiler file " Compiler: SGI IRIX 6.5 MIPSPro C (c89) " Maintainer: David Harrison -" Last Change: 2004 Mar 27 +" Last Change: 2012 Apr 30 if exists("current_compiler") finish endif let current_compiler = "mipspro_c89" +let s:keepcpo= &cpo +set cpo&vim if exists(":CompilerSet") != 2 " older Vim always used :setlocal command -nargs=* CompilerSet setlocal @@ -20,3 +22,6 @@ \%+C\ \ %m, \%-G\\s%#, \%-G%.%# + +let &cpo = s:keepcpo +unlet s:keepcpo diff -Naur vim73.orig/runtime/compiler/mipspro_cpp.vim vim73/runtime/compiler/mipspro_cpp.vim --- vim73.orig/runtime/compiler/mipspro_cpp.vim 2010-05-15 11:03:29.000000000 +0000 +++ vim73/runtime/compiler/mipspro_cpp.vim 2013-06-07 17:07:07.868986204 +0000 @@ -1,12 +1,14 @@ " Vim compiler file " Compiler: SGI IRIX 6.5 MIPSPro C++ (CC) " Maintainer: David Harrison -" Last Change: 2004 Mar 27 +" Last Change: 2012 Apr 30 if exists("current_compiler") finish endif let current_compiler = "mipspro_cpp" +let s:keepcpo= &cpo +set cpo&vim if exists(":CompilerSet") != 2 " older Vim always used :setlocal command -nargs=* CompilerSet setlocal @@ -19,3 +21,6 @@ \%-Z\ \ %p^, \%-G\\s%#, \%-G%.%# + +let &cpo = s:keepcpo +unlet s:keepcpo diff -Naur vim73.orig/runtime/compiler/msbuild.vim vim73/runtime/compiler/msbuild.vim --- vim73.orig/runtime/compiler/msbuild.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim73/runtime/compiler/msbuild.vim 2013-06-07 17:07:07.882319499 +0000 @@ -0,0 +1,21 @@ +" Vim compiler file +" Compiler: Microsoft Visual Studio C# +" Maintainer: Chiel ten Brinke (ctje92@gmail.com) +" Last Change: 2013 May 13 + +if exists("current_compiler") + finish +endif +let current_compiler = "msbuild" +let s:keepcpo= &cpo +set cpo&vim + +if exists(":CompilerSet") != 2 " older Vim always used :setlocal + command -nargs=* CompilerSet setlocal +endif + +CompilerSet errorformat=\ %#%f(%l\\\,%c):\ %m +CompilerSet makeprg=msbuild\ /nologo\ /v:q\ /property:GenerateFullPaths=true + +let &cpo = s:keepcpo +unlet s:keepcpo diff -Naur vim73.orig/runtime/compiler/rst.vim vim73/runtime/compiler/rst.vim --- vim73.orig/runtime/compiler/rst.vim 2010-05-15 11:03:29.000000000 +0000 +++ vim73/runtime/compiler/rst.vim 2013-06-07 17:07:07.988985861 +0000 @@ -9,7 +9,7 @@ let current_compiler = "rst" let s:cpo_save = &cpo -set cpo-=C +set cpo&vim setlocal errorformat= \%f:%l:\ (%tEBUG/0)\ %m, diff -Naur vim73.orig/runtime/compiler/sass.vim vim73/runtime/compiler/sass.vim --- vim73.orig/runtime/compiler/sass.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim73/runtime/compiler/sass.vim 2013-06-07 17:07:08.008985804 +0000 @@ -0,0 +1,30 @@ +" Vim compiler file +" Compiler: Sass +" Maintainer: Tim Pope +" Last Change: 2013 May 30 + +if exists("current_compiler") + finish +endif +let current_compiler = "sass" + +if exists(":CompilerSet") != 2 " older Vim always used :setlocal + command -nargs=* CompilerSet setlocal +endif + +let s:cpo_save = &cpo +set cpo-=C + +CompilerSet makeprg=sass\ -c + +CompilerSet errorformat= + \%f:%l:%m\ (Sass::Syntax%trror), + \%ESyntax\ %trror:%m, + \%C%\\s%\\+on\ line\ %l\ of\ %f, + \%Z%.%#, + \%-G%.%# + +let &cpo = s:cpo_save +unlet s:cpo_save + +" vim:set sw=2 sts=2: diff -Naur vim73.orig/runtime/compiler/tex.vim vim73/runtime/compiler/tex.vim --- vim73.orig/runtime/compiler/tex.vim 2010-05-15 11:03:29.000000000 +0000 +++ vim73/runtime/compiler/tex.vim 2013-06-07 17:07:08.085652252 +0000 @@ -1,11 +1,13 @@ " Vim compiler file " Compiler: TeX " Maintainer: Artem Chuprina -" Last Change: 2004 Mar 27 +" Last Change: 2012 Apr 30 if exists("current_compiler") finish endif +let s:keepcpo= &cpo +set cpo&vim if exists(":CompilerSet") != 2 " older Vim always used :setlocal command -nargs=* CompilerSet setlocal @@ -30,9 +32,6 @@ let current_compiler = 'make' endif -let s:cpo_save = &cpo -set cpo-=C - " Value errorformat are taken from vim help, see :help errorformat-LaTeX, with " addition from Srinath Avadhanula CompilerSet errorformat=%E!\ LaTeX\ %trror:\ %m, @@ -64,5 +63,5 @@ \%+Q%*[^()])%r, \%+Q[%\\d%*[^()])%r -let &cpo = s:cpo_save -unlet s:cpo_save +let &cpo = s:keepcpo +unlet s:keepcpo diff -Naur vim73.orig/runtime/compiler/xbuild.vim vim73/runtime/compiler/xbuild.vim --- vim73.orig/runtime/compiler/xbuild.vim 1970-01-01 00:00:00.000000000 +0000 +++ vim73/runtime/compiler/xbuild.vim 2013-06-07 17:07:08.128985461 +0000 @@ -0,0 +1,22 @@ +" Vim compiler file +" Compiler: Mono C# +" Maintainer: Chiel ten Brinke (ctje92@gmail.com) +" Last Change: 2013 May 13 + +if exists("current_compiler") + finish +endif + +let current_compiler = "xbuild" +let s:keepcpo= &cpo +set cpo&vim + +if exists(":CompilerSet") != 2 " older Vim always used :setlocal + command -nargs=* CompilerSet setlocal +endif + +CompilerSet errorformat=\ %#%f(%l\\\,%c):\ %m +CompilerSet makeprg=xbuild\ /nologo\ /v:q\ /property:GenerateFullPaths=true + +let &cpo = s:keepcpo +unlet s:keepcpo diff -Naur vim73.orig/runtime/doc/arabic.txt vim73/runtime/doc/arabic.txt --- vim73.orig/runtime/doc/arabic.txt 2010-08-15 12:23:19.000000000 +0000 +++ vim73/runtime/doc/arabic.txt 2013-06-07 17:07:08.218985204 +0000 @@ -1,4 +1,4 @@ -*arabic.txt* For Vim version 7.3. Last change: 2005 Mar 29 +*arabic.txt* For Vim version 7.3. Last change: 2010 Nov 13 VIM REFERENCE MANUAL by Nadim Shaikli @@ -146,7 +146,7 @@ :set arabic < The two above noted possible invocations are the preferred manner - in which users are instructed to proceed. Baring an enabled 'termbidi' + in which users are instructed to proceed. Barring an enabled 'termbidi' setting, both command options: 1. set the appropriate keymap diff -Naur vim73.orig/runtime/doc/autocmd.txt vim73/runtime/doc/autocmd.txt --- vim73.orig/runtime/doc/autocmd.txt 2010-08-15 12:23:19.000000000 +0000 +++ vim73/runtime/doc/autocmd.txt 2013-06-07 17:07:08.242318471 +0000 @@ -1,4 +1,4 @@ -*autocmd.txt* For Vim version 7.3. Last change: 2010 Jul 22 +*autocmd.txt* For Vim version 7.3. Last change: 2013 May 19 VIM REFERENCE MANUAL by Bram Moolenaar @@ -33,7 +33,7 @@ features, such as editing compressed files (see |gzip-example|). The usual place to put autocommands is in your .vimrc or .exrc file. - *E203* *E204* *E143* + *E203* *E204* *E143* *E855* WARNING: Using autocommands is very powerful, and may lead to unexpected side effects. Be careful not to destroy your text. - It's a good idea to do some testing on an expendable copy of a file first. @@ -263,8 +263,10 @@ Startup and exit |VimEnter| after doing all the startup stuff |GUIEnter| after starting the GUI successfully +|GUIFailed| after starting the GUI failed |TermResponse| after the terminal response to |t_RV| is received +|QuitPre| when using `:quit`, before deciding whether to quit |VimLeavePre| before exiting Vim, before writing the viminfo file |VimLeave| before exiting Vim, after writing the viminfo file @@ -299,6 +301,8 @@ |InsertEnter| starting Insert mode |InsertChange| when typing while in Insert or Replace mode |InsertLeave| when leaving Insert mode +|InsertCharPre| when a character was typed in Insert mode, before + inserting it |ColorScheme| after loading a color scheme @@ -310,6 +314,7 @@ |SessionLoadPost| after loading a session file |MenuPopup| just before showing the popup menu +|CompleteDone| after Insert mode completion is done |User| to be used in combination with ":doautocmd" @@ -383,6 +388,10 @@ This does NOT work for ":r file". Not used when the file doesn't exist. Also used after successfully recovering a file. + Also triggered for the filetypedetect group + when executing ":filetype detect" and when + writing an unnamed buffer in a way that the + buffer gets a name. *BufReadCmd* BufReadCmd Before starting to edit a new buffer. Should read the file into the buffer. |Cmd-event| @@ -446,6 +455,9 @@ 'modified' if successful, unless '+' is in 'cpo' and writing to another file |cpo-+|. The buffer contents should not be changed. + When the command resets 'modified' the undo + information is adjusted to mark older undo + states as 'modified', like |:write| does. |Cmd-event| *BufWritePost* BufWritePost After writing the whole buffer to a file @@ -469,6 +481,11 @@ *ColorScheme* ColorScheme After loading a color scheme. |:colorscheme| + *CompleteDone* +CompleteDone After Insert mode completion is done. Either + when something was completed or abandoning + completion. |ins-completion| + *CursorHold* CursorHold When the user doesn't press a key for the time specified with 'updatetime'. Not re-triggered @@ -502,10 +519,12 @@ Not triggered when there is typeahead or when an operator is pending. For an example see |match-parens|. - Careful: Don't do anything that the user does - not expect or that is slow. + Careful: This is triggered very often, don't + do anything that the user does not expect or + that is slow. *CursorMovedI* CursorMovedI After the cursor was moved in Insert mode. + Not triggered when the popup menu is visible. Otherwise the same as CursorMoved. *EncodingChanged* EncodingChanged Fires off after the 'encoding' option has been @@ -657,12 +676,26 @@ indicates the new mode. Be careful not to move the cursor or do anything else that the user does not expect. + *InsertCharPre* +InsertCharPre When a character is typed in Insert mode, + before inserting the char. + The |v:char| variable indicates the char typed + and can be changed during the event to insert + a different character. When |v:char| is set + to more than one character this text is + inserted literally. + It is not allowed to change the text |textlock|. + The event is not triggered when 'paste' is + set. *InsertEnter* InsertEnter Just before starting Insert mode. Also for Replace mode and Virtual Replace mode. The |v:insertmode| variable indicates the mode. - Be careful not to move the cursor or do - anything else that the user does not expect. + Be careful not to do anything else that the + user does not expect. + The cursor is restored afterwards. If you do + not want that set |v:char| to a non-empty + string. *InsertLeave* InsertLeave When leaving Insert mode. Also when using CTRL-O |i_CTRL-O|. But not for |i_CTRL-C|. @@ -682,7 +715,10 @@ QuickFixCmdPre Before a quickfix command is run (|:make|, |:lmake|, |:grep|, |:lgrep|, |:grepadd|, |:lgrepadd|, |:vimgrep|, |:lvimgrep|, - |:vimgrepadd|, |:lvimgrepadd|, |:cscope|). + |:vimgrepadd|, |:lvimgrepadd|, |:cscope|, + |:cfile|, |:cgetfile|, |:caddfile|, |:lfile|, + |:lgetfile|, |:laddfile|, |:helpgrep|, + |:lhelpgrep|). The pattern is matched against the command being run. When |:grep| is used but 'grepprg' is set to "internal" it still matches "grep". @@ -693,7 +729,16 @@ *QuickFixCmdPost* QuickFixCmdPost Like QuickFixCmdPre, but after a quickfix command is run, before jumping to the first - location. See |QuickFixCmdPost-example|. + location. For |:cfile| and |:lfile| commands + it is run after error file is read and before + moving to the first error. + See |QuickFixCmdPost-example|. + *QuitPre* +QuitPre When using `:quit`, `:wq` or `:qall`, before + deciding whether it closes the current window + or quits Vim. Can be used to close any + non-essential window if the current window is + the last ordinary window. *RemoteReply* RemoteReply When a reply from a Vim that functions as server was received |server2client()|. The @@ -786,13 +831,31 @@ TermResponse After the response to |t_RV| is received from the terminal. The value of |v:termresponse| can be used to do things depending on the - terminal version. + terminal version. Note that this event may be + triggered halfway executing another event, + especially if file I/O, a shell command or + anything else that takes time is involved. + *TextChanged* +TextChanged After a change was made to the text in the + current buffer in Normal mode. That is when + |b:changedtick| has changed. + Not triggered when there is typeahead or when + an operator is pending. + Careful: This is triggered very often, don't + do anything that the user does not expect or + that is slow. + *TextChangedI* +TextChangedI After a change was made to the text in the + current buffer in Insert mode. + Not triggered when the popup menu is visible. + Otherwise the same as TextChanged. *User* User Never executed automatically. To be used for autocommands that are only executed with ":doautocmd". *UserGettingBored* -UserGettingBored When the user hits CTRL-C. Just kidding! :-) +UserGettingBored When the user presses the same key 42 times. + Just kidding! :-) *VimEnter* VimEnter After doing all the startup stuff, including loading .vimrc files, executing the "-c cmd" @@ -1032,7 +1095,7 @@ option will not cause any commands to be executed. *:do* *:doau* *:doautocmd* *E217* -:do[autocmd] [group] {event} [fname] +:do[autocmd] [] [group] {event} [fname] Apply the autocommands matching [fname] (default: current file name) for {event} to the current buffer. You can use this when the current file name does not @@ -1041,8 +1104,8 @@ It's possible to use this inside an autocommand too, so you can base the autocommands for one extension on another extension. Example: > - :au Bufenter *.cpp so ~/.vimrc_cpp - :au Bufenter *.cpp doau BufEnter x.c + :au BufEnter *.cpp so ~/.vimrc_cpp + :au BufEnter *.cpp doau BufEnter x.c < Be careful to avoid endless loops. See |autocmd-nested|. @@ -1051,14 +1114,17 @@ argument is included, Vim executes only the matching autocommands for that group. Note: if you use an undefined group name, Vim gives you an error message. - + ** After applying the autocommands the modelines are processed, so that their settings overrule the settings from autocommands, like what happens when - editing a file. + editing a file. This is skipped when the + argument is present. You probably want to use + for events that are not used when loading + a buffer, such as |User|. *:doautoa* *:doautoall* -:doautoa[ll] [group] {event} [fname] +:doautoa[ll] [] [group] {event} [fname] Like ":doautocmd", but apply the autocommands to each loaded buffer. Note that [fname] is used to select the autocommands, not the buffers to which they are diff -Naur vim73.orig/runtime/doc/change.txt vim73/runtime/doc/change.txt --- vim73.orig/runtime/doc/change.txt 2010-08-15 12:23:19.000000000 +0000 +++ vim73/runtime/doc/change.txt 2013-06-07 17:07:08.275651709 +0000 @@ -1,4 +1,4 @@ -*change.txt* For Vim version 7.3. Last change: 2010 Jul 29 +*change.txt* For Vim version 7.3. Last change: 2013 Mar 19 VIM REFERENCE MANUAL by Bram Moolenaar @@ -71,7 +71,7 @@ "D" deletes the highlighted text plus all text until the end of the line. {not in Vi} - *:d* *:de* *:del* *:delete* + *:d* *:de* *:del* *:delete* *:dl* :[range]d[elete] [x] Delete [range] lines (default: current line) [into register x]. @@ -80,15 +80,16 @@ (default: current line |cmdline-ranges|) [into register x]. -These commands delete text. You can repeat them with the "." command -(except ":d") and undo them. Use Visual mode to delete blocks of text. See +These commands delete text. You can repeat them with the `.` command +(except `:d`) and undo them. Use Visual mode to delete blocks of text. See |registers| for an explanation of registers. An exception for the d{motion} command: If the motion is not linewise, the start and end of the motion are not in the same line, and there are only blanks before the start and after the end of the motion, the delete becomes linewise. This means that the delete also removes the line of blanks that you -might expect to remain. +might expect to remain. Use the |o_v| operator to force the motion to be +characterwise. Trying to delete an empty region of text (e.g., "d0" in the first column) is an error when 'cpoptions' includes the 'E' flag. @@ -131,7 +132,7 @@ See |ex-flags| for [flags]. These commands delete the between lines. This has the effect of joining -multiple lines into one line. You can repeat these commands (except ":j") and +multiple lines into one line. You can repeat these commands (except `:j`) and undo them. These commands, except "gJ", insert one space in place of the unless @@ -259,6 +260,12 @@ . CTRL-V replaces with a . {Vi: CTRL-V still replaces with a line break, cannot replace something with a } + + If {char} is CTRL-E or CTRL-Y the character from the + line below or above is used, just like with |i_CTRL-E| + and |i_CTRL-Y|. This also works with a count, thus + `10r` copies 10 characters from the line below. + If you give a [count], Vim replaces [count] characters with [count] {char}s. When {char} is a or , however, Vim inserts only one : "5r" replaces @@ -464,9 +471,9 @@ made out of spaces with the same indent made out of s (and a few spaces if necessary). If the 'expandtab' option is on, Vim uses only spaces. Then you can use ">><<" to replace s in the indent by spaces (or use -":retab!"). +`:retab!`). -To move a line several 'shiftwidth's, use Visual mode or the ":" commands. +To move a line several 'shiftwidth's, use Visual mode or the `:` commands. For example: > Vjj4> move three lines 4 indents to the right :<<< move current line 3 indents to the left @@ -486,7 +493,7 @@ works like a filter; not all versions do). The 'shell' option specifies the shell Vim uses to execute the filter command (See also the 'shelltype' option). You can repeat filter commands with ".". Vim does not recognize a -comment (starting with '"') after the ":!" command. +comment (starting with '"') after the `:!` command. *!* !{motion}{filter} Filter {motion} text lines through the external @@ -522,11 +529,11 @@ ={motion} Filter {motion} lines through the external program given with the 'equalprg' option. When the 'equalprg' option is empty (this is the default), use the - internal formatting function |C-indenting|. But when - 'indentexpr' is not empty, it will be used instead - |indent-expression|. When Vim was compiled without - internal formatting then the "indent" program is used - as a last resort. + internal formatting function |C-indenting| and + |'lisp'|. But when 'indentexpr' is not empty, it will + be used instead |indent-expression|. When Vim was + compiled without internal formatting then the "indent" + program is used as a last resort. *==* == Filter [count] lines like with ={motion}. @@ -573,34 +580,37 @@ Repeat last :substitute with same search pattern and substitute string, but without the same flags. You may add [flags], see |:s_flags|. - Note that after ":substitute" the '&' flag can't be + Note that after `:substitute` the '&' flag can't be used, it's recognized as a pattern separator. - The space between ":substitute" and the 'c', 'g' and + The space between `:substitute` and the 'c', 'g' and 'r' flags isn't required, but in scripts it's a good idea to keep it to avoid confusion. :[range]~[&][flags] [count] *:~* Repeat last substitute with same substitute string but with last used search pattern. This is like - ":&r". See |:s_flags| for [flags]. + `:&r`. See |:s_flags| for [flags]. *&* -& Synonym for ":s" (repeat last substitute). Note +& Synonym for `:s` (repeat last substitute). Note that the flags are not remembered, thus it might - actually work differently. You can use ":&&" to keep + actually work differently. You can use `:&&` to keep the flags. *g&* -g& Synonym for ":%s//~/&" (repeat last substitute on all - lines with the same flags). +g& Synonym for `:%s//~/&` (repeat last substitute with + last search pattern on all lines with the same flags). + For example, when you first do a substitution with + `:s/pattern/repl/flags` and then `/search` for + something else, `g&` will do `:%s/search/repl/flags`. Mnemonic: global substitute. {not in Vi} *:snomagic* *:sno* -:[range]sno[magic] ... Same as ":substitute", but always use 'nomagic'. +:[range]sno[magic] ... Same as `:substitute`, but always use 'nomagic'. {not in Vi} *:smagic* *:sm* -:[range]sm[agic] ... Same as ":substitute", but always use 'magic'. +:[range]sm[agic] ... Same as `:substitute`, but always use 'magic'. {not in Vi} *:s_flags* @@ -610,7 +620,7 @@ command. Examples: > :&& :s/this/that/& -< Note that ":s" and ":&" don't keep the flags. +< Note that `:s` and `:&` don't keep the flags. {not in Vi} [c] Confirm each substitution. Vim highlights the matching string (with @@ -659,6 +669,8 @@ [n] Report the number of matches, do not actually substitute. The [c] flag is ignored. The matches are reported as if 'report' is zero. Useful to |count-items|. + If \= |sub-replace-expression| is used, the expression will be + evaluated in the |sandbox| at every match. [p] Print the line containing the last substitute. @@ -666,14 +678,14 @@ [l] Like [p] but print the text like |:list|. -[r] Only useful in combination with ":&" or ":s" without arguments. ":&r" - works the same way as ":~": When the search pattern is empty, use the +[r] Only useful in combination with `:&` or `:s` without arguments. `:&r` + works the same way as `:~`: When the search pattern is empty, use the previously used search pattern instead of the search pattern from the - last substitute or ":global". If the last command that did a search - was a substitute or ":global", there is no effect. If the last + last substitute or `:global`. If the last command that did a search + was a substitute or `:global`, there is no effect. If the last command was a search command such as "/", use the pattern from that command. - For ":s" with an argument this already happens: > + For `:s` with an argument this already happens: > :s/blue/red/ /green :s//red/ or :~ or :&r @@ -690,8 +702,9 @@ order to skip the pattern the "magicness" must be known. Catch 22! If the {pattern} for the substitute command is empty, the command uses the -pattern from the last substitute or ":global" command. With the [r] flag, the -command uses the pattern from the last substitute, ":global", or search +pattern from the last substitute or `:global` command. If there is none, but +there is a previous search pattern, that one is used. With the [r] flag, the +command uses the pattern from the last substitute, `:global`, or search command. If the {string} is omitted the substitute is done as if it's empty. Thus the @@ -716,11 +729,13 @@ *sub-replace-special* *:s\=* When the {string} starts with "\=" it is evaluated as an expression, see -|sub-replace-expression|. You can use that for any special characters. +|sub-replace-expression|. You can use that for complex replacement or special +characters. + Otherwise these characters in {string} have a special meaning: *:s%* When {string} is equal to "%" and '/' is included with the 'cpoptions' option, -then the {string} of the previous substitute command is used. |cpo-/| +then the {string} of the previous substitute command is used, see |cpo-/| magic nomagic action ~ & \& replaced with the whole matched pattern *s/\&* @@ -755,12 +770,25 @@ \x where x is any character not mentioned above: Reserved for future expansion +The special meaning is also used inside the third argument {sub} of +the |substitute()| function with the following exceptions: + - A % inserts a percent literally without regard to 'cpoptions'. + - magic is always set without regard to 'magic'. + - A ~ inserts a tilde literally. + - and \r inserts a carriage-return (CTRL-M). + - \ does not have a special meaning. it's just one of \x. + Examples: > :s/a\|b/xxx\0xxx/g modifies "a b" to "xxxaxxx xxxbxxx" :s/\([abc]\)\([efg]\)/\2\1/g modifies "af fa bg" to "fa fa gb" :s/abcde/abc^Mde/ modifies "abcde" to "abc", "de" (two lines) :s/$/\^M/ modifies "abcde" to "abcde^M" :s/\w\+/\u\0/g modifies "bla bla" to "Bla Bla" + :s/\w\+/\L\u/g modifies "BLA bla" to "Bla Bla" + +Note: "\L\u" can be used to capitalize the first letter of a word. This is +not compatible with Vi and older versions of Vim, where the "\u" would cancel +out the "\L". Same for "\U\l". Note: In previous versions CTRL-V was handled in a special way. Since this is not Vi compatible, this was removed. Use a backslash instead. @@ -786,17 +814,19 @@ Substitute with an expression *sub-replace-expression* *sub-replace-\=* When the substitute string starts with "\=" the remainder is interpreted as an -expression. This does not work recursively: a substitute() function inside +expression. This does not work recursively: a |substitute()| function inside the expression cannot use "\=" for the substitute string. The special meaning for characters as mentioned at |sub-replace-special| does -not apply except for "", "\" and "\\". Thus in the result of the -expression you need to use two backslashes to get one, put a backslash before a - you want to insert, and use a without a backslash where you want to -break the line. - -For convenience a character is also used as a line break. Prepend a -backslash to get a real character (which will be a NUL in the file). +not apply except for "". A character is used as a line break, you +can get one with a double-quote string: "\n". Prepend a backslash to get a +real character (which will be a NUL in the file). + +The "\=" notation can also be used inside the third argument {sub} of +|substitute()| function. In this case, the special meaning for characters as +mentioned at |sub-replace-special| does not apply at all. Especially, and + are interpreted not as a line break but as a carriage-return and a +new-line respectively. When the result is a |List| then the items are joined with separating line breaks. Thus each item becomes a line, except that they can contain line @@ -834,7 +864,7 @@ 4.4 Changing tabs *change-tabs* - *:ret* *:retab* + *:ret* *:retab* *:retab!* :[range]ret[ab][!] [new_tabstop] Replace all sequences of white-space containing a with new strings of white-space using the new @@ -853,7 +883,7 @@ Careful: This command modifies any characters inside of strings in a C program. Use "\t" to avoid this (that's a good habit anyway). - ":retab!" may also change a sequence of spaces by + `:retab!` may also change a sequence of spaces by characters, which can mess up a printf(). {not in Vi} Not available when |+ex_extra| feature was disabled at @@ -916,8 +946,10 @@ {Visual}["x]Y Yank the highlighted lines [into register x] (for {Visual} see |Visual-mode|). {not in Vi} - *:y* *:yank* -:[range]y[ank] [x] Yank [range] lines [into register x]. + *:y* *:yank* *E850* +:[range]y[ank] [x] Yank [range] lines [into register x]. Yanking to the + "* or "+ registers is possible only when the + |+clipboard| feature is included. :[range]y[ank] [x] {count} Yank {count} lines, starting with last line number @@ -961,8 +993,12 @@ current line). This always works |linewise|, thus this command can be used to put a yanked block as new lines. - The cursor is left on the first non-blank in the last - new line. + If no register is specified, it depends on the 'cb' + option: If 'cb' contains "unnamedplus", paste from the + + register |quoteplus|. Otherwise, if 'cb' contains + "unnamed", paste from the * register |quotestar|. + Otherwise, paste from the unnamed register + |quote_quote|. The register can also be '=' followed by an optional expression. The expression continues until the end of the command. You need to escape the '|' and '"' @@ -1167,7 +1203,7 @@ 9. Last search pattern register "/ *quote_/* *quote/* Contains the most recent search-pattern. This is used for "n" and 'hlsearch'. -It is writable with ":let", you can change it to have 'hlsearch' highlight +It is writable with `:let`, you can change it to have 'hlsearch' highlight other matches without actually searching. You can't yank or delete into this register. The search direction is available in |v:searchforward|. Note that the valued is restored when returning from a function @@ -1175,12 +1211,12 @@ {not in Vi} *@/* -You can write to a register with a ":let" command |:let-@|. Example: > +You can write to a register with a `:let` command |:let-@|. Example: > :let @/ = "the" If you use a put command without specifying a register, Vim uses the register that was last filled (this is also the contents of the unnamed register). If -you are confused, use the ":dis" command to find out what Vim will put (this +you are confused, use the `:dis` command to find out what Vim will put (this command displays all named and numbered registers; the unnamed register is labelled '"'). @@ -1387,16 +1423,19 @@ middle-comment leader with the end-comment leader and apply any specified alignment, leaving just " */". There is no need to hit BackSpace first. +When there is a match with a middle part, but there also is a maching end part +which is longer, the end part is used. This makes a C style comment work +without requiring the middle part to end with a space. Here is an example of alignment flags at work to make a comment stand out -(kind of looks like a 1 too). Consider comment string > - sr:/***,m:**,ex2:******/ - - /*** - **<--right aligned from "r" flag - ** -offset 2 spaces from the "2" flag--->** - ******/ +(kind of looks like a 1 too). Consider comment string: > + :set comments=sr:/***,m:**,ex-2:******/ +< + /*** ~ + **<--right aligned from "r" flag ~ + ** ~ +offset 2 spaces for the "-2" flag--->** ~ + ******/ ~ In this case, the first comment was typed, then return was pressed 4 times, then "/" was pressed to end the comment. @@ -1414,8 +1453,8 @@ alignment flags either. The same behaviour can be defined in those other formatting options. One consideration is that 'cindent' has additional options for context based indenting of comments but cannot replicate many three piece -indent alignments. However, 'indentexpr' is has the ability to work better -with three piece comments. +indent alignments. However, 'indentexpr' has the ability to work better with +three piece comments. Other examples: > "b:*" Includes lines starting with "*", but not if the "*" is @@ -1473,6 +1512,7 @@ first line of a paragraph second line of the same paragraph third line. +< This also works inside comments, ignoring the comment leader. v Vi-compatible auto-wrapping in insert mode: Only break a line at a blank that you have entered during the current insert command. (Note: this is not 100% Vi compatible. Vi has some "unexpected features" or @@ -1493,6 +1533,12 @@ characters. Overruled by the 'M' flag. 1 Don't break a line after a one-letter word. It's broken before it instead (if possible). +j Where it makes sense, remove a comment leader when joining lines. For + example, joining: + int i; // the index ~ + // in the list ~ + Becomes: + int i; // the index in the list ~ With 't' and 'c' you can specify when Vim performs auto-wrapping: @@ -1536,7 +1582,7 @@ :set fo=tcrq < -Automatic formatting *auto-format* +Automatic formatting *auto-format* *autoformat* When the 'a' flag is present in 'formatoptions' text is formatted automatically when inserting text or deleting text. This works nice for @@ -1645,7 +1691,7 @@ last search pattern is used. This allows trying out a pattern first. -Note that using ":sort" with ":global" doesn't sort the matching lines, it's +Note that using `:sort` with `:global` doesn't sort the matching lines, it's quite useless. The details about sorting depend on the library function used. There is no diff -Naur vim73.orig/runtime/doc/cmdline.txt vim73/runtime/doc/cmdline.txt --- vim73.orig/runtime/doc/cmdline.txt 2010-08-15 12:23:19.000000000 +0000 +++ vim73/runtime/doc/cmdline.txt 2013-06-07 17:07:08.295651652 +0000 @@ -1,4 +1,4 @@ -*cmdline.txt* For Vim version 7.3. Last change: 2010 May 07 +*cmdline.txt* For Vim version 7.3. Last change: 2013 Mar 16 VIM REFERENCE MANUAL by Bram Moolenaar @@ -83,9 +83,9 @@ CTRL-Q Same as CTRL-V. But with some terminals it is used for control flow, it doesn't work then. - *c_* + *c_* *c_Left* cursor left - *c_* + *c_* *c_Right* cursor right *c_* or *c_* @@ -93,18 +93,18 @@ *c_* or *c_* cursor one WORD right -CTRL-B or *c_CTRL-B* *c_* +CTRL-B or *c_CTRL-B* *c_* *c_Home* cursor to beginning of command-line -CTRL-E or *c_CTRL-E* *c_* +CTRL-E or *c_CTRL-E* *c_* *c_End* cursor to end of command-line *c_* Move the cursor to the position of the mouse click. -CTRL-H *c_* *c_CTRL-H* +CTRL-H *c_* *c_CTRL-H* *c_BS* Delete the character in front of the cursor (see |:fixdel| if your key does not do what you want). - *c_* + *c_* *c_Del* Delete the character under the cursor (at end of line: character before the cursor) (see |:fixdel| if your key does not do what you want). @@ -118,7 +118,7 @@ preferred behavior, add the following to your .vimrc: > :cnoremap < - *c_* + *c_* *c_Insert* Toggle between insert and overstrike. {not in Vi} {char1} {char2} or *c_digraph* @@ -217,16 +217,16 @@ :return cmd :endfunc < This doesn't work recursively, thus not when already editing - an expression. + an expression. But it is possible to use in a mapping. *c_CTRL-Y* CTRL-Y When there is a modeless selection, copy the selection into the clipboard. |modeless-selection| If there is no selection CTRL-Y is inserted as a character. -CTRL-J *c_CTRL-J* *c_* *c_* +CTRL-J *c_CTRL-J* *c_* *c_* *c_CR* or start entered command - *c_* + *c_* *c_Esc* When typed and 'x' not present in 'cpoptions', quit Command-line mode without executing. In macros or when 'x' present in 'cpoptions', start entered command. @@ -235,12 +235,12 @@ *c_CTRL-C* CTRL-C quit command-line without executing - *c_* + *c_* *c_Up* recall older command-line from history, whose beginning matches the current command-line (see below). {not available when compiled without the |+cmdline_hist| feature} - *c_* + *c_* *c_Down* recall more recent command-line from history, whose beginning matches the current command-line (see below). {not available when compiled without the |+cmdline_hist| @@ -330,12 +330,12 @@ :his[tory] [{name}] [{first}][, [{last}]] List the contents of history {name} which can be: - c[md] or : command-line history - s[earch] or / search string history - e[xpr] or = expression register history - i[nput] or @ input line history - d[ebug] or > debug command history - a[ll] all of the above + c[md] or : command-line history + s[earch] or / or ? search string history + e[xpr] or = expression register history + i[nput] or @ input line history + d[ebug] or > debug command history + a[ll] all of the above {not in Vi} If the numbers {first} and/or {last} are given, the respective @@ -372,10 +372,10 @@ - Mappings: Only after a ":map" or similar command. - Variable and function names: Only after a ":if", ":call" or similar command. -When Vim was compiled with the |+cmdline_compl| feature disabled, only file -names, directories and help items can be completed. The number of help item -matches is limited (currently to 300) to avoid a long delay when there are -very many matches. +When Vim was compiled without the |+cmdline_compl| feature only file names, +directories and help items can be completed. The number of help item matches +is limited (currently to 300) to avoid a long delay when there are very many +matches. These are the commands that can be used: @@ -423,7 +423,10 @@ The 'wildchar' option defaults to (CTRL-E when in Vi compatible mode; in a previous version was used). In the pattern standard wildcards '*' and -'?' are accepted. '*' matches any string, '?' matches exactly one character. +'?' are accepted when matching file names. '*' matches any string, '?' +matches exactly one character. + +The 'wildignorecase' option can be set to ignore case in filenames. If you like tcsh's autolist completion, you can use this mapping: :cnoremap X @@ -711,10 +714,15 @@ Visual Mode and Range *v_:* {Visual}: Starts a command-line with the Visual selected lines as a - range. The code ":'<,'>" is used for this range, which makes + range. The code `:'<,'>` is used for this range, which makes it possible to select a similar line from the command-line history for repeating a command on different Visually selected lines. + When Visual mode was already ended, a short way to use the + Visual area for a range is `:*`. This requires that "*" does + not appear in 'cpo', see |cpo-star|. Otherwise you will have + to type `:'<,'>` + ============================================================================== 5. Ex command-line flags *ex-flags* @@ -781,30 +789,34 @@ *:* *:* *:* ** *:* ** *:* ** *:* ** *:* ** - *E495* *E496* *E497* *E498* *E499* *E500* + ** *E495* *E496* *E497* *E499* *E500* Note: these are typed literally, they are not special keys! is replaced with the word under the cursor (like |star|) is replaced with the WORD under the cursor (see |WORD|) is replaced with the path name under the cursor (like what |gf| uses) - when executing autocommands, is replaced with the file name - for a file read or write - when executing autocommands, is replaced with the currently + When executing autocommands, is replaced with the file name + for a file read or write. + When executing autocommands, is replaced with the currently effective buffer number (for ":r file" and ":so file" it is the current buffer, the file being read/sourced is not in a buffer). - when executing autocommands, is replaced with the match for + When executing autocommands, is replaced with the match for which this autocommand was executed. It differs from only when the file name isn't used to match with (for FileType, Syntax and SpellFileMissing events). - when executing a ":source" command, is replaced with the - file name of the sourced file; - when executing a function, is replaced with + When executing a ":source" command, is replaced with the + file name of the sourced file. *E498* + When executing a function, is replaced with "function {function-name}"; function call nesting is indicated like this: "function {function-name1}..{function-name2}". Note that filename-modifiers are useless when is used inside a function. + When executing a ":source" command, is replaced with the + line number. *E842* + When executing a function it's the line number relative to + the start of the function. *filename-modifiers* *:_%:* *::8* *::p* *::.* *::~* *::h* *::t* *::r* *::e* *::s* *::gs* @@ -819,10 +831,11 @@ the home directory. If the name is a directory a path separator is added at the end. For a file name that does not exist and does not have an absolute path the result is - unpredictable. + unpredictable. On MS-Windows an 8.3 filename is expanded to + the long name. :8 Converts the path to 8.3 short format (currently only on - win32). Will act on as much of a path that is an existing - path. + MS-Windows). Will act on as much of a path that is an + existing path. :~ Reduce file name to be relative to the home directory, if possible. File name is unmodified if it is not below the home directory. @@ -860,7 +873,7 @@ After this, the previous modifiers can be used again. For example ":p", to make a full path after the substitution. :gs?pat?sub? - Substitute all occurrences of "path" with "sub". Otherwise + Substitute all occurrences of "pat" with "sub". Otherwise this works like ":s". Examples, when the file name is "src/version.c", current dir @@ -951,7 +964,7 @@ \\$home file "\\", followed by expanded $home ============================================================================== -6. Command-line window *cmdline-window* *cmdwin* +7. Command-line window *cmdline-window* *cmdwin* *command-line-window* In the command-line window the command line can be edited just like editing text in any window. It is a special kind of window, because you cannot leave diff -Naur vim73.orig/runtime/doc/debug.txt vim73/runtime/doc/debug.txt --- vim73.orig/runtime/doc/debug.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/debug.txt 2013-06-07 17:07:08.328984890 +0000 @@ -1,4 +1,4 @@ -*debug.txt* For Vim version 7.3. Last change: 2010 Jul 20 +*debug.txt* For Vim version 7.3. Last change: 2012 Feb 11 VIM REFERENCE MANUAL by Bram Moolenaar @@ -15,14 +15,15 @@ ============================================================================== -1. Location of a crash, using gcc and gdb *debug-gcc* +1. Location of a crash, using gcc and gdb *debug-gcc* *gdb* When Vim crashes in one of the test files, and you are using gcc for compilation, here is what you can do to find out exactly where Vim crashes. This also applies when using the MingW tools. -1. Compile Vim with the "-g" option (there is a line in the Makefile for this, - which you can uncomment). +1. Compile Vim with the "-g" option (there is a line in the src/Makefile for + this, which you can uncomment). Also make sure "strip" is disabled (do not + install it, or use the line "STRIP = /bin/true"). 2. Execute these commands (replace "11" with the test that fails): > cd testdir @@ -67,7 +68,7 @@ some steps to provide a useful bug report. -GENERIC ~ +3.1 GENERIC ~ You must obtain the debugger symbols (PDB) file for your executable: gvim.pdb for gvim.exe, or vim.pdb for vim.exe. The PDB should be available from the @@ -89,7 +90,7 @@ *debug-vs2005* -2.2 Debugging Vim crashes with Visual Studio 2005/Visual C++ 2005 Express ~ +3.2 Debugging Vim crashes with Visual Studio 2005/Visual C++ 2005 Express ~ First launch vim.exe or gvim.exe and then launch Visual Studio. (If you don't have Visual Studio, follow the instructions at |get-ms-debuggers| to obtain a @@ -123,7 +124,7 @@ need to save minidumps or you want a just-in-time (postmortem) debugger. *debug-windbg* -2.3 Debugging Vim crashes with WinDbg ~ +3.3 Debugging Vim crashes with WinDbg ~ See |get-ms-debuggers| to obtain a copy of WinDbg. @@ -149,7 +150,7 @@ .dump vim.dmp < *debug-minidump* -2.4 Opening a Minidump ~ +3.4 Opening a Minidump ~ If you have a minidump file, you can open it in Visual Studio or in WinDbg. @@ -161,7 +162,7 @@ |debug-windbg| to set the Symbol File Path. *get-ms-debuggers* -2.5 Obtaining Microsoft Debugging Tools ~ +3.5 Obtaining Microsoft Debugging Tools ~ The Debugging Tools for Windows (including WinDbg) can be downloaded from http://www.microsoft.com/whdc/devtools/debugging/default.mspx diff -Naur vim73.orig/runtime/doc/develop.txt vim73/runtime/doc/develop.txt --- vim73.orig/runtime/doc/develop.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/develop.txt 2013-06-07 17:07:08.365651452 +0000 @@ -1,4 +1,4 @@ -*develop.txt* For Vim version 7.3. Last change: 2008 Dec 17 +*develop.txt* For Vim version 7.3. Last change: 2013 Apr 27 VIM REFERENCE MANUAL by Bram Moolenaar @@ -20,6 +20,7 @@ Vim is open source software. Everybody is encouraged to contribute to help improving Vim. For sending patches a context diff "diff -c" is preferred. Also see http://www.vim.org/tips/tip.php?tip_id=618. +Also see http://vim.wikia.com/wiki/How_to_make_and_submit_a_patch. ============================================================================== 1. Design goals *design-goals* @@ -232,6 +233,17 @@ new C++ reserved keyword try Borland C++ doesn't like it to be used as a variable. +clear Mac curses.h +echo Mac curses.h +instr Mac curses.h +meta Mac curses.h +newwin Mac curses.h +nl Mac curses.h +overwrite Mac curses.h +refresh Mac curses.h +scroll Mac curses.h +typeahead Mac curses.h + basename() GNU string function dirname() GNU string function get_env_value() Linux system function diff -Naur vim73.orig/runtime/doc/diff.txt vim73/runtime/doc/diff.txt --- vim73.orig/runtime/doc/diff.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/diff.txt 2013-06-07 17:07:08.375651424 +0000 @@ -1,4 +1,4 @@ -*diff.txt* For Vim version 7.3. Last change: 2010 Jul 31 +*diff.txt* For Vim version 7.3. Last change: 2012 Sep 05 VIM REFERENCE MANUAL by Bram Moolenaar @@ -86,16 +86,16 @@ While already in Vim you can start diff mode in three ways. *E98* -:diffsplit {filename} *:diffs* *:diffsplit* +:diffs[plit] {filename} *:diffs* *:diffsplit* Open a new window on the file {filename}. The options are set as for "vimdiff" for the current and the newly opened window. Also see 'diffexpr'. *:difft* *:diffthis* -:diffthis Make the current window part of the diff windows. This sets +:difft[his] Make the current window part of the diff windows. This sets the options like for "vimdiff". -:diffpatch {patchfile} *E816* *:diffp* *:diffpatch* +:diffp[atch] {patchfile} *E816* *:diffp* *:diffpatch* Use the current buffer, patch it with the diff found in {patchfile} and open a buffer on the result. The options are set as for "vimdiff". @@ -123,9 +123,9 @@ file for a moment and come back to the same file and be in diff mode again. *:diffo* *:diffoff* -:diffoff Switch off diff mode for the current window. +:diffo[ff] Switch off diff mode for the current window. -:diffoff! Switch off diff mode for the current window and in all windows +:diffo[ff]! Switch off diff mode for the current window and in all windows in the current tab page where 'diff' is set. The ":diffoff" command resets the relevant options to their default value. @@ -167,8 +167,8 @@ possible to view the changes you have made to a buffer since the file was loaded. Since Vim doesn't allow having two buffers for the same file, you need another buffer. This command is useful: > - command DiffOrig vert new | set bt=nofile | r # | 0d_ | diffthis - \ | wincmd p | diffthis + command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_ + \ | diffthis | wincmd p | diffthis (this is in |vimrc_example.vim|). Use ":DiffOrig" to see the differences between the current buffer and the file it was loaded from. @@ -178,7 +178,7 @@ nodiff" before hiding it. *:diffu* *:diffupdate* -:diffu[pdate] Update the diff highlighting and folds. +:diffu[pdate][!] Update the diff highlighting and folds. Vim attempts to keep the differences updated when you make changes to the text. This mostly takes care of inserted and deleted lines. Changes within a @@ -187,6 +187,9 @@ :diffupdate +If the ! is included Vim will check if the file was changed externally and +needs to be reloaded. It will prompt for each changed file, like `:checktime` +was used. Vim will show filler lines for lines that are missing in one window but are present in another. These lines were inserted in another file or deleted in @@ -217,7 +220,7 @@ that parts in the middle that are still the same are highlighted anyway. Only "iwhite" of 'diffopt' is used here. -|hl-DiffDelete| DiffDelete Deleted lines. Also called filler lines, +|hl-DiffDelete| DiffDelete Deleted lines. Also called filler lines, because they don't really exist in this buffer. @@ -261,10 +264,12 @@ *do* do Same as ":diffget" without argument or range. The "o" stands for "obtain" ("dg" can't be used, it could be the start of - "dgg"!). + "dgg"!). Note: this doesn't work in Visual mode. *dp* dp Same as ":diffput" without argument or range. + Note: this doesn't work in Visual mode. + When no [range] is given, the diff at the cursor position or just above it is affected. When [range] is used, Vim tries to only put or get the specified @@ -328,7 +333,7 @@ The "1a2" item appends the line "bbb". The "4d4" item deletes the line "111". -The '7c7" item replaces the line "GGG" with "ggg". +The "7c7" item replaces the line "GGG" with "ggg". When 'diffexpr' is not empty, Vim evaluates it to obtain a diff file in the format mentioned. These variables are set to the file names used: @@ -371,9 +376,9 @@ If it's not clear what the problem is set the 'verbose' option to one or more to see more messages. -The self-installing Vim includes a diff program. If you don't have it you -might want to download a diff.exe. For example from -http://jlb.twu.net/code/unixkit.php. +The self-installing Vim for MS-Windows includes a diff program. If you don't +have it you might want to download a diff.exe. For example from +http://gnuwin32.sourceforge.net/packages/diffutils.htm. USING PATCHES *diff-patchexpr* diff -Naur vim73.orig/runtime/doc/digraph.txt vim73/runtime/doc/digraph.txt --- vim73.orig/runtime/doc/digraph.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/digraph.txt 2013-06-07 17:07:08.392318043 +0000 @@ -1,4 +1,4 @@ -*digraph.txt* For Vim version 7.3. Last change: 2010 Apr 11 +*digraph.txt* For Vim version 7.3. Last change: 2011 Jan 15 VIM REFERENCE MANUAL by Bram Moolenaar @@ -40,7 +40,7 @@ disabled, the ":digraph" command will display an error message. Example of the output of ":digraphs": > - TH 222 ss 223 a! 224 a' 225 a> 226 a? 227 a: 228 + TH Þ 222 ss ß 223 a! à 224 a' á 225 a> â 226 a? ã 227 a: ä 228 The first two characters in each column are the characters you have to type to enter the digraph. @@ -156,7 +156,7 @@ Five 5 Hiragana Six 6 Katakana -Example: a: is and o: is +Example: a: is ä and o: is ö These are the RFC1345 digraphs for the one-byte characters. See the output of ":digraphs" for the others. The characters above 255 are only available when @@ -251,100 +251,1233 @@ ~^ PM 0x9e 158 PRIVACY MESSAGE (PM) ~_ AC 0x9f 159 APPLICATION PROGRAM COMMAND (APC) | NS 0xa0 160 NO-BREAK SPACE - !I 0xa1 161 INVERTED EXCLAMATION MARK - Ct 0xa2 162 CENT SIGN - Pd 0xa3 163 POUND SIGN - Cu 0xa4 164 CURRENCY SIGN - Ye 0xa5 165 YEN SIGN - BB 0xa6 166 BROKEN BAR - SE 0xa7 167 SECTION SIGN - ': 0xa8 168 DIAERESIS - Co 0xa9 169 COPYRIGHT SIGN - -a 0xaa 170 FEMININE ORDINAL INDICATOR - << 0xab 171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - NO 0xac 172 NOT SIGN - -- 0xad 173 SOFT HYPHEN - Rg 0xae 174 REGISTERED SIGN - 'm 0xaf 175 MACRON - DG 0xb0 176 DEGREE SIGN - +- 0xb1 177 PLUS-MINUS SIGN - 2S 0xb2 178 SUPERSCRIPT TWO - 3S 0xb3 179 SUPERSCRIPT THREE - '' 0xb4 180 ACUTE ACCENT - My 0xb5 181 MICRO SIGN - PI 0xb6 182 PILCROW SIGN - .M 0xb7 183 MIDDLE DOT - ', 0xb8 184 CEDILLA - 1S 0xb9 185 SUPERSCRIPT ONE - -o 0xba 186 MASCULINE ORDINAL INDICATOR - >> 0xbb 187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 14 0xbc 188 VULGAR FRACTION ONE QUARTER - 12 0xbd 189 VULGAR FRACTION ONE HALF - 34 0xbe 190 VULGAR FRACTION THREE QUARTERS - ?I 0xbf 191 INVERTED QUESTION MARK - A! 0xc0 192 LATIN CAPITAL LETTER A WITH GRAVE - A' 0xc1 193 LATIN CAPITAL LETTER A WITH ACUTE - A> 0xc2 194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX - A? 0xc3 195 LATIN CAPITAL LETTER A WITH TILDE - A: 0xc4 196 LATIN CAPITAL LETTER A WITH DIAERESIS - AA 0xc5 197 LATIN CAPITAL LETTER A WITH RING ABOVE - AE 0xc6 198 LATIN CAPITAL LETTER AE - C, 0xc7 199 LATIN CAPITAL LETTER C WITH CEDILLA - E! 0xc8 200 LATIN CAPITAL LETTER E WITH GRAVE - E' 0xc9 201 LATIN CAPITAL LETTER E WITH ACUTE - E> 0xca 202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX - E: 0xcb 203 LATIN CAPITAL LETTER E WITH DIAERESIS - I! 0xcc 204 LATIN CAPITAL LETTER I WITH GRAVE - I' 0xcd 205 LATIN CAPITAL LETTER I WITH ACUTE - I> 0xce 206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX - I: 0xcf 207 LATIN CAPITAL LETTER I WITH DIAERESIS - D- 0xd0 208 LATIN CAPITAL LETTER ETH (Icelandic) - N? 0xd1 209 LATIN CAPITAL LETTER N WITH TILDE - O! 0xd2 210 LATIN CAPITAL LETTER O WITH GRAVE - O' 0xd3 211 LATIN CAPITAL LETTER O WITH ACUTE - O> 0xd4 212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX - O? 0xd5 213 LATIN CAPITAL LETTER O WITH TILDE - O: 0xd6 214 LATIN CAPITAL LETTER O WITH DIAERESIS - *X 0xd7 215 MULTIPLICATION SIGN - O/ 0xd8 216 LATIN CAPITAL LETTER O WITH STROKE - U! 0xd9 217 LATIN CAPITAL LETTER U WITH GRAVE - U' 0xda 218 LATIN CAPITAL LETTER U WITH ACUTE - U> 0xdb 219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX - U: 0xdc 220 LATIN CAPITAL LETTER U WITH DIAERESIS - Y' 0xdd 221 LATIN CAPITAL LETTER Y WITH ACUTE - TH 0xde 222 LATIN CAPITAL LETTER THORN (Icelandic) - ss 0xdf 223 LATIN SMALL LETTER SHARP S (German) - a! 0xe0 224 LATIN SMALL LETTER A WITH GRAVE - a' 0xe1 225 LATIN SMALL LETTER A WITH ACUTE - a> 0xe2 226 LATIN SMALL LETTER A WITH CIRCUMFLEX - a? 0xe3 227 LATIN SMALL LETTER A WITH TILDE - a: 0xe4 228 LATIN SMALL LETTER A WITH DIAERESIS - aa 0xe5 229 LATIN SMALL LETTER A WITH RING ABOVE - ae 0xe6 230 LATIN SMALL LETTER AE - c, 0xe7 231 LATIN SMALL LETTER C WITH CEDILLA - e! 0xe8 232 LATIN SMALL LETTER E WITH GRAVE - e' 0xe9 233 LATIN SMALL LETTER E WITH ACUTE - e> 0xea 234 LATIN SMALL LETTER E WITH CIRCUMFLEX - e: 0xeb 235 LATIN SMALL LETTER E WITH DIAERESIS - i! 0xec 236 LATIN SMALL LETTER I WITH GRAVE - i' 0xed 237 LATIN SMALL LETTER I WITH ACUTE - i> 0xee 238 LATIN SMALL LETTER I WITH CIRCUMFLEX - i: 0xef 239 LATIN SMALL LETTER I WITH DIAERESIS - d- 0xf0 240 LATIN SMALL LETTER ETH (Icelandic) - n? 0xf1 241 LATIN SMALL LETTER N WITH TILDE - o! 0xf2 242 LATIN SMALL LETTER O WITH GRAVE - o' 0xf3 243 LATIN SMALL LETTER O WITH ACUTE - o> 0xf4 244 LATIN SMALL LETTER O WITH CIRCUMFLEX - o? 0xf5 245 LATIN SMALL LETTER O WITH TILDE - o: 0xf6 246 LATIN SMALL LETTER O WITH DIAERESIS - -: 0xf7 247 DIVISION SIGN - o/ 0xf8 248 LATIN SMALL LETTER O WITH STROKE - u! 0xf9 249 LATIN SMALL LETTER U WITH GRAVE - u' 0xfa 250 LATIN SMALL LETTER U WITH ACUTE - u> 0xfb 251 LATIN SMALL LETTER U WITH CIRCUMFLEX - u: 0xfc 252 LATIN SMALL LETTER U WITH DIAERESIS - y' 0xfd 253 LATIN SMALL LETTER Y WITH ACUTE - th 0xfe 254 LATIN SMALL LETTER THORN (Icelandic) - y: 0xff 255 LATIN SMALL LETTER Y WITH DIAERESIS +¡ !I 0xa1 161 INVERTED EXCLAMATION MARK +¢ Ct 0xa2 162 CENT SIGN +£ Pd 0xa3 163 POUND SIGN +¤ Cu 0xa4 164 CURRENCY SIGN +¥ Ye 0xa5 165 YEN SIGN +¦ BB 0xa6 166 BROKEN BAR +§ SE 0xa7 167 SECTION SIGN +¨ ': 0xa8 168 DIAERESIS +© Co 0xa9 169 COPYRIGHT SIGN +ª -a 0xaa 170 FEMININE ORDINAL INDICATOR +« << 0xab 171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK +¬ NO 0xac 172 NOT SIGN +­ -- 0xad 173 SOFT HYPHEN +® Rg 0xae 174 REGISTERED SIGN +¯ 'm 0xaf 175 MACRON +° DG 0xb0 176 DEGREE SIGN +± +- 0xb1 177 PLUS-MINUS SIGN +² 2S 0xb2 178 SUPERSCRIPT TWO +³ 3S 0xb3 179 SUPERSCRIPT THREE +´ '' 0xb4 180 ACUTE ACCENT +µ My 0xb5 181 MICRO SIGN +¶ PI 0xb6 182 PILCROW SIGN +· .M 0xb7 183 MIDDLE DOT +¸ ', 0xb8 184 CEDILLA +¹ 1S 0xb9 185 SUPERSCRIPT ONE +º -o 0xba 186 MASCULINE ORDINAL INDICATOR +» >> 0xbb 187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK +¼ 14 0xbc 188 VULGAR FRACTION ONE QUARTER +½ 12 0xbd 189 VULGAR FRACTION ONE HALF +¾ 34 0xbe 190 VULGAR FRACTION THREE QUARTERS +¿ ?I 0xbf 191 INVERTED QUESTION MARK +À A! 0xc0 192 LATIN CAPITAL LETTER A WITH GRAVE +Á A' 0xc1 193 LATIN CAPITAL LETTER A WITH ACUTE + A> 0xc2 194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX +à A? 0xc3 195 LATIN CAPITAL LETTER A WITH TILDE +Ä A: 0xc4 196 LATIN CAPITAL LETTER A WITH DIAERESIS +Å AA 0xc5 197 LATIN CAPITAL LETTER A WITH RING ABOVE +Æ AE 0xc6 198 LATIN CAPITAL LETTER AE +Ç C, 0xc7 199 LATIN CAPITAL LETTER C WITH CEDILLA +È E! 0xc8 200 LATIN CAPITAL LETTER E WITH GRAVE +É E' 0xc9 201 LATIN CAPITAL LETTER E WITH ACUTE +Ê E> 0xca 202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX +Ë E: 0xcb 203 LATIN CAPITAL LETTER E WITH DIAERESIS +Ì I! 0xcc 204 LATIN CAPITAL LETTER I WITH GRAVE +Í I' 0xcd 205 LATIN CAPITAL LETTER I WITH ACUTE +Î I> 0xce 206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX +Ï I: 0xcf 207 LATIN CAPITAL LETTER I WITH DIAERESIS +Ð D- 0xd0 208 LATIN CAPITAL LETTER ETH (Icelandic) +Ñ N? 0xd1 209 LATIN CAPITAL LETTER N WITH TILDE +Ò O! 0xd2 210 LATIN CAPITAL LETTER O WITH GRAVE +Ó O' 0xd3 211 LATIN CAPITAL LETTER O WITH ACUTE +Ô O> 0xd4 212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX +Õ O? 0xd5 213 LATIN CAPITAL LETTER O WITH TILDE +Ö O: 0xd6 214 LATIN CAPITAL LETTER O WITH DIAERESIS +× *X 0xd7 215 MULTIPLICATION SIGN +Ø O/ 0xd8 216 LATIN CAPITAL LETTER O WITH STROKE +Ù U! 0xd9 217 LATIN CAPITAL LETTER U WITH GRAVE +Ú U' 0xda 218 LATIN CAPITAL LETTER U WITH ACUTE +Û U> 0xdb 219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX +Ü U: 0xdc 220 LATIN CAPITAL LETTER U WITH DIAERESIS +Ý Y' 0xdd 221 LATIN CAPITAL LETTER Y WITH ACUTE +Þ TH 0xde 222 LATIN CAPITAL LETTER THORN (Icelandic) +ß ss 0xdf 223 LATIN SMALL LETTER SHARP S (German) +à a! 0xe0 224 LATIN SMALL LETTER A WITH GRAVE +á a' 0xe1 225 LATIN SMALL LETTER A WITH ACUTE +â a> 0xe2 226 LATIN SMALL LETTER A WITH CIRCUMFLEX +ã a? 0xe3 227 LATIN SMALL LETTER A WITH TILDE +ä a: 0xe4 228 LATIN SMALL LETTER A WITH DIAERESIS +å aa 0xe5 229 LATIN SMALL LETTER A WITH RING ABOVE +æ ae 0xe6 230 LATIN SMALL LETTER AE +ç c, 0xe7 231 LATIN SMALL LETTER C WITH CEDILLA +è e! 0xe8 232 LATIN SMALL LETTER E WITH GRAVE +é e' 0xe9 233 LATIN SMALL LETTER E WITH ACUTE +ê e> 0xea 234 LATIN SMALL LETTER E WITH CIRCUMFLEX +ë e: 0xeb 235 LATIN SMALL LETTER E WITH DIAERESIS +ì i! 0xec 236 LATIN SMALL LETTER I WITH GRAVE +í i' 0xed 237 LATIN SMALL LETTER I WITH ACUTE +î i> 0xee 238 LATIN SMALL LETTER I WITH CIRCUMFLEX +ï i: 0xef 239 LATIN SMALL LETTER I WITH DIAERESIS +ð d- 0xf0 240 LATIN SMALL LETTER ETH (Icelandic) +ñ n? 0xf1 241 LATIN SMALL LETTER N WITH TILDE +ò o! 0xf2 242 LATIN SMALL LETTER O WITH GRAVE +ó o' 0xf3 243 LATIN SMALL LETTER O WITH ACUTE +ô o> 0xf4 244 LATIN SMALL LETTER O WITH CIRCUMFLEX +õ o? 0xf5 245 LATIN SMALL LETTER O WITH TILDE +ö o: 0xf6 246 LATIN SMALL LETTER O WITH DIAERESIS +÷ -: 0xf7 247 DIVISION SIGN +ø o/ 0xf8 248 LATIN SMALL LETTER O WITH STROKE +ù u! 0xf9 249 LATIN SMALL LETTER U WITH GRAVE +ú u' 0xfa 250 LATIN SMALL LETTER U WITH ACUTE +û u> 0xfb 251 LATIN SMALL LETTER U WITH CIRCUMFLEX +ü u: 0xfc 252 LATIN SMALL LETTER U WITH DIAERESIS +ý y' 0xfd 253 LATIN SMALL LETTER Y WITH ACUTE +þ th 0xfe 254 LATIN SMALL LETTER THORN (Icelandic) +ÿ y: 0xff 255 LATIN SMALL LETTER Y WITH DIAERESIS + +If your Vim is compiled with |multibyte| support and you are using a multibyte +'encoding', Vim provides this enhanced set of additional digraphs: + + *digraph-table-mbyte* +char digraph hex dec official name ~ +Ā A- 0100 0256 LATIN CAPITAL LETTER A WITH MACRON +ā a- 0101 0257 LATIN SMALL LETTER A WITH MACRON +Ă A( 0102 0258 LATIN CAPITAL LETTER A WITH BREVE +ă a( 0103 0259 LATIN SMALL LETTER A WITH BREVE +Ą A; 0104 0260 LATIN CAPITAL LETTER A WITH OGONEK +ą a; 0105 0261 LATIN SMALL LETTER A WITH OGONEK +Ć C' 0106 0262 LATIN CAPITAL LETTER C WITH ACUTE +ć c' 0107 0263 LATIN SMALL LETTER C WITH ACUTE +Ĉ C> 0108 0264 LATIN CAPITAL LETTER C WITH CIRCUMFLEX +ĉ c> 0109 0265 LATIN SMALL LETTER C WITH CIRCUMFLEX +Ċ C. 010A 0266 LATIN CAPITAL LETTER C WITH DOT ABOVE +ċ c. 010B 0267 LATIN SMALL LETTER C WITH DOT ABOVE +Č C< 010C 0268 LATIN CAPITAL LETTER C WITH CARON +č c< 010D 0269 LATIN SMALL LETTER C WITH CARON +Ď D< 010E 0270 LATIN CAPITAL LETTER D WITH CARON +ď d< 010F 0271 LATIN SMALL LETTER D WITH CARON +Đ D/ 0110 0272 LATIN CAPITAL LETTER D WITH STROKE +đ d/ 0111 0273 LATIN SMALL LETTER D WITH STROKE +Ē E- 0112 0274 LATIN CAPITAL LETTER E WITH MACRON +ē e- 0113 0275 LATIN SMALL LETTER E WITH MACRON +Ĕ E( 0114 0276 LATIN CAPITAL LETTER E WITH BREVE +ĕ e( 0115 0277 LATIN SMALL LETTER E WITH BREVE +Ė E. 0116 0278 LATIN CAPITAL LETTER E WITH DOT ABOVE +ė e. 0117 0279 LATIN SMALL LETTER E WITH DOT ABOVE +Ę E; 0118 0280 LATIN CAPITAL LETTER E WITH OGONEK +ę e; 0119 0281 LATIN SMALL LETTER E WITH OGONEK +Ě E< 011A 0282 LATIN CAPITAL LETTER E WITH CARON +ě e< 011B 0283 LATIN SMALL LETTER E WITH CARON +Ĝ G> 011C 0284 LATIN CAPITAL LETTER G WITH CIRCUMFLEX +ĝ g> 011D 0285 LATIN SMALL LETTER G WITH CIRCUMFLEX +Ğ G( 011E 0286 LATIN CAPITAL LETTER G WITH BREVE +ğ g( 011F 0287 LATIN SMALL LETTER G WITH BREVE +Ġ G. 0120 0288 LATIN CAPITAL LETTER G WITH DOT ABOVE +ġ g. 0121 0289 LATIN SMALL LETTER G WITH DOT ABOVE +Ģ G, 0122 0290 LATIN CAPITAL LETTER G WITH CEDILLA +ģ g, 0123 0291 LATIN SMALL LETTER G WITH CEDILLA +Ĥ H> 0124 0292 LATIN CAPITAL LETTER H WITH CIRCUMFLEX +ĥ h> 0125 0293 LATIN SMALL LETTER H WITH CIRCUMFLEX +Ħ H/ 0126 0294 LATIN CAPITAL LETTER H WITH STROKE +ħ h/ 0127 0295 LATIN SMALL LETTER H WITH STROKE +Ĩ I? 0128 0296 LATIN CAPITAL LETTER I WITH TILDE +ĩ i? 0129 0297 LATIN SMALL LETTER I WITH TILDE +Ī I- 012A 0298 LATIN CAPITAL LETTER I WITH MACRON +ī i- 012B 0299 LATIN SMALL LETTER I WITH MACRON +Ĭ I( 012C 0300 LATIN CAPITAL LETTER I WITH BREVE +ĭ i( 012D 0301 LATIN SMALL LETTER I WITH BREVE +Į I; 012E 0302 LATIN CAPITAL LETTER I WITH OGONEK +į i; 012F 0303 LATIN SMALL LETTER I WITH OGONEK +İ I. 0130 0304 LATIN CAPITAL LETTER I WITH DOT ABOVE +ı i. 0131 0305 LATIN SMALL LETTER DOTLESS I +IJ IJ 0132 0306 LATIN CAPITAL LIGATURE IJ +ij ij 0133 0307 LATIN SMALL LIGATURE IJ +Ĵ J> 0134 0308 LATIN CAPITAL LETTER J WITH CIRCUMFLEX +ĵ j> 0135 0309 LATIN SMALL LETTER J WITH CIRCUMFLEX +Ķ K, 0136 0310 LATIN CAPITAL LETTER K WITH CEDILLA +ķ k, 0137 0311 LATIN SMALL LETTER K WITH CEDILLA +ĸ kk 0138 0312 LATIN SMALL LETTER KRA +Ĺ L' 0139 0313 LATIN CAPITAL LETTER L WITH ACUTE +ĺ l' 013A 0314 LATIN SMALL LETTER L WITH ACUTE +Ļ L, 013B 0315 LATIN CAPITAL LETTER L WITH CEDILLA +ļ l, 013C 0316 LATIN SMALL LETTER L WITH CEDILLA +Ľ L< 013D 0317 LATIN CAPITAL LETTER L WITH CARON +ľ l< 013E 0318 LATIN SMALL LETTER L WITH CARON +Ŀ L. 013F 0319 LATIN CAPITAL LETTER L WITH MIDDLE DOT +ŀ l. 0140 0320 LATIN SMALL LETTER L WITH MIDDLE DOT +Ł L/ 0141 0321 LATIN CAPITAL LETTER L WITH STROKE +ł l/ 0142 0322 LATIN SMALL LETTER L WITH STROKE +Ń N' 0143 0323 LATIN CAPITAL LETTER N WITH ACUTE ` +ń n' 0144 0324 LATIN SMALL LETTER N WITH ACUTE ` +Ņ N, 0145 0325 LATIN CAPITAL LETTER N WITH CEDILLA ` +ņ n, 0146 0326 LATIN SMALL LETTER N WITH CEDILLA ` +Ň N< 0147 0327 LATIN CAPITAL LETTER N WITH CARON ` +ň n< 0148 0328 LATIN SMALL LETTER N WITH CARON ` +ʼn 'n 0149 0329 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE ` +Ŋ NG 014A 0330 LATIN CAPITAL LETTER ENG +ŋ ng 014B 0331 LATIN SMALL LETTER ENG +Ō O- 014C 0332 LATIN CAPITAL LETTER O WITH MACRON +ō o- 014D 0333 LATIN SMALL LETTER O WITH MACRON +Ŏ O( 014E 0334 LATIN CAPITAL LETTER O WITH BREVE +ŏ o( 014F 0335 LATIN SMALL LETTER O WITH BREVE +Ő O" 0150 0336 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE +ő o" 0151 0337 LATIN SMALL LETTER O WITH DOUBLE ACUTE +Œ OE 0152 0338 LATIN CAPITAL LIGATURE OE +œ oe 0153 0339 LATIN SMALL LIGATURE OE +Ŕ R' 0154 0340 LATIN CAPITAL LETTER R WITH ACUTE +ŕ r' 0155 0341 LATIN SMALL LETTER R WITH ACUTE +Ŗ R, 0156 0342 LATIN CAPITAL LETTER R WITH CEDILLA +ŗ r, 0157 0343 LATIN SMALL LETTER R WITH CEDILLA +Ř R< 0158 0344 LATIN CAPITAL LETTER R WITH CARON +ř r< 0159 0345 LATIN SMALL LETTER R WITH CARON +Ś S' 015A 0346 LATIN CAPITAL LETTER S WITH ACUTE +ś s' 015B 0347 LATIN SMALL LETTER S WITH ACUTE +Ŝ S> 015C 0348 LATIN CAPITAL LETTER S WITH CIRCUMFLEX +ŝ s> 015D 0349 LATIN SMALL LETTER S WITH CIRCUMFLEX +Ş S, 015E 0350 LATIN CAPITAL LETTER S WITH CEDILLA +ş s, 015F 0351 LATIN SMALL LETTER S WITH CEDILLA +Š S< 0160 0352 LATIN CAPITAL LETTER S WITH CARON +š s< 0161 0353 LATIN SMALL LETTER S WITH CARON +Ţ T, 0162 0354 LATIN CAPITAL LETTER T WITH CEDILLA +ţ t, 0163 0355 LATIN SMALL LETTER T WITH CEDILLA +Ť T< 0164 0356 LATIN CAPITAL LETTER T WITH CARON +ť t< 0165 0357 LATIN SMALL LETTER T WITH CARON +Ŧ T/ 0166 0358 LATIN CAPITAL LETTER T WITH STROKE +ŧ t/ 0167 0359 LATIN SMALL LETTER T WITH STROKE +Ũ U? 0168 0360 LATIN CAPITAL LETTER U WITH TILDE +ũ u? 0169 0361 LATIN SMALL LETTER U WITH TILDE +Ū U- 016A 0362 LATIN CAPITAL LETTER U WITH MACRON +ū u- 016B 0363 LATIN SMALL LETTER U WITH MACRON +Ŭ U( 016C 0364 LATIN CAPITAL LETTER U WITH BREVE +ŭ u( 016D 0365 LATIN SMALL LETTER U WITH BREVE +Ů U0 016E 0366 LATIN CAPITAL LETTER U WITH RING ABOVE +ů u0 016F 0367 LATIN SMALL LETTER U WITH RING ABOVE +Ű U" 0170 0368 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE +ű u" 0171 0369 LATIN SMALL LETTER U WITH DOUBLE ACUTE +Ų U; 0172 0370 LATIN CAPITAL LETTER U WITH OGONEK +ų u; 0173 0371 LATIN SMALL LETTER U WITH OGONEK +Ŵ W> 0174 0372 LATIN CAPITAL LETTER W WITH CIRCUMFLEX +ŵ w> 0175 0373 LATIN SMALL LETTER W WITH CIRCUMFLEX +Ŷ Y> 0176 0374 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX +ŷ y> 0177 0375 LATIN SMALL LETTER Y WITH CIRCUMFLEX +Ÿ Y: 0178 0376 LATIN CAPITAL LETTER Y WITH DIAERESIS +Ź Z' 0179 0377 LATIN CAPITAL LETTER Z WITH ACUTE +ź z' 017A 0378 LATIN SMALL LETTER Z WITH ACUTE +Ż Z. 017B 0379 LATIN CAPITAL LETTER Z WITH DOT ABOVE +ż z. 017C 0380 LATIN SMALL LETTER Z WITH DOT ABOVE +Ž Z< 017D 0381 LATIN CAPITAL LETTER Z WITH CARON +ž z< 017E 0382 LATIN SMALL LETTER Z WITH CARON +Ơ O9 01A0 0416 LATIN CAPITAL LETTER O WITH HORN +ơ o9 01A1 0417 LATIN SMALL LETTER O WITH HORN +Ƣ OI 01A2 0418 LATIN CAPITAL LETTER OI +ƣ oi 01A3 0419 LATIN SMALL LETTER OI +Ʀ yr 01A6 0422 LATIN LETTER YR +Ư U9 01AF 0431 LATIN CAPITAL LETTER U WITH HORN +ư u9 01B0 0432 LATIN SMALL LETTER U WITH HORN +Ƶ Z/ 01B5 0437 LATIN CAPITAL LETTER Z WITH STROKE +ƶ z/ 01B6 0438 LATIN SMALL LETTER Z WITH STROKE +Ʒ ED 01B7 0439 LATIN CAPITAL LETTER EZH +Ǎ A< 01CD 0461 LATIN CAPITAL LETTER A WITH CARON +ǎ a< 01CE 0462 LATIN SMALL LETTER A WITH CARON +Ǐ I< 01CF 0463 LATIN CAPITAL LETTER I WITH CARON +ǐ i< 01D0 0464 LATIN SMALL LETTER I WITH CARON +Ǒ O< 01D1 0465 LATIN CAPITAL LETTER O WITH CARON +ǒ o< 01D2 0466 LATIN SMALL LETTER O WITH CARON +Ǔ U< 01D3 0467 LATIN CAPITAL LETTER U WITH CARON +ǔ u< 01D4 0468 LATIN SMALL LETTER U WITH CARON +Ǟ A1 01DE 0478 LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON +ǟ a1 01DF 0479 LATIN SMALL LETTER A WITH DIAERESIS AND MACRON +Ǡ A7 01E0 0480 LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON +ǡ a7 01E1 0481 LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON +Ǣ A3 01E2 0482 LATIN CAPITAL LETTER AE WITH MACRON +ǣ a3 01E3 0483 LATIN SMALL LETTER AE WITH MACRON +Ǥ G/ 01E4 0484 LATIN CAPITAL LETTER G WITH STROKE +ǥ g/ 01E5 0485 LATIN SMALL LETTER G WITH STROKE +Ǧ G< 01E6 0486 LATIN CAPITAL LETTER G WITH CARON +ǧ g< 01E7 0487 LATIN SMALL LETTER G WITH CARON +Ǩ K< 01E8 0488 LATIN CAPITAL LETTER K WITH CARON +ǩ k< 01E9 0489 LATIN SMALL LETTER K WITH CARON +Ǫ O; 01EA 0490 LATIN CAPITAL LETTER O WITH OGONEK +ǫ o; 01EB 0491 LATIN SMALL LETTER O WITH OGONEK +Ǭ O1 01EC 0492 LATIN CAPITAL LETTER O WITH OGONEK AND MACRON +ǭ o1 01ED 0493 LATIN SMALL LETTER O WITH OGONEK AND MACRON +Ǯ EZ 01EE 0494 LATIN CAPITAL LETTER EZH WITH CARON +ǯ ez 01EF 0495 LATIN SMALL LETTER EZH WITH CARON +ǰ j< 01F0 0496 LATIN SMALL LETTER J WITH CARON +Ǵ G' 01F4 0500 LATIN CAPITAL LETTER G WITH ACUTE +ǵ g' 01F5 0501 LATIN SMALL LETTER G WITH ACUTE +ʿ ;S 02BF 0703 MODIFIER LETTER LEFT HALF RING +ˇ '< 02C7 0711 CARON +˘ '( 02D8 0728 BREVE +˙ '. 02D9 0729 DOT ABOVE +˚ '0 02DA 0730 RING ABOVE +˛ '; 02DB 0731 OGONEK +˝ '" 02DD 0733 DOUBLE ACUTE ACCENT +Ά A% 0386 0902 GREEK CAPITAL LETTER ALPHA WITH TONOS +Έ E% 0388 0904 GREEK CAPITAL LETTER EPSILON WITH TONOS +Ή Y% 0389 0905 GREEK CAPITAL LETTER ETA WITH TONOS +Ί I% 038A 0906 GREEK CAPITAL LETTER IOTA WITH TONOS +Ό O% 038C 0908 GREEK CAPITAL LETTER OMICRON WITH TONOS +Ύ U% 038E 0910 GREEK CAPITAL LETTER UPSILON WITH TONOS +Ώ W% 038F 0911 GREEK CAPITAL LETTER OMEGA WITH TONOS +ΐ i3 0390 0912 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS +Α A* 0391 0913 GREEK CAPITAL LETTER ALPHA +Β B* 0392 0914 GREEK CAPITAL LETTER BETA +Γ G* 0393 0915 GREEK CAPITAL LETTER GAMMA +Δ D* 0394 0916 GREEK CAPITAL LETTER DELTA +Ε E* 0395 0917 GREEK CAPITAL LETTER EPSILON +Ζ Z* 0396 0918 GREEK CAPITAL LETTER ZETA +Η Y* 0397 0919 GREEK CAPITAL LETTER ETA +Θ H* 0398 0920 GREEK CAPITAL LETTER THETA +Ι I* 0399 0921 GREEK CAPITAL LETTER IOTA +Κ K* 039A 0922 GREEK CAPITAL LETTER KAPPA +Λ L* 039B 0923 GREEK CAPITAL LETTER LAMDA +Μ M* 039C 0924 GREEK CAPITAL LETTER MU +Ν N* 039D 0925 GREEK CAPITAL LETTER NU +Ξ C* 039E 0926 GREEK CAPITAL LETTER XI +Ο O* 039F 0927 GREEK CAPITAL LETTER OMICRON +Π P* 03A0 0928 GREEK CAPITAL LETTER PI +Ρ R* 03A1 0929 GREEK CAPITAL LETTER RHO +Σ S* 03A3 0931 GREEK CAPITAL LETTER SIGMA +Τ T* 03A4 0932 GREEK CAPITAL LETTER TAU +Υ U* 03A5 0933 GREEK CAPITAL LETTER UPSILON +Φ F* 03A6 0934 GREEK CAPITAL LETTER PHI +Χ X* 03A7 0935 GREEK CAPITAL LETTER CHI +Ψ Q* 03A8 0936 GREEK CAPITAL LETTER PSI +Ω W* 03A9 0937 GREEK CAPITAL LETTER OMEGA +Ϊ J* 03AA 0938 GREEK CAPITAL LETTER IOTA WITH DIALYTIKA +Ϋ V* 03AB 0939 GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA +ά a% 03AC 0940 GREEK SMALL LETTER ALPHA WITH TONOS +έ e% 03AD 0941 GREEK SMALL LETTER EPSILON WITH TONOS +ή y% 03AE 0942 GREEK SMALL LETTER ETA WITH TONOS +ί i% 03AF 0943 GREEK SMALL LETTER IOTA WITH TONOS +ΰ u3 03B0 0944 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS +α a* 03B1 0945 GREEK SMALL LETTER ALPHA +β b* 03B2 0946 GREEK SMALL LETTER BETA +γ g* 03B3 0947 GREEK SMALL LETTER GAMMA +δ d* 03B4 0948 GREEK SMALL LETTER DELTA +ε e* 03B5 0949 GREEK SMALL LETTER EPSILON +ζ z* 03B6 0950 GREEK SMALL LETTER ZETA +η y* 03B7 0951 GREEK SMALL LETTER ETA +θ h* 03B8 0952 GREEK SMALL LETTER THETA +ι i* 03B9 0953 GREEK SMALL LETTER IOTA +κ k* 03BA 0954 GREEK SMALL LETTER KAPPA +λ l* 03BB 0955 GREEK SMALL LETTER LAMDA +μ m* 03BC 0956 GREEK SMALL LETTER MU +ν n* 03BD 0957 GREEK SMALL LETTER NU +ξ c* 03BE 0958 GREEK SMALL LETTER XI +ο o* 03BF 0959 GREEK SMALL LETTER OMICRON +π p* 03C0 0960 GREEK SMALL LETTER PI +ρ r* 03C1 0961 GREEK SMALL LETTER RHO +ς *s 03C2 0962 GREEK SMALL LETTER FINAL SIGMA +σ s* 03C3 0963 GREEK SMALL LETTER SIGMA +τ t* 03C4 0964 GREEK SMALL LETTER TAU +υ u* 03C5 0965 GREEK SMALL LETTER UPSILON +φ f* 03C6 0966 GREEK SMALL LETTER PHI +χ x* 03C7 0967 GREEK SMALL LETTER CHI +ψ q* 03C8 0968 GREEK SMALL LETTER PSI +ω w* 03C9 0969 GREEK SMALL LETTER OMEGA +ϊ j* 03CA 0970 GREEK SMALL LETTER IOTA WITH DIALYTIKA +ϋ v* 03CB 0971 GREEK SMALL LETTER UPSILON WITH DIALYTIKA +ό o% 03CC 0972 GREEK SMALL LETTER OMICRON WITH TONOS +ύ u% 03CD 0973 GREEK SMALL LETTER UPSILON WITH TONOS +ώ w% 03CE 0974 GREEK SMALL LETTER OMEGA WITH TONOS +Ϙ 'G 03D8 0984 GREEK LETTER ARCHAIC KOPPA +ϙ ,G 03D9 0985 GREEK SMALL LETTER ARCHAIC KOPPA +Ϛ T3 03DA 0986 GREEK LETTER STIGMA +ϛ t3 03DB 0987 GREEK SMALL LETTER STIGMA +Ϝ M3 03DC 0988 GREEK LETTER DIGAMMA +ϝ m3 03DD 0989 GREEK SMALL LETTER DIGAMMA +Ϟ K3 03DE 0990 GREEK LETTER KOPPA +ϟ k3 03DF 0991 GREEK SMALL LETTER KOPPA +Ϡ P3 03E0 0992 GREEK LETTER SAMPI +ϡ p3 03E1 0993 GREEK SMALL LETTER SAMPI +ϴ '% 03F4 1012 GREEK CAPITAL THETA SYMBOL +ϵ j3 03F5 1013 GREEK LUNATE EPSILON SYMBOL +Ё IO 0401 1025 CYRILLIC CAPITAL LETTER IO +Ђ D% 0402 1026 CYRILLIC CAPITAL LETTER DJE +Ѓ G% 0403 1027 CYRILLIC CAPITAL LETTER GJE +Є IE 0404 1028 CYRILLIC CAPITAL LETTER UKRAINIAN IE +Ѕ DS 0405 1029 CYRILLIC CAPITAL LETTER DZE +І II 0406 1030 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I +Ї YI 0407 1031 CYRILLIC CAPITAL LETTER YI +Ј J% 0408 1032 CYRILLIC CAPITAL LETTER JE +Љ LJ 0409 1033 CYRILLIC CAPITAL LETTER LJE +Њ NJ 040A 1034 CYRILLIC CAPITAL LETTER NJE +Ћ Ts 040B 1035 CYRILLIC CAPITAL LETTER TSHE +Ќ KJ 040C 1036 CYRILLIC CAPITAL LETTER KJE +Ў V% 040E 1038 CYRILLIC CAPITAL LETTER SHORT U +Џ DZ 040F 1039 CYRILLIC CAPITAL LETTER DZHE +А A= 0410 1040 CYRILLIC CAPITAL LETTER A +Б B= 0411 1041 CYRILLIC CAPITAL LETTER BE +В V= 0412 1042 CYRILLIC CAPITAL LETTER VE +Г G= 0413 1043 CYRILLIC CAPITAL LETTER GHE +Д D= 0414 1044 CYRILLIC CAPITAL LETTER DE +Е E= 0415 1045 CYRILLIC CAPITAL LETTER IE +Ж Z% 0416 1046 CYRILLIC CAPITAL LETTER ZHE +З Z= 0417 1047 CYRILLIC CAPITAL LETTER ZE +И I= 0418 1048 CYRILLIC CAPITAL LETTER I +Й J= 0419 1049 CYRILLIC CAPITAL LETTER SHORT I +К K= 041A 1050 CYRILLIC CAPITAL LETTER KA +Л L= 041B 1051 CYRILLIC CAPITAL LETTER EL +М M= 041C 1052 CYRILLIC CAPITAL LETTER EM +Н N= 041D 1053 CYRILLIC CAPITAL LETTER EN +О O= 041E 1054 CYRILLIC CAPITAL LETTER O +П P= 041F 1055 CYRILLIC CAPITAL LETTER PE +Р R= 0420 1056 CYRILLIC CAPITAL LETTER ER +С S= 0421 1057 CYRILLIC CAPITAL LETTER ES +Т T= 0422 1058 CYRILLIC CAPITAL LETTER TE +У U= 0423 1059 CYRILLIC CAPITAL LETTER U +Ф F= 0424 1060 CYRILLIC CAPITAL LETTER EF +Х H= 0425 1061 CYRILLIC CAPITAL LETTER HA +Ц C= 0426 1062 CYRILLIC CAPITAL LETTER TSE +Ч C% 0427 1063 CYRILLIC CAPITAL LETTER CHE +Ш S% 0428 1064 CYRILLIC CAPITAL LETTER SHA +Щ Sc 0429 1065 CYRILLIC CAPITAL LETTER SHCHA +Ъ =" 042A 1066 CYRILLIC CAPITAL LETTER HARD SIGN +Ы Y= 042B 1067 CYRILLIC CAPITAL LETTER YERU +Ь %" 042C 1068 CYRILLIC CAPITAL LETTER SOFT SIGN +Э JE 042D 1069 CYRILLIC CAPITAL LETTER E +Ю JU 042E 1070 CYRILLIC CAPITAL LETTER YU +Я JA 042F 1071 CYRILLIC CAPITAL LETTER YA +а a= 0430 1072 CYRILLIC SMALL LETTER A +б b= 0431 1073 CYRILLIC SMALL LETTER BE +в v= 0432 1074 CYRILLIC SMALL LETTER VE +г g= 0433 1075 CYRILLIC SMALL LETTER GHE +д d= 0434 1076 CYRILLIC SMALL LETTER DE +е e= 0435 1077 CYRILLIC SMALL LETTER IE +ж z% 0436 1078 CYRILLIC SMALL LETTER ZHE +з z= 0437 1079 CYRILLIC SMALL LETTER ZE +и i= 0438 1080 CYRILLIC SMALL LETTER I +й j= 0439 1081 CYRILLIC SMALL LETTER SHORT I +к k= 043A 1082 CYRILLIC SMALL LETTER KA +л l= 043B 1083 CYRILLIC SMALL LETTER EL +м m= 043C 1084 CYRILLIC SMALL LETTER EM +н n= 043D 1085 CYRILLIC SMALL LETTER EN +о o= 043E 1086 CYRILLIC SMALL LETTER O +п p= 043F 1087 CYRILLIC SMALL LETTER PE +р r= 0440 1088 CYRILLIC SMALL LETTER ER +с s= 0441 1089 CYRILLIC SMALL LETTER ES +т t= 0442 1090 CYRILLIC SMALL LETTER TE +у u= 0443 1091 CYRILLIC SMALL LETTER U +ф f= 0444 1092 CYRILLIC SMALL LETTER EF +х h= 0445 1093 CYRILLIC SMALL LETTER HA +ц c= 0446 1094 CYRILLIC SMALL LETTER TSE +ч c% 0447 1095 CYRILLIC SMALL LETTER CHE +ш s% 0448 1096 CYRILLIC SMALL LETTER SHA +щ sc 0449 1097 CYRILLIC SMALL LETTER SHCHA +ъ =' 044A 1098 CYRILLIC SMALL LETTER HARD SIGN +ы y= 044B 1099 CYRILLIC SMALL LETTER YERU +ь %' 044C 1100 CYRILLIC SMALL LETTER SOFT SIGN +э je 044D 1101 CYRILLIC SMALL LETTER E +ю ju 044E 1102 CYRILLIC SMALL LETTER YU +я ja 044F 1103 CYRILLIC SMALL LETTER YA +ё io 0451 1105 CYRILLIC SMALL LETTER IO +ђ d% 0452 1106 CYRILLIC SMALL LETTER DJE +ѓ g% 0453 1107 CYRILLIC SMALL LETTER GJE +є ie 0454 1108 CYRILLIC SMALL LETTER UKRAINIAN IE +ѕ ds 0455 1109 CYRILLIC SMALL LETTER DZE +і ii 0456 1110 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I +ї yi 0457 1111 CYRILLIC SMALL LETTER YI +ј j% 0458 1112 CYRILLIC SMALL LETTER JE +љ lj 0459 1113 CYRILLIC SMALL LETTER LJE +њ nj 045A 1114 CYRILLIC SMALL LETTER NJE +ћ ts 045B 1115 CYRILLIC SMALL LETTER TSHE +ќ kj 045C 1116 CYRILLIC SMALL LETTER KJE +ў v% 045E 1118 CYRILLIC SMALL LETTER SHORT U +џ dz 045F 1119 CYRILLIC SMALL LETTER DZHE +Ѣ Y3 0462 1122 CYRILLIC CAPITAL LETTER YAT +ѣ y3 0463 1123 CYRILLIC SMALL LETTER YAT +Ѫ O3 046A 1130 CYRILLIC CAPITAL LETTER BIG YUS +ѫ o3 046B 1131 CYRILLIC SMALL LETTER BIG YUS +Ѳ F3 0472 1138 CYRILLIC CAPITAL LETTER FITA +ѳ f3 0473 1139 CYRILLIC SMALL LETTER FITA +Ѵ V3 0474 1140 CYRILLIC CAPITAL LETTER IZHITSA +ѵ v3 0475 1141 CYRILLIC SMALL LETTER IZHITSA +Ҁ C3 0480 1152 CYRILLIC CAPITAL LETTER KOPPA +ҁ c3 0481 1153 CYRILLIC SMALL LETTER KOPPA +Ґ G3 0490 1168 CYRILLIC CAPITAL LETTER GHE WITH UPTURN +ґ g3 0491 1169 CYRILLIC SMALL LETTER GHE WITH UPTURN +א A+ 05D0 1488 HEBREW LETTER ALEF +ב B+ 05D1 1489 HEBREW LETTER BET +ג G+ 05D2 1490 HEBREW LETTER GIMEL +ד D+ 05D3 1491 HEBREW LETTER DALET +ה H+ 05D4 1492 HEBREW LETTER HE +ו W+ 05D5 1493 HEBREW LETTER VAV +ז Z+ 05D6 1494 HEBREW LETTER ZAYIN +ח X+ 05D7 1495 HEBREW LETTER HET +ט Tj 05D8 1496 HEBREW LETTER TET +י J+ 05D9 1497 HEBREW LETTER YOD +ך K% 05DA 1498 HEBREW LETTER FINAL KAF +כ K+ 05DB 1499 HEBREW LETTER KAF +ל L+ 05DC 1500 HEBREW LETTER LAMED +ם M% 05DD 1501 HEBREW LETTER FINAL MEM +מ M+ 05DE 1502 HEBREW LETTER MEM +ן N% 05DF 1503 HEBREW LETTER FINAL NUN ` +נ N+ 05E0 1504 HEBREW LETTER NUN ` +ס S+ 05E1 1505 HEBREW LETTER SAMEKH +ע E+ 05E2 1506 HEBREW LETTER AYIN +ף P% 05E3 1507 HEBREW LETTER FINAL PE +פ P+ 05E4 1508 HEBREW LETTER PE +ץ Zj 05E5 1509 HEBREW LETTER FINAL TSADI +צ ZJ 05E6 1510 HEBREW LETTER TSADI +ק Q+ 05E7 1511 HEBREW LETTER QOF +ר R+ 05E8 1512 HEBREW LETTER RESH +ש Sh 05E9 1513 HEBREW LETTER SHIN +ת T+ 05EA 1514 HEBREW LETTER TAV +، ,+ 060C 1548 ARABIC COMMA +؛ ;+ 061B 1563 ARABIC SEMICOLON +؟ ?+ 061F 1567 ARABIC QUESTION MARK +ء H' 0621 1569 ARABIC LETTER HAMZA +آ aM 0622 1570 ARABIC LETTER ALEF WITH MADDA ABOVE +أ aH 0623 1571 ARABIC LETTER ALEF WITH HAMZA ABOVE +ؤ wH 0624 1572 ARABIC LETTER WAW WITH HAMZA ABOVE +إ ah 0625 1573 ARABIC LETTER ALEF WITH HAMZA BELOW +ئ yH 0626 1574 ARABIC LETTER YEH WITH HAMZA ABOVE +ا a+ 0627 1575 ARABIC LETTER ALEF +ب b+ 0628 1576 ARABIC LETTER BEH +ة tm 0629 1577 ARABIC LETTER TEH MARBUTA +ت t+ 062A 1578 ARABIC LETTER TEH +ث tk 062B 1579 ARABIC LETTER THEH +ج g+ 062C 1580 ARABIC LETTER JEEM +ح hk 062D 1581 ARABIC LETTER HAH +خ x+ 062E 1582 ARABIC LETTER KHAH +د d+ 062F 1583 ARABIC LETTER DAL +ذ dk 0630 1584 ARABIC LETTER THAL +ر r+ 0631 1585 ARABIC LETTER REH +ز z+ 0632 1586 ARABIC LETTER ZAIN +س s+ 0633 1587 ARABIC LETTER SEEN +ش sn 0634 1588 ARABIC LETTER SHEEN +ص c+ 0635 1589 ARABIC LETTER SAD +ض dd 0636 1590 ARABIC LETTER DAD +ط tj 0637 1591 ARABIC LETTER TAH +ظ zH 0638 1592 ARABIC LETTER ZAH +ع e+ 0639 1593 ARABIC LETTER AIN +غ i+ 063A 1594 ARABIC LETTER GHAIN +ـ ++ 0640 1600 ARABIC TATWEEL +ف f+ 0641 1601 ARABIC LETTER FEH +ق q+ 0642 1602 ARABIC LETTER QAF +ك k+ 0643 1603 ARABIC LETTER KAF +ل l+ 0644 1604 ARABIC LETTER LAM +م m+ 0645 1605 ARABIC LETTER MEEM +ن n+ 0646 1606 ARABIC LETTER NOON +ه h+ 0647 1607 ARABIC LETTER HEH +و w+ 0648 1608 ARABIC LETTER WAW +ى j+ 0649 1609 ARABIC LETTER ALEF MAKSURA +ي y+ 064A 1610 ARABIC LETTER YEH +ً :+ 064B 1611 ARABIC FATHATAN +ٌ "+ 064C 1612 ARABIC DAMMATAN +ٍ =+ 064D 1613 ARABIC KASRATAN +َ /+ 064E 1614 ARABIC FATHA +ُ '+ 064F 1615 ARABIC DAMMA +ِ 1+ 0650 1616 ARABIC KASRA +ّ 3+ 0651 1617 ARABIC SHADDA +ْ 0+ 0652 1618 ARABIC SUKUN +ٰ aS 0670 1648 ARABIC LETTER SUPERSCRIPT ALEF +پ p+ 067E 1662 ARABIC LETTER PEH +ڤ v+ 06A4 1700 ARABIC LETTER VEH +گ gf 06AF 1711 ARABIC LETTER GAF +۰ 0a 06F0 1776 EXTENDED ARABIC-INDIC DIGIT ZERO +۱ 1a 06F1 1777 EXTENDED ARABIC-INDIC DIGIT ONE +۲ 2a 06F2 1778 EXTENDED ARABIC-INDIC DIGIT TWO +۳ 3a 06F3 1779 EXTENDED ARABIC-INDIC DIGIT THREE +۴ 4a 06F4 1780 EXTENDED ARABIC-INDIC DIGIT FOUR +۵ 5a 06F5 1781 EXTENDED ARABIC-INDIC DIGIT FIVE +۶ 6a 06F6 1782 EXTENDED ARABIC-INDIC DIGIT SIX +۷ 7a 06F7 1783 EXTENDED ARABIC-INDIC DIGIT SEVEN +۸ 8a 06F8 1784 EXTENDED ARABIC-INDIC DIGIT EIGHT +۹ 9a 06F9 1785 EXTENDED ARABIC-INDIC DIGIT NINE +Ḃ B. 1E02 7682 LATIN CAPITAL LETTER B WITH DOT ABOVE +ḃ b. 1E03 7683 LATIN SMALL LETTER B WITH DOT ABOVE +Ḇ B_ 1E06 7686 LATIN CAPITAL LETTER B WITH LINE BELOW +ḇ b_ 1E07 7687 LATIN SMALL LETTER B WITH LINE BELOW +Ḋ D. 1E0A 7690 LATIN CAPITAL LETTER D WITH DOT ABOVE +ḋ d. 1E0B 7691 LATIN SMALL LETTER D WITH DOT ABOVE +Ḏ D_ 1E0E 7694 LATIN CAPITAL LETTER D WITH LINE BELOW +ḏ d_ 1E0F 7695 LATIN SMALL LETTER D WITH LINE BELOW +Ḑ D, 1E10 7696 LATIN CAPITAL LETTER D WITH CEDILLA +ḑ d, 1E11 7697 LATIN SMALL LETTER D WITH CEDILLA +Ḟ F. 1E1E 7710 LATIN CAPITAL LETTER F WITH DOT ABOVE +ḟ f. 1E1F 7711 LATIN SMALL LETTER F WITH DOT ABOVE +Ḡ G- 1E20 7712 LATIN CAPITAL LETTER G WITH MACRON +ḡ g- 1E21 7713 LATIN SMALL LETTER G WITH MACRON +Ḣ H. 1E22 7714 LATIN CAPITAL LETTER H WITH DOT ABOVE +ḣ h. 1E23 7715 LATIN SMALL LETTER H WITH DOT ABOVE +Ḧ H: 1E26 7718 LATIN CAPITAL LETTER H WITH DIAERESIS +ḧ h: 1E27 7719 LATIN SMALL LETTER H WITH DIAERESIS +Ḩ H, 1E28 7720 LATIN CAPITAL LETTER H WITH CEDILLA +ḩ h, 1E29 7721 LATIN SMALL LETTER H WITH CEDILLA +Ḱ K' 1E30 7728 LATIN CAPITAL LETTER K WITH ACUTE +ḱ k' 1E31 7729 LATIN SMALL LETTER K WITH ACUTE +Ḵ K_ 1E34 7732 LATIN CAPITAL LETTER K WITH LINE BELOW +ḵ k_ 1E35 7733 LATIN SMALL LETTER K WITH LINE BELOW +Ḻ L_ 1E3A 7738 LATIN CAPITAL LETTER L WITH LINE BELOW +ḻ l_ 1E3B 7739 LATIN SMALL LETTER L WITH LINE BELOW +Ḿ M' 1E3E 7742 LATIN CAPITAL LETTER M WITH ACUTE +ḿ m' 1E3F 7743 LATIN SMALL LETTER M WITH ACUTE +Ṁ M. 1E40 7744 LATIN CAPITAL LETTER M WITH DOT ABOVE +ṁ m. 1E41 7745 LATIN SMALL LETTER M WITH DOT ABOVE +Ṅ N. 1E44 7748 LATIN CAPITAL LETTER N WITH DOT ABOVE ` +ṅ n. 1E45 7749 LATIN SMALL LETTER N WITH DOT ABOVE ` +Ṉ N_ 1E48 7752 LATIN CAPITAL LETTER N WITH LINE BELOW ` +ṉ n_ 1E49 7753 LATIN SMALL LETTER N WITH LINE BELOW ` +Ṕ P' 1E54 7764 LATIN CAPITAL LETTER P WITH ACUTE +ṕ p' 1E55 7765 LATIN SMALL LETTER P WITH ACUTE +Ṗ P. 1E56 7766 LATIN CAPITAL LETTER P WITH DOT ABOVE +ṗ p. 1E57 7767 LATIN SMALL LETTER P WITH DOT ABOVE +Ṙ R. 1E58 7768 LATIN CAPITAL LETTER R WITH DOT ABOVE +ṙ r. 1E59 7769 LATIN SMALL LETTER R WITH DOT ABOVE +Ṟ R_ 1E5E 7774 LATIN CAPITAL LETTER R WITH LINE BELOW +ṟ r_ 1E5F 7775 LATIN SMALL LETTER R WITH LINE BELOW +Ṡ S. 1E60 7776 LATIN CAPITAL LETTER S WITH DOT ABOVE +ṡ s. 1E61 7777 LATIN SMALL LETTER S WITH DOT ABOVE +Ṫ T. 1E6A 7786 LATIN CAPITAL LETTER T WITH DOT ABOVE +ṫ t. 1E6B 7787 LATIN SMALL LETTER T WITH DOT ABOVE +Ṯ T_ 1E6E 7790 LATIN CAPITAL LETTER T WITH LINE BELOW +ṯ t_ 1E6F 7791 LATIN SMALL LETTER T WITH LINE BELOW +Ṽ V? 1E7C 7804 LATIN CAPITAL LETTER V WITH TILDE +ṽ v? 1E7D 7805 LATIN SMALL LETTER V WITH TILDE +Ẁ W! 1E80 7808 LATIN CAPITAL LETTER W WITH GRAVE +ẁ w! 1E81 7809 LATIN SMALL LETTER W WITH GRAVE +Ẃ W' 1E82 7810 LATIN CAPITAL LETTER W WITH ACUTE +ẃ w' 1E83 7811 LATIN SMALL LETTER W WITH ACUTE +Ẅ W: 1E84 7812 LATIN CAPITAL LETTER W WITH DIAERESIS +ẅ w: 1E85 7813 LATIN SMALL LETTER W WITH DIAERESIS +Ẇ W. 1E86 7814 LATIN CAPITAL LETTER W WITH DOT ABOVE +ẇ w. 1E87 7815 LATIN SMALL LETTER W WITH DOT ABOVE +Ẋ X. 1E8A 7818 LATIN CAPITAL LETTER X WITH DOT ABOVE +ẋ x. 1E8B 7819 LATIN SMALL LETTER X WITH DOT ABOVE +Ẍ X: 1E8C 7820 LATIN CAPITAL LETTER X WITH DIAERESIS +ẍ x: 1E8D 7821 LATIN SMALL LETTER X WITH DIAERESIS +Ẏ Y. 1E8E 7822 LATIN CAPITAL LETTER Y WITH DOT ABOVE +ẏ y. 1E8F 7823 LATIN SMALL LETTER Y WITH DOT ABOVE +Ẑ Z> 1E90 7824 LATIN CAPITAL LETTER Z WITH CIRCUMFLEX +ẑ z> 1E91 7825 LATIN SMALL LETTER Z WITH CIRCUMFLEX +Ẕ Z_ 1E94 7828 LATIN CAPITAL LETTER Z WITH LINE BELOW +ẕ z_ 1E95 7829 LATIN SMALL LETTER Z WITH LINE BELOW +ẖ h_ 1E96 7830 LATIN SMALL LETTER H WITH LINE BELOW +ẗ t: 1E97 7831 LATIN SMALL LETTER T WITH DIAERESIS +ẘ w0 1E98 7832 LATIN SMALL LETTER W WITH RING ABOVE +ẙ y0 1E99 7833 LATIN SMALL LETTER Y WITH RING ABOVE +Ả A2 1EA2 7842 LATIN CAPITAL LETTER A WITH HOOK ABOVE +ả a2 1EA3 7843 LATIN SMALL LETTER A WITH HOOK ABOVE +Ẻ E2 1EBA 7866 LATIN CAPITAL LETTER E WITH HOOK ABOVE +ẻ e2 1EBB 7867 LATIN SMALL LETTER E WITH HOOK ABOVE +Ẽ E? 1EBC 7868 LATIN CAPITAL LETTER E WITH TILDE +ẽ e? 1EBD 7869 LATIN SMALL LETTER E WITH TILDE +Ỉ I2 1EC8 7880 LATIN CAPITAL LETTER I WITH HOOK ABOVE +ỉ i2 1EC9 7881 LATIN SMALL LETTER I WITH HOOK ABOVE +Ỏ O2 1ECE 7886 LATIN CAPITAL LETTER O WITH HOOK ABOVE +ỏ o2 1ECF 7887 LATIN SMALL LETTER O WITH HOOK ABOVE +Ủ U2 1EE6 7910 LATIN CAPITAL LETTER U WITH HOOK ABOVE +ủ u2 1EE7 7911 LATIN SMALL LETTER U WITH HOOK ABOVE +Ỳ Y! 1EF2 7922 LATIN CAPITAL LETTER Y WITH GRAVE +ỳ y! 1EF3 7923 LATIN SMALL LETTER Y WITH GRAVE +Ỷ Y2 1EF6 7926 LATIN CAPITAL LETTER Y WITH HOOK ABOVE +ỷ y2 1EF7 7927 LATIN SMALL LETTER Y WITH HOOK ABOVE +Ỹ Y? 1EF8 7928 LATIN CAPITAL LETTER Y WITH TILDE +ỹ y? 1EF9 7929 LATIN SMALL LETTER Y WITH TILDE +ἀ ;' 1F00 7936 GREEK SMALL LETTER ALPHA WITH PSILI +ἁ ,' 1F01 7937 GREEK SMALL LETTER ALPHA WITH DASIA +ἂ ;! 1F02 7938 GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA +ἃ ,! 1F03 7939 GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA +ἄ ?; 1F04 7940 GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA +ἅ ?, 1F05 7941 GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA +ἆ !: 1F06 7942 GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI +ἇ ?: 1F07 7943 GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI +  1N 2002 8194 EN SPACE +  1M 2003 8195 EM SPACE +  3M 2004 8196 THREE-PER-EM SPACE +  4M 2005 8197 FOUR-PER-EM SPACE +  6M 2006 8198 SIX-PER-EM SPACE +  1T 2009 8201 THIN SPACE +  1H 200A 8202 HAIR SPACE +‐ -1 2010 8208 HYPHEN +– -N 2013 8211 EN DASH ` +— -M 2014 8212 EM DASH +― -3 2015 8213 HORIZONTAL BAR +‖ !2 2016 8214 DOUBLE VERTICAL LINE +‗ =2 2017 8215 DOUBLE LOW LINE +‘ '6 2018 8216 LEFT SINGLE QUOTATION MARK +’ '9 2019 8217 RIGHT SINGLE QUOTATION MARK +‚ .9 201A 8218 SINGLE LOW-9 QUOTATION MARK +‛ 9' 201B 8219 SINGLE HIGH-REVERSED-9 QUOTATION MARK +“ "6 201C 8220 LEFT DOUBLE QUOTATION MARK +” "9 201D 8221 RIGHT DOUBLE QUOTATION MARK +„ :9 201E 8222 DOUBLE LOW-9 QUOTATION MARK +‟ 9" 201F 8223 DOUBLE HIGH-REVERSED-9 QUOTATION MARK +† /- 2020 8224 DAGGER +‡ /= 2021 8225 DOUBLE DAGGER +‥ .. 2025 8229 TWO DOT LEADER +‰ %0 2030 8240 PER MILLE SIGN +′ 1' 2032 8242 PRIME +″ 2' 2033 8243 DOUBLE PRIME +‴ 3' 2034 8244 TRIPLE PRIME +‵ 1" 2035 8245 REVERSED PRIME +‶ 2" 2036 8246 REVERSED DOUBLE PRIME +‷ 3" 2037 8247 REVERSED TRIPLE PRIME +‸ Ca 2038 8248 CARET +‹ <1 2039 8249 SINGLE LEFT-POINTING ANGLE QUOTATION MARK +› >1 203A 8250 SINGLE RIGHT-POINTING ANGLE QUOTATION MARK +※ :X 203B 8251 REFERENCE MARK +‾ '- 203E 8254 OVERLINE +⁄ /f 2044 8260 FRACTION SLASH +⁰ 0S 2070 8304 SUPERSCRIPT ZERO +⁴ 4S 2074 8308 SUPERSCRIPT FOUR +⁵ 5S 2075 8309 SUPERSCRIPT FIVE +⁶ 6S 2076 8310 SUPERSCRIPT SIX +⁷ 7S 2077 8311 SUPERSCRIPT SEVEN +⁸ 8S 2078 8312 SUPERSCRIPT EIGHT +⁹ 9S 2079 8313 SUPERSCRIPT NINE +⁺ +S 207A 8314 SUPERSCRIPT PLUS SIGN +⁻ -S 207B 8315 SUPERSCRIPT MINUS +⁼ =S 207C 8316 SUPERSCRIPT EQUALS SIGN +⁽ (S 207D 8317 SUPERSCRIPT LEFT PARENTHESIS +⁾ )S 207E 8318 SUPERSCRIPT RIGHT PARENTHESIS +ⁿ nS 207F 8319 SUPERSCRIPT LATIN SMALL LETTER N ` +₀ 0s 2080 8320 SUBSCRIPT ZERO +₁ 1s 2081 8321 SUBSCRIPT ONE +₂ 2s 2082 8322 SUBSCRIPT TWO +₃ 3s 2083 8323 SUBSCRIPT THREE +₄ 4s 2084 8324 SUBSCRIPT FOUR +₅ 5s 2085 8325 SUBSCRIPT FIVE +₆ 6s 2086 8326 SUBSCRIPT SIX +₇ 7s 2087 8327 SUBSCRIPT SEVEN +₈ 8s 2088 8328 SUBSCRIPT EIGHT +₉ 9s 2089 8329 SUBSCRIPT NINE +₊ +s 208A 8330 SUBSCRIPT PLUS SIGN +₋ -s 208B 8331 SUBSCRIPT MINUS +₌ =s 208C 8332 SUBSCRIPT EQUALS SIGN +₍ (s 208D 8333 SUBSCRIPT LEFT PARENTHESIS +₎ )s 208E 8334 SUBSCRIPT RIGHT PARENTHESIS +₤ Li 20A4 8356 LIRA SIGN +₧ Pt 20A7 8359 PESETA SIGN +₩ W= 20A9 8361 WON SIGN +€ Eu 20AC 8364 EURO SIGN +℃ oC 2103 8451 DEGREE CELSIUS +℅ co 2105 8453 CARE OF +℉ oF 2109 8457 DEGREE FAHRENHEIT +№ N0 2116 8470 NUMERO SIGN +℗ PO 2117 8471 SOUND RECORDING COPYRIGHT +℞ Rx 211E 8478 PRESCRIPTION TAKE +℠ SM 2120 8480 SERVICE MARK +™ TM 2122 8482 TRADE MARK SIGN +Ω Om 2126 8486 OHM SIGN +Å AO 212B 8491 ANGSTROM SIGN +⅓ 13 2153 8531 VULGAR FRACTION ONE THIRD +⅔ 23 2154 8532 VULGAR FRACTION TWO THIRDS +⅕ 15 2155 8533 VULGAR FRACTION ONE FIFTH +⅖ 25 2156 8534 VULGAR FRACTION TWO FIFTHS +⅗ 35 2157 8535 VULGAR FRACTION THREE FIFTHS +⅘ 45 2158 8536 VULGAR FRACTION FOUR FIFTHS +⅙ 16 2159 8537 VULGAR FRACTION ONE SIXTH +⅚ 56 215A 8538 VULGAR FRACTION FIVE SIXTHS +⅛ 18 215B 8539 VULGAR FRACTION ONE EIGHTH +⅜ 38 215C 8540 VULGAR FRACTION THREE EIGHTHS +⅝ 58 215D 8541 VULGAR FRACTION FIVE EIGHTHS +⅞ 78 215E 8542 VULGAR FRACTION SEVEN EIGHTHS +Ⅰ 1R 2160 8544 ROMAN NUMERAL ONE +Ⅱ 2R 2161 8545 ROMAN NUMERAL TWO +Ⅲ 3R 2162 8546 ROMAN NUMERAL THREE +Ⅳ 4R 2163 8547 ROMAN NUMERAL FOUR +Ⅴ 5R 2164 8548 ROMAN NUMERAL FIVE +Ⅵ 6R 2165 8549 ROMAN NUMERAL SIX +Ⅶ 7R 2166 8550 ROMAN NUMERAL SEVEN +Ⅷ 8R 2167 8551 ROMAN NUMERAL EIGHT +Ⅸ 9R 2168 8552 ROMAN NUMERAL NINE +Ⅹ aR 2169 8553 ROMAN NUMERAL TEN +Ⅺ bR 216A 8554 ROMAN NUMERAL ELEVEN +Ⅻ cR 216B 8555 ROMAN NUMERAL TWELVE +ⅰ 1r 2170 8560 SMALL ROMAN NUMERAL ONE +ⅱ 2r 2171 8561 SMALL ROMAN NUMERAL TWO +ⅲ 3r 2172 8562 SMALL ROMAN NUMERAL THREE +ⅳ 4r 2173 8563 SMALL ROMAN NUMERAL FOUR +ⅴ 5r 2174 8564 SMALL ROMAN NUMERAL FIVE +ⅵ 6r 2175 8565 SMALL ROMAN NUMERAL SIX +ⅶ 7r 2176 8566 SMALL ROMAN NUMERAL SEVEN +ⅷ 8r 2177 8567 SMALL ROMAN NUMERAL EIGHT +ⅸ 9r 2178 8568 SMALL ROMAN NUMERAL NINE +ⅹ ar 2179 8569 SMALL ROMAN NUMERAL TEN +ⅺ br 217A 8570 SMALL ROMAN NUMERAL ELEVEN +ⅻ cr 217B 8571 SMALL ROMAN NUMERAL TWELVE +← <- 2190 8592 LEFTWARDS ARROW +↑ -! 2191 8593 UPWARDS ARROW +→ -> 2192 8594 RIGHTWARDS ARROW +↓ -v 2193 8595 DOWNWARDS ARROW +↔ <> 2194 8596 LEFT RIGHT ARROW +↕ UD 2195 8597 UP DOWN ARROW +⇐ <= 21D0 8656 LEFTWARDS DOUBLE ARROW +⇒ => 21D2 8658 RIGHTWARDS DOUBLE ARROW +⇔ == 21D4 8660 LEFT RIGHT DOUBLE ARROW +∀ FA 2200 8704 FOR ALL +∂ dP 2202 8706 PARTIAL DIFFERENTIAL +∃ TE 2203 8707 THERE EXISTS +∅ /0 2205 8709 EMPTY SET +∆ DE 2206 8710 INCREMENT +∇ NB 2207 8711 NABLA +∈ (- 2208 8712 ELEMENT OF +∋ -) 220B 8715 CONTAINS AS MEMBER +∏ *P 220F 8719 N-ARY PRODUCT ` +∑ +Z 2211 8721 N-ARY SUMMATION ` +− -2 2212 8722 MINUS SIGN +∓ -+ 2213 8723 MINUS-OR-PLUS SIGN +∗ *- 2217 8727 ASTERISK OPERATOR +∘ Ob 2218 8728 RING OPERATOR +∙ Sb 2219 8729 BULLET OPERATOR +√ RT 221A 8730 SQUARE ROOT +∝ 0( 221D 8733 PROPORTIONAL TO +∞ 00 221E 8734 INFINITY +∟ -L 221F 8735 RIGHT ANGLE +∠ -V 2220 8736 ANGLE +∥ PP 2225 8741 PARALLEL TO +∧ AN 2227 8743 LOGICAL AND +∨ OR 2228 8744 LOGICAL OR +∩ (U 2229 8745 INTERSECTION +∪ )U 222A 8746 UNION +∫ In 222B 8747 INTEGRAL +∬ DI 222C 8748 DOUBLE INTEGRAL +∮ Io 222E 8750 CONTOUR INTEGRAL +∴ .: 2234 8756 THEREFORE +∵ :. 2235 8757 BECAUSE +∶ :R 2236 8758 RATIO +∷ :: 2237 8759 PROPORTION +∼ ?1 223C 8764 TILDE OPERATOR +∾ CG 223E 8766 INVERTED LAZY S +≃ ?- 2243 8771 ASYMPTOTICALLY EQUAL TO +≅ ?= 2245 8773 APPROXIMATELY EQUAL TO +≈ ?2 2248 8776 ALMOST EQUAL TO +≌ =? 224C 8780 ALL EQUAL TO +≓ HI 2253 8787 IMAGE OF OR APPROXIMATELY EQUAL TO +≠ != 2260 8800 NOT EQUAL TO +≡ =3 2261 8801 IDENTICAL TO +≤ =< 2264 8804 LESS-THAN OR EQUAL TO +≥ >= 2265 8805 GREATER-THAN OR EQUAL TO +≪ <* 226A 8810 MUCH LESS-THAN +≫ *> 226B 8811 MUCH GREATER-THAN +≮ !< 226E 8814 NOT LESS-THAN +≯ !> 226F 8815 NOT GREATER-THAN +⊂ (C 2282 8834 SUBSET OF +⊃ )C 2283 8835 SUPERSET OF +⊆ (_ 2286 8838 SUBSET OF OR EQUAL TO +⊇ )_ 2287 8839 SUPERSET OF OR EQUAL TO +⊙ 0. 2299 8857 CIRCLED DOT OPERATOR +⊚ 02 229A 8858 CIRCLED RING OPERATOR +⊥ -T 22A5 8869 UP TACK +⋅ .P 22C5 8901 DOT OPERATOR +⋮ :3 22EE 8942 VERTICAL ELLIPSIS +⋯ .3 22EF 8943 MIDLINE HORIZONTAL ELLIPSIS +⌂ Eh 2302 8962 HOUSE +⌈ <7 2308 8968 LEFT CEILING +⌉ >7 2309 8969 RIGHT CEILING +⌊ 7< 230A 8970 LEFT FLOOR +⌋ 7> 230B 8971 RIGHT FLOOR +⌐ NI 2310 8976 REVERSED NOT SIGN +⌒ (A 2312 8978 ARC +⌕ TR 2315 8981 TELEPHONE RECORDER +⌠ Iu 2320 8992 TOP HALF INTEGRAL +⌡ Il 2321 8993 BOTTOM HALF INTEGRAL +〈 232A 9002 RIGHT-POINTING ANGLE BRACKET +␣ Vs 2423 9251 OPEN BOX +⑀ 1h 2440 9280 OCR HOOK +⑁ 3h 2441 9281 OCR CHAIR +⑂ 2h 2442 9282 OCR FORK +⑃ 4h 2443 9283 OCR INVERTED FORK +⑆ 1j 2446 9286 OCR BRANCH BANK IDENTIFICATION +⑇ 2j 2447 9287 OCR AMOUNT OF CHECK +⑈ 3j 2448 9288 OCR DASH +⑉ 4j 2449 9289 OCR CUSTOMER ACCOUNT NUMBER +⒈ 1. 2488 9352 DIGIT ONE FULL STOP +⒉ 2. 2489 9353 DIGIT TWO FULL STOP +⒊ 3. 248A 9354 DIGIT THREE FULL STOP +⒋ 4. 248B 9355 DIGIT FOUR FULL STOP +⒌ 5. 248C 9356 DIGIT FIVE FULL STOP +⒍ 6. 248D 9357 DIGIT SIX FULL STOP +⒎ 7. 248E 9358 DIGIT SEVEN FULL STOP +⒏ 8. 248F 9359 DIGIT EIGHT FULL STOP +⒐ 9. 2490 9360 DIGIT NINE FULL STOP +─ hh 2500 9472 BOX DRAWINGS LIGHT HORIZONTAL +━ HH 2501 9473 BOX DRAWINGS HEAVY HORIZONTAL +│ vv 2502 9474 BOX DRAWINGS LIGHT VERTICAL +┃ VV 2503 9475 BOX DRAWINGS HEAVY VERTICAL +┄ 3- 2504 9476 BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL +┅ 3_ 2505 9477 BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL +┆ 3! 2506 9478 BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL +┇ 3/ 2507 9479 BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL +┈ 4- 2508 9480 BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL +┉ 4_ 2509 9481 BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL +┊ 4! 250A 9482 BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL +┋ 4/ 250B 9483 BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL +┌ dr 250C 9484 BOX DRAWINGS LIGHT DOWN AND RIGHT +┍ dR 250D 9485 BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY +┎ Dr 250E 9486 BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT +┏ DR 250F 9487 BOX DRAWINGS HEAVY DOWN AND RIGHT +┐ dl 2510 9488 BOX DRAWINGS LIGHT DOWN AND LEFT +┑ dL 2511 9489 BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY +┒ Dl 2512 9490 BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT +┓ LD 2513 9491 BOX DRAWINGS HEAVY DOWN AND LEFT +└ ur 2514 9492 BOX DRAWINGS LIGHT UP AND RIGHT +┕ uR 2515 9493 BOX DRAWINGS UP LIGHT AND RIGHT HEAVY +┖ Ur 2516 9494 BOX DRAWINGS UP HEAVY AND RIGHT LIGHT +┗ UR 2517 9495 BOX DRAWINGS HEAVY UP AND RIGHT +┘ ul 2518 9496 BOX DRAWINGS LIGHT UP AND LEFT +┙ uL 2519 9497 BOX DRAWINGS UP LIGHT AND LEFT HEAVY +┚ Ul 251A 9498 BOX DRAWINGS UP HEAVY AND LEFT LIGHT +┛ UL 251B 9499 BOX DRAWINGS HEAVY UP AND LEFT +├ vr 251C 9500 BOX DRAWINGS LIGHT VERTICAL AND RIGHT +┝ vR 251D 9501 BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY +┠ Vr 2520 9504 BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT +┣ VR 2523 9507 BOX DRAWINGS HEAVY VERTICAL AND RIGHT +┤ vl 2524 9508 BOX DRAWINGS LIGHT VERTICAL AND LEFT +┥ vL 2525 9509 BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY +┨ Vl 2528 9512 BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT +┫ VL 252B 9515 BOX DRAWINGS HEAVY VERTICAL AND LEFT +┬ dh 252C 9516 BOX DRAWINGS LIGHT DOWN AND HORIZONTAL +┯ dH 252F 9519 BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY +┰ Dh 2530 9520 BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT +┳ DH 2533 9523 BOX DRAWINGS HEAVY DOWN AND HORIZONTAL +┴ uh 2534 9524 BOX DRAWINGS LIGHT UP AND HORIZONTAL +┷ uH 2537 9527 BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY +┸ Uh 2538 9528 BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT +┻ UH 253B 9531 BOX DRAWINGS HEAVY UP AND HORIZONTAL +┼ vh 253C 9532 BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL +┿ vH 253F 9535 BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY +╂ Vh 2542 9538 BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT +╋ VH 254B 9547 BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL +╱ FD 2571 9585 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT +╲ BD 2572 9586 BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT +▀ TB 2580 9600 UPPER HALF BLOCK +▄ LB 2584 9604 LOWER HALF BLOCK +█ FB 2588 9608 FULL BLOCK +▌ lB 258C 9612 LEFT HALF BLOCK +▐ RB 2590 9616 RIGHT HALF BLOCK +░ .S 2591 9617 LIGHT SHADE +▒ :S 2592 9618 MEDIUM SHADE +▓ ?S 2593 9619 DARK SHADE +■ fS 25A0 9632 BLACK SQUARE +□ OS 25A1 9633 WHITE SQUARE +▢ RO 25A2 9634 WHITE SQUARE WITH ROUNDED CORNERS +▣ Rr 25A3 9635 WHITE SQUARE CONTAINING BLACK SMALL SQUARE +▤ RF 25A4 9636 SQUARE WITH HORIZONTAL FILL +▥ RY 25A5 9637 SQUARE WITH VERTICAL FILL +▦ RH 25A6 9638 SQUARE WITH ORTHOGONAL CROSSHATCH FILL +▧ RZ 25A7 9639 SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL +▨ RK 25A8 9640 SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL +▩ RX 25A9 9641 SQUARE WITH DIAGONAL CROSSHATCH FILL +▪ sB 25AA 9642 BLACK SMALL SQUARE +▬ SR 25AC 9644 BLACK RECTANGLE +▭ Or 25AD 9645 WHITE RECTANGLE +▲ UT 25B2 9650 BLACK UP-POINTING TRIANGLE +△ uT 25B3 9651 WHITE UP-POINTING TRIANGLE +▶ PR 25B6 9654 BLACK RIGHT-POINTING TRIANGLE +▷ Tr 25B7 9655 WHITE RIGHT-POINTING TRIANGLE +▼ Dt 25BC 9660 BLACK DOWN-POINTING TRIANGLE +▽ dT 25BD 9661 WHITE DOWN-POINTING TRIANGLE +◀ PL 25C0 9664 BLACK LEFT-POINTING TRIANGLE +◁ Tl 25C1 9665 WHITE LEFT-POINTING TRIANGLE +◆ Db 25C6 9670 BLACK DIAMOND +◇ Dw 25C7 9671 WHITE DIAMOND +◊ LZ 25CA 9674 LOZENGE +○ 0m 25CB 9675 WHITE CIRCLE +◎ 0o 25CE 9678 BULLSEYE +● 0M 25CF 9679 BLACK CIRCLE +◐ 0L 25D0 9680 CIRCLE WITH LEFT HALF BLACK +◑ 0R 25D1 9681 CIRCLE WITH RIGHT HALF BLACK +◘ Sn 25D8 9688 INVERSE BULLET +◙ Ic 25D9 9689 INVERSE WHITE CIRCLE +◢ Fd 25E2 9698 BLACK LOWER RIGHT TRIANGLE +◣ Bd 25E3 9699 BLACK LOWER LEFT TRIANGLE +★ *2 2605 9733 BLACK STAR +☆ *1 2606 9734 WHITE STAR +☜ H 261E 9758 WHITE RIGHT POINTING INDEX +☺ 0u 263A 9786 WHITE SMILING FACE +☻ 0U 263B 9787 BLACK SMILING FACE +☼ SU 263C 9788 WHITE SUN WITH RAYS +♀ Fm 2640 9792 FEMALE SIGN +♂ Ml 2642 9794 MALE SIGN +♠ cS 2660 9824 BLACK SPADE SUIT +♡ cH 2661 9825 WHITE HEART SUIT +♢ cD 2662 9826 WHITE DIAMOND SUIT +♣ cC 2663 9827 BLACK CLUB SUIT +♩ Md 2669 9833 QUARTER NOTE ` +♪ M8 266A 9834 EIGHTH NOTE ` +♫ M2 266B 9835 BEAMED EIGHTH NOTES +♭ Mb 266D 9837 MUSIC FLAT SIGN +♮ Mx 266E 9838 MUSIC NATURAL SIGN +♯ MX 266F 9839 MUSIC SHARP SIGN +✓ OK 2713 10003 CHECK MARK +✗ XX 2717 10007 BALLOT X +✠ -X 2720 10016 MALTESE CROSS +  IS 3000 12288 IDEOGRAPHIC SPACE +、 ,_ 3001 12289 IDEOGRAPHIC COMMA +。 ._ 3002 12290 IDEOGRAPHIC FULL STOP +〃 +" 3003 12291 DITTO MARK +〄 +_ 3004 12292 JAPANESE INDUSTRIAL STANDARD SYMBOL +々 *_ 3005 12293 IDEOGRAPHIC ITERATION MARK +〆 ;_ 3006 12294 IDEOGRAPHIC CLOSING MARK +〇 0_ 3007 12295 IDEOGRAPHIC NUMBER ZERO +《 <+ 300A 12298 LEFT DOUBLE ANGLE BRACKET +》 >+ 300B 12299 RIGHT DOUBLE ANGLE BRACKET +「 <' 300C 12300 LEFT CORNER BRACKET +」 >' 300D 12301 RIGHT CORNER BRACKET +『 <" 300E 12302 LEFT WHITE CORNER BRACKET +』 >" 300F 12303 RIGHT WHITE CORNER BRACKET +【 (" 3010 12304 LEFT BLACK LENTICULAR BRACKET +】 )" 3011 12305 RIGHT BLACK LENTICULAR BRACKET +〒 =T 3012 12306 POSTAL MARK +〓 =_ 3013 12307 GETA MARK +〔 (' 3014 12308 LEFT TORTOISE SHELL BRACKET +〕 )' 3015 12309 RIGHT TORTOISE SHELL BRACKET +〖 (I 3016 12310 LEFT WHITE LENTICULAR BRACKET +〗 )I 3017 12311 RIGHT WHITE LENTICULAR BRACKET +〜 -? 301C 12316 WAVE DASH +ぁ A5 3041 12353 HIRAGANA LETTER SMALL A +あ a5 3042 12354 HIRAGANA LETTER A +ぃ I5 3043 12355 HIRAGANA LETTER SMALL I +い i5 3044 12356 HIRAGANA LETTER I +ぅ U5 3045 12357 HIRAGANA LETTER SMALL U +う u5 3046 12358 HIRAGANA LETTER U +ぇ E5 3047 12359 HIRAGANA LETTER SMALL E +え e5 3048 12360 HIRAGANA LETTER E +ぉ O5 3049 12361 HIRAGANA LETTER SMALL O +お o5 304A 12362 HIRAGANA LETTER O +か ka 304B 12363 HIRAGANA LETTER KA +が ga 304C 12364 HIRAGANA LETTER GA +き ki 304D 12365 HIRAGANA LETTER KI +ぎ gi 304E 12366 HIRAGANA LETTER GI +く ku 304F 12367 HIRAGANA LETTER KU +ぐ gu 3050 12368 HIRAGANA LETTER GU +け ke 3051 12369 HIRAGANA LETTER KE +げ ge 3052 12370 HIRAGANA LETTER GE +こ ko 3053 12371 HIRAGANA LETTER KO +ご go 3054 12372 HIRAGANA LETTER GO +さ sa 3055 12373 HIRAGANA LETTER SA +ざ za 3056 12374 HIRAGANA LETTER ZA +し si 3057 12375 HIRAGANA LETTER SI +じ zi 3058 12376 HIRAGANA LETTER ZI +す su 3059 12377 HIRAGANA LETTER SU +ず zu 305A 12378 HIRAGANA LETTER ZU +せ se 305B 12379 HIRAGANA LETTER SE +ぜ ze 305C 12380 HIRAGANA LETTER ZE +そ so 305D 12381 HIRAGANA LETTER SO +ぞ zo 305E 12382 HIRAGANA LETTER ZO +た ta 305F 12383 HIRAGANA LETTER TA +だ da 3060 12384 HIRAGANA LETTER DA +ち ti 3061 12385 HIRAGANA LETTER TI +ぢ di 3062 12386 HIRAGANA LETTER DI +っ tU 3063 12387 HIRAGANA LETTER SMALL TU +つ tu 3064 12388 HIRAGANA LETTER TU +づ du 3065 12389 HIRAGANA LETTER DU +て te 3066 12390 HIRAGANA LETTER TE +で de 3067 12391 HIRAGANA LETTER DE +と to 3068 12392 HIRAGANA LETTER TO +ど do 3069 12393 HIRAGANA LETTER DO +な na 306A 12394 HIRAGANA LETTER NA +に ni 306B 12395 HIRAGANA LETTER NI +ぬ nu 306C 12396 HIRAGANA LETTER NU +ね ne 306D 12397 HIRAGANA LETTER NE +の no 306E 12398 HIRAGANA LETTER NO +は ha 306F 12399 HIRAGANA LETTER HA +ば ba 3070 12400 HIRAGANA LETTER BA +ぱ pa 3071 12401 HIRAGANA LETTER PA +ひ hi 3072 12402 HIRAGANA LETTER HI +び bi 3073 12403 HIRAGANA LETTER BI +ぴ pi 3074 12404 HIRAGANA LETTER PI +ふ hu 3075 12405 HIRAGANA LETTER HU +ぶ bu 3076 12406 HIRAGANA LETTER BU +ぷ pu 3077 12407 HIRAGANA LETTER PU +へ he 3078 12408 HIRAGANA LETTER HE +べ be 3079 12409 HIRAGANA LETTER BE +ぺ pe 307A 12410 HIRAGANA LETTER PE +ほ ho 307B 12411 HIRAGANA LETTER HO +ぼ bo 307C 12412 HIRAGANA LETTER BO +ぽ po 307D 12413 HIRAGANA LETTER PO +ま ma 307E 12414 HIRAGANA LETTER MA +み mi 307F 12415 HIRAGANA LETTER MI +む mu 3080 12416 HIRAGANA LETTER MU +め me 3081 12417 HIRAGANA LETTER ME +も mo 3082 12418 HIRAGANA LETTER MO +ゃ yA 3083 12419 HIRAGANA LETTER SMALL YA +や ya 3084 12420 HIRAGANA LETTER YA +ゅ yU 3085 12421 HIRAGANA LETTER SMALL YU +ゆ yu 3086 12422 HIRAGANA LETTER YU +ょ yO 3087 12423 HIRAGANA LETTER SMALL YO +よ yo 3088 12424 HIRAGANA LETTER YO +ら ra 3089 12425 HIRAGANA LETTER RA +り ri 308A 12426 HIRAGANA LETTER RI +る ru 308B 12427 HIRAGANA LETTER RU +れ re 308C 12428 HIRAGANA LETTER RE +ろ ro 308D 12429 HIRAGANA LETTER RO +ゎ wA 308E 12430 HIRAGANA LETTER SMALL WA +わ wa 308F 12431 HIRAGANA LETTER WA +ゐ wi 3090 12432 HIRAGANA LETTER WI +ゑ we 3091 12433 HIRAGANA LETTER WE +を wo 3092 12434 HIRAGANA LETTER WO +ん n5 3093 12435 HIRAGANA LETTER N ` +ゔ vu 3094 12436 HIRAGANA LETTER VU +゛ "5 309B 12443 KATAKANA-HIRAGANA VOICED SOUND MARK +゜ 05 309C 12444 KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK +ゝ *5 309D 12445 HIRAGANA ITERATION MARK +ゞ +5 309E 12446 HIRAGANA VOICED ITERATION MARK +ァ a6 30A1 12449 KATAKANA LETTER SMALL A +ア A6 30A2 12450 KATAKANA LETTER A +ィ i6 30A3 12451 KATAKANA LETTER SMALL I +イ I6 30A4 12452 KATAKANA LETTER I +ゥ u6 30A5 12453 KATAKANA LETTER SMALL U +ウ U6 30A6 12454 KATAKANA LETTER U +ェ e6 30A7 12455 KATAKANA LETTER SMALL E +エ E6 30A8 12456 KATAKANA LETTER E +ォ o6 30A9 12457 KATAKANA LETTER SMALL O +オ O6 30AA 12458 KATAKANA LETTER O +カ Ka 30AB 12459 KATAKANA LETTER KA +ガ Ga 30AC 12460 KATAKANA LETTER GA +キ Ki 30AD 12461 KATAKANA LETTER KI +ギ Gi 30AE 12462 KATAKANA LETTER GI +ク Ku 30AF 12463 KATAKANA LETTER KU +グ Gu 30B0 12464 KATAKANA LETTER GU +ケ Ke 30B1 12465 KATAKANA LETTER KE +ゲ Ge 30B2 12466 KATAKANA LETTER GE +コ Ko 30B3 12467 KATAKANA LETTER KO +ゴ Go 30B4 12468 KATAKANA LETTER GO +サ Sa 30B5 12469 KATAKANA LETTER SA +ザ Za 30B6 12470 KATAKANA LETTER ZA +シ Si 30B7 12471 KATAKANA LETTER SI +ジ Zi 30B8 12472 KATAKANA LETTER ZI +ス Su 30B9 12473 KATAKANA LETTER SU +ズ Zu 30BA 12474 KATAKANA LETTER ZU +セ Se 30BB 12475 KATAKANA LETTER SE +ゼ Ze 30BC 12476 KATAKANA LETTER ZE +ソ So 30BD 12477 KATAKANA LETTER SO +ゾ Zo 30BE 12478 KATAKANA LETTER ZO +タ Ta 30BF 12479 KATAKANA LETTER TA +ダ Da 30C0 12480 KATAKANA LETTER DA +チ Ti 30C1 12481 KATAKANA LETTER TI +ヂ Di 30C2 12482 KATAKANA LETTER DI +ッ TU 30C3 12483 KATAKANA LETTER SMALL TU +ツ Tu 30C4 12484 KATAKANA LETTER TU +ヅ Du 30C5 12485 KATAKANA LETTER DU +テ Te 30C6 12486 KATAKANA LETTER TE +デ De 30C7 12487 KATAKANA LETTER DE +ト To 30C8 12488 KATAKANA LETTER TO +ド Do 30C9 12489 KATAKANA LETTER DO +ナ Na 30CA 12490 KATAKANA LETTER NA +ニ Ni 30CB 12491 KATAKANA LETTER NI +ヌ Nu 30CC 12492 KATAKANA LETTER NU +ネ Ne 30CD 12493 KATAKANA LETTER NE +ノ No 30CE 12494 KATAKANA LETTER NO +ハ Ha 30CF 12495 KATAKANA LETTER HA +バ Ba 30D0 12496 KATAKANA LETTER BA +パ Pa 30D1 12497 KATAKANA LETTER PA +ヒ Hi 30D2 12498 KATAKANA LETTER HI +ビ Bi 30D3 12499 KATAKANA LETTER BI +ピ Pi 30D4 12500 KATAKANA LETTER PI +フ Hu 30D5 12501 KATAKANA LETTER HU +ブ Bu 30D6 12502 KATAKANA LETTER BU +プ Pu 30D7 12503 KATAKANA LETTER PU +ヘ He 30D8 12504 KATAKANA LETTER HE +ベ Be 30D9 12505 KATAKANA LETTER BE +ペ Pe 30DA 12506 KATAKANA LETTER PE +ホ Ho 30DB 12507 KATAKANA LETTER HO +ボ Bo 30DC 12508 KATAKANA LETTER BO +ポ Po 30DD 12509 KATAKANA LETTER PO +マ Ma 30DE 12510 KATAKANA LETTER MA +ミ Mi 30DF 12511 KATAKANA LETTER MI +ム Mu 30E0 12512 KATAKANA LETTER MU +メ Me 30E1 12513 KATAKANA LETTER ME +モ Mo 30E2 12514 KATAKANA LETTER MO +ャ YA 30E3 12515 KATAKANA LETTER SMALL YA +ヤ Ya 30E4 12516 KATAKANA LETTER YA +ュ YU 30E5 12517 KATAKANA LETTER SMALL YU +ユ Yu 30E6 12518 KATAKANA LETTER YU +ョ YO 30E7 12519 KATAKANA LETTER SMALL YO +ヨ Yo 30E8 12520 KATAKANA LETTER YO +ラ Ra 30E9 12521 KATAKANA LETTER RA +リ Ri 30EA 12522 KATAKANA LETTER RI +ル Ru 30EB 12523 KATAKANA LETTER RU +レ Re 30EC 12524 KATAKANA LETTER RE +ロ Ro 30ED 12525 KATAKANA LETTER RO +ヮ WA 30EE 12526 KATAKANA LETTER SMALL WA +ワ Wa 30EF 12527 KATAKANA LETTER WA +ヰ Wi 30F0 12528 KATAKANA LETTER WI +ヱ We 30F1 12529 KATAKANA LETTER WE +ヲ Wo 30F2 12530 KATAKANA LETTER WO +ン N6 30F3 12531 KATAKANA LETTER N ` +ヴ Vu 30F4 12532 KATAKANA LETTER VU +ヵ KA 30F5 12533 KATAKANA LETTER SMALL KA +ヶ KE 30F6 12534 KATAKANA LETTER SMALL KE +ヷ Va 30F7 12535 KATAKANA LETTER VA +ヸ Vi 30F8 12536 KATAKANA LETTER VI +ヹ Ve 30F9 12537 KATAKANA LETTER VE +ヺ Vo 30FA 12538 KATAKANA LETTER VO +・ .6 30FB 12539 KATAKANA MIDDLE DOT +ー -6 30FC 12540 KATAKANA-HIRAGANA PROLONGED SOUND MARK +ヽ *6 30FD 12541 KATAKANA ITERATION MARK +ヾ +6 30FE 12542 KATAKANA VOICED ITERATION MARK +ㄅ b4 3105 12549 BOPOMOFO LETTER B +ㄆ p4 3106 12550 BOPOMOFO LETTER P +ㄇ m4 3107 12551 BOPOMOFO LETTER M +ㄈ f4 3108 12552 BOPOMOFO LETTER F +ㄉ d4 3109 12553 BOPOMOFO LETTER D +ㄊ t4 310A 12554 BOPOMOFO LETTER T +ㄋ n4 310B 12555 BOPOMOFO LETTER N ` +ㄌ l4 310C 12556 BOPOMOFO LETTER L +ㄍ g4 310D 12557 BOPOMOFO LETTER G +ㄎ k4 310E 12558 BOPOMOFO LETTER K +ㄏ h4 310F 12559 BOPOMOFO LETTER H +ㄐ j4 3110 12560 BOPOMOFO LETTER J +ㄑ q4 3111 12561 BOPOMOFO LETTER Q +ㄒ x4 3112 12562 BOPOMOFO LETTER X +ㄓ zh 3113 12563 BOPOMOFO LETTER ZH +ㄔ ch 3114 12564 BOPOMOFO LETTER CH +ㄕ sh 3115 12565 BOPOMOFO LETTER SH +ㄖ r4 3116 12566 BOPOMOFO LETTER R +ㄗ z4 3117 12567 BOPOMOFO LETTER Z +ㄘ c4 3118 12568 BOPOMOFO LETTER C +ㄙ s4 3119 12569 BOPOMOFO LETTER S +ㄚ a4 311A 12570 BOPOMOFO LETTER A +ㄛ o4 311B 12571 BOPOMOFO LETTER O +ㄜ e4 311C 12572 BOPOMOFO LETTER E +ㄞ ai 311E 12574 BOPOMOFO LETTER AI +ㄟ ei 311F 12575 BOPOMOFO LETTER EI +ㄠ au 3120 12576 BOPOMOFO LETTER AU +ㄡ ou 3121 12577 BOPOMOFO LETTER OU +ㄢ an 3122 12578 BOPOMOFO LETTER AN +ㄣ en 3123 12579 BOPOMOFO LETTER EN +ㄤ aN 3124 12580 BOPOMOFO LETTER ANG +ㄥ eN 3125 12581 BOPOMOFO LETTER ENG +ㄦ er 3126 12582 BOPOMOFO LETTER ER +ㄧ i4 3127 12583 BOPOMOFO LETTER I +ㄨ u4 3128 12584 BOPOMOFO LETTER U +ㄩ iu 3129 12585 BOPOMOFO LETTER IU +ㄪ v4 312A 12586 BOPOMOFO LETTER V +ㄫ nG 312B 12587 BOPOMOFO LETTER NG +ㄬ gn 312C 12588 BOPOMOFO LETTER GN +㈠ 1c 3220 12832 PARENTHESIZED IDEOGRAPH ONE +㈡ 2c 3221 12833 PARENTHESIZED IDEOGRAPH TWO +㈢ 3c 3222 12834 PARENTHESIZED IDEOGRAPH THREE +㈣ 4c 3223 12835 PARENTHESIZED IDEOGRAPH FOUR +㈤ 5c 3224 12836 PARENTHESIZED IDEOGRAPH FIVE +㈥ 6c 3225 12837 PARENTHESIZED IDEOGRAPH SIX +㈦ 7c 3226 12838 PARENTHESIZED IDEOGRAPH SEVEN +㈧ 8c 3227 12839 PARENTHESIZED IDEOGRAPH EIGHT +㈨ 9c 3228 12840 PARENTHESIZED IDEOGRAPH NINE +ff ff FB00 64256 LATIN SMALL LIGATURE FF +fi fi FB01 64257 LATIN SMALL LIGATURE FI +fl fl FB02 64258 LATIN SMALL LIGATURE FL +ſt ft FB05 64261 LATIN SMALL LIGATURE LONG S T +st st FB06 64262 LATIN SMALL LIGATURE ST vim:tw=78:ts=8:ft=help:norl: diff -Naur vim73.orig/runtime/doc/editing.txt vim73/runtime/doc/editing.txt --- vim73.orig/runtime/doc/editing.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/editing.txt 2013-06-07 17:07:08.435651253 +0000 @@ -1,4 +1,4 @@ -*editing.txt* For Vim version 7.3. Last change: 2010 Jul 28 +*editing.txt* For Vim version 7.3. Last change: 2013 Feb 07 VIM REFERENCE MANUAL by Bram Moolenaar @@ -276,10 +276,11 @@ 'readonly' option for this buffer. {not in Vi} *CTRL-^* *CTRL-6* -CTRL-^ Edit the alternate file (equivalent to ":e #"). - Mostly the alternate file is the previously edited - file. This is a quick way to toggle between two - files. +CTRL-^ Edit the alternate file. Mostly the alternate file is + the previously edited file. This is a quick way to + toggle between two files. It is equivalent to ":e #", + except that it also works when there is no file name. + If the 'autowrite' or 'autowriteall' option is on and the buffer was changed, write it. Mostly the ^ character is positioned on the 6 key, @@ -376,8 +377,9 @@ embedded spaces must be escaped with a backslash. *wildcard* *wildcards* -Wildcards in {file} are expanded. Which wildcards are supported depends on -the system. These are the common ones: +Wildcards in {file} are expanded, but as with file completion, 'wildignore' +and 'suffixes' apply. Which wildcards are supported depends on the system. +These are the common ones: ? matches one character * matches anything, including nothing ** matches anything, including nothing, recurses into directories @@ -391,7 +393,7 @@ *starstar-wildcard* Expanding "**" is possible on Unix, Win32, Mac OS/X and a few other systems. This allows searching a directory tree. This goes up to 100 directories deep. -Note there are some commands where this works slightly different, see +Note there are some commands where this works slightly differently, see |file-searching|. Example: > :n **/*.txt @@ -421,9 +423,11 @@ external command, by using the syntax `={expr}` e.g.: > :e `=tempname()` The expression can contain just about anything, thus this can also be used to -avoid the special meaning of '"', '|', '%' and '#'. Names are to be separated -with line breaks. When the result is a |List| then each item is used as a -name. Line breaks also separate names. +avoid the special meaning of '"', '|', '%' and '#'. However, 'wildignore' +does apply like to other wildcards. +If the expression returns a string then names are to be separated with line +breaks. When the result is a |List| then each item is used as a name. Line +breaks also separate names. *++opt* *[++opt]* The [++opt] argument can be used to force the value of 'fileformat', @@ -984,6 +988,11 @@ If the creation of a backup file fails, the write is not done. If you want to write anyway add a '!' to the command. + *write-permissions* +When writing a new file the permissions are read-write. For unix the mask is +0666 with additionally umask applied. When writing a file that was read Vim +will preserve the permissions, but clear the s-bit. + *write-readonly* When the 'cpoptions' option contains 'W', Vim will refuse to overwrite a readonly file. When 'W' is not present, ":w!" will overwrite a readonly file, @@ -1060,6 +1069,7 @@ If there are other tab pages and quitting the last window in the current tab page the current tab page is closed |tab-page|. + Triggers the |QuitPre| autocommand event. :conf[irm] q[uit] Quit, but give prompt when changes have been made, or the last file in the argument list has not been @@ -1153,8 +1163,10 @@ *:confirm* *:conf* :conf[irm] {command} Execute {command}, and use a dialog when an operation has to be confirmed. Can be used on the - ":q", ":qa" and ":w" commands (the latter to over-ride - a read-only setting). + |:q|, |:qa| and |:w| commands (the latter to override + a read-only setting), and any other command that can + fail in such a way, such as |:only|, |:buffer|, + |:bdelete|, etc. Examples: > :confirm w foo @@ -1207,13 +1219,13 @@ unmodified. *browsefilter* -For MS Windows, you can modify the filters that are used in the browse dialog. -By setting the g:browsefilter or b:browsefilter variables, you can change the -filters globally or locally to the buffer. The variable is set to a string in -the format "{filter label}\t{pattern};{pattern}\n" where {filter label} is the -text that appears in the "Files of Type" comboBox, and {pattern} is the -pattern which filters the filenames. Several patterns can be given, separated -by ';'. +For MS Windows and GTK, you can modify the filters that are used in the browse +dialog. By setting the g:browsefilter or b:browsefilter variables, you can +change the filters globally or locally to the buffer. The variable is set to +a string in the format "{filter label}\t{pattern};{pattern}\n" where {filter +label} is the text that appears in the "Files of Type" comboBox, and {pattern} +is the pattern which filters the filenames. Several patterns can be given, +separated by ';'. For Motif the same format is used, but only the very first pattern is actually used (Motif only offers one pattern, but you can edit it). @@ -1221,7 +1233,7 @@ For example, to have only Vim files in the dialog, you could use the following command: > - let g:browsefilter="Vim Scripts\t*.vim\nVim Startup Files\t*vimrc\n" + let g:browsefilter = "Vim Scripts\t*.vim\nVim Startup Files\t*vimrc\n" You can override the filter setting on a per-buffer basis by setting the b:browsefilter variable. You would most likely set b:browsefilter in a @@ -1231,6 +1243,13 @@ may want to add "All Files\t*.*\n" as the final filter, so that the user can still access any desired file. +To avoid setting browsefilter when Vim does not actually support it, you can +use has("browsefilter"): > + + if has("browsefilter") + let g:browsefilter = "whatever" + endif + ============================================================================== 7. The current directory *current-directory* @@ -1340,7 +1359,7 @@ cannot be read without the right key. {only available when compiled with the |+cryptv| feature} *E833* -The text in the swap file and the undo file is also encrypted. +The text in the swap file and the undo file is also encrypted. *E843* Note: The text in memory is not encrypted. A system administrator may be able to see your text while you are editing it. When filtering text with @@ -1382,6 +1401,8 @@ |vimrc| file: > set cm=zip set cm=blowfish +The message given for reading and writing a file will show "[crypted]" when +using zip, "[blowfish]" when using blowfish. When writing an undo file, the same key and method will be used for the text in the undo file. |persistent-undo|. @@ -1431,13 +1452,15 @@ history, showing the 'key' value in a viminfo file. - There is never 100% safety. The encryption in Vim has not been tested for robustness. -- The algorithm used is breakable. A 4 character key in about one hour, a 6 - character key in one day (on a Pentium 133 PC). This requires that you know - some text that must appear in the file. An expert can break it for any key. - When the text has been decrypted, this also means that the key can be - revealed, and other files encrypted with the same key can be decrypted. -- Pkzip uses the same encryption, and US Govt has no objection to its export. - Pkzip's public file APPNOTE.TXT describes this algorithm in detail. +- The algorithm used for 'cryptmethod' "zip" is breakable. A 4 character key + in about one hour, a 6 character key in one day (on a Pentium 133 PC). This + requires that you know some text that must appear in the file. An expert + can break it for any key. When the text has been decrypted, this also means + that the key can be revealed, and other files encrypted with the same key + can be decrypted. +- Pkzip uses the same encryption as 'cryptmethod' "zip", and US Govt has no + objection to its export. Pkzip's public file APPNOTE.TXT describes this + algorithm in detail. - Vim originates from the Netherlands. That is where the sources come from. Thus the encryption code is not exported from the USA. @@ -1629,6 +1652,6 @@ Note that completion for ":find", ":sfind", and ":tabfind" commands do not currently work with 'path' items that contain a url or use the double star - (/usr/**2) or upward search (;) notations. > + with depth limiter (/usr/**2) or upward search (;) notations. vim:tw=78:ts=8:ft=help:norl: diff -Naur vim73.orig/runtime/doc/eval.txt vim73/runtime/doc/eval.txt --- vim73.orig/runtime/doc/eval.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/eval.txt 2013-06-07 17:07:08.518984348 +0000 @@ -1,4 +1,4 @@ -*eval.txt* For Vim version 7.3. Last change: 2010 Aug 15 +*eval.txt* For Vim version 7.3. Last change: 2013 May 21 VIM REFERENCE MANUAL by Bram Moolenaar @@ -39,7 +39,7 @@ *E712* There are six types of variables: -Number A 32 bit signed number. |expr-number| *Number* +Number A 32 or 64 bit signed number. |expr-number| *Number* Examples: -123 0x10 0177 Float A floating point number. |floating-point-format| *Float* @@ -63,21 +63,21 @@ are used. Conversion from a Number to a String is by making the ASCII representation of -the Number. Examples: > - Number 123 --> String "123" - Number 0 --> String "0" - Number -1 --> String "-1" +the Number. Examples: + Number 123 --> String "123" ~ + Number 0 --> String "0" ~ + Number -1 --> String "-1" ~ *octal* Conversion from a String to a Number is done by converting the first digits to a number. Hexadecimal "0xf9" and Octal "017" numbers are recognized. If -the String doesn't start with digits, the result is zero. Examples: > - String "456" --> Number 456 - String "6bar" --> Number 6 - String "foo" --> Number 0 - String "0xf1" --> Number 241 - String "0100" --> Number 64 - String "-8" --> Number -8 - String "+8" --> Number 0 +the String doesn't start with digits, the result is zero. Examples: + String "456" --> Number 456 ~ + String "6bar" --> Number 6 ~ + String "foo" --> Number 0 ~ + String "0xf1" --> Number 241 ~ + String "0100" --> Number 64 ~ + String "-8" --> Number -8 ~ + String "+8" --> Number 0 ~ To force conversion from String to Number, add zero to it: > :echo "0100" + 0 @@ -91,8 +91,8 @@ Note that in the command > :if "foo" "foo" is converted to 0, which means FALSE. To test for a non-empty string, -use strlen(): > - :if strlen("foo") +use empty(): > + :if !empty("foo") < *E745* *E728* *E703* *E729* *E730* *E731* List, Dictionary and Funcref types are not automatically converted. @@ -503,7 +503,7 @@ Dictionary function ~ - *Dictionary-function* *self* *E725* + *Dictionary-function* *self* *E725* *E862* When a function is defined with the "dict" attribute it can be used in a special way with a dictionary. Example: > :function Mylen() dict @@ -615,7 +615,6 @@ - expr7 unary minus + expr7 unary plus - |expr8| expr8[expr1] byte of a String or item of a |List| expr8[expr1 : expr1] substring of a String or sublist of a |List| expr8.name entry in a |Dictionary| @@ -721,7 +720,8 @@ *expr-<#* *expr-<=#* *expr-=~#* *expr-!~#* *expr-==?* *expr-!=?* *expr->?* *expr->=?* *expr- in an abbreviation |:map-|. + It is also used by the |InsertCharPre| and |InsertEnter| events. *v:charconvert_from* *charconvert_from-variable* v:charconvert_from @@ -1537,13 +1544,19 @@ *v:progname* *progname-variable* v:progname Contains the name (with path removed) with which Vim was - invoked. Allows you to do special initialisations for "view", - "evim" etc., or any other name you might symlink to Vim. + invoked. Allows you to do special initialisations for |view|, + |evim| etc., or any other name you might symlink to Vim. Read-only. *v:register* *register-variable* -v:register The name of the register supplied to the last normal mode - command. Empty if none were supplied. |getreg()| |setreg()| +v:register The name of the register in effect for the current normal mode + command (regardless of whether that command actually used a + register). Or for the currently executing normal mode mapping + (use this in custom commands that take a register). + If none is supplied it is the default register '"', unless + 'clipboard' contains "unnamed" or "unnamedplus", then it is + '*' or '+'. + Also see |getreg()| and |setreg()| *v:scrollstart* *scrollstart-variable* v:scrollstart String describing the script or function that caused the @@ -1657,6 +1670,15 @@ *v:warningmsg* *warningmsg-variable* v:warningmsg Last given warning message. It's allowed to set this variable. + *v:windowid* *windowid-variable* +v:windowid When any X11 based GUI is running or when running in a + terminal and Vim connects to the X server (|-X|) this will be + set to the window ID. + When an MS-Windows GUI is running this will be set to the + window handle. + Otherwise the value is zero. + Note: for windows inside Vim use |winnr()|. + ============================================================================== 4. Builtin Functions *functions* @@ -1669,6 +1691,7 @@ abs( {expr}) Float or Number absolute value of {expr} acos( {expr}) Float arc cosine of {expr} add( {list}, {item}) List append {item} to |List| {list} +and( {expr}, {expr}) Number bitwise AND append( {lnum}, {string}) Number append {string} below line {lnum} append( {lnum}, {list}) Number append lines {list} below line {lnum} argc() Number number of files in the argument list @@ -1693,7 +1716,7 @@ any call {func} with arguments {arglist} ceil( {expr}) Float round {expr} up changenr() Number current change number -char2nr( {expr}) Number ASCII value of first char in {expr} +char2nr( {expr}[, {utf8}]) Number ASCII/UTF8 value of first char in {expr} cindent( {lnum}) Number C indent for line {lnum} clearmatches() none clear all matches col( {expr}) Number column nr of cursor or mark @@ -1726,7 +1749,8 @@ extend( {expr1}, {expr2} [, {expr3}]) List/Dict insert items of {expr2} into {expr1} exp( {expr}) Float exponential of {expr} -expand( {expr} [, {flag}]) String expand special keywords in {expr} +expand( {expr} [, {nosuf} [, {list}]]) + any expand special keywords in {expr} feedkeys( {string} [, {mode}]) Number add key sequence to typeahead buffer filereadable( {file}) Number TRUE if {file} is a readable file filewritable( {file}) Number TRUE if {file} is a writable file @@ -1748,12 +1772,13 @@ foldtextresult( {lnum}) String text for closed fold at {lnum} foreground( ) Number bring the Vim window to the foreground function( {name}) Funcref reference to function {name} -garbagecollect( [at_exit]) none free memory, breaking cyclic references +garbagecollect( [{atexit}]) none free memory, breaking cyclic references get( {list}, {idx} [, {def}]) any get item {idx} from {list} or {def} get( {dict}, {key} [, {def}]) any get item {key} from {dict} or {def} getbufline( {expr}, {lnum} [, {end}]) List lines {lnum} to {end} of buffer {expr} -getbufvar( {expr}, {varname}) any variable {varname} in buffer {expr} +getbufvar( {expr}, {varname} [, {def}]) + any variable {varname} in buffer {expr} getchar( [expr]) Number get one character from the user getcharmod( ) Number modifiers for the last typed character getcmdline() String return the current command-line @@ -1774,13 +1799,16 @@ getqflist() List list of quickfix items getreg( [{regname} [, 1]]) String contents of register getregtype( [{regname}]) String type of register -gettabvar( {nr}, {varname}) any variable {varname} in tab {nr} -gettabwinvar( {tabnr}, {winnr}, {name}) +gettabvar( {nr}, {varname} [, {def}]) + any variable {varname} in tab {nr} or {def} +gettabwinvar( {tabnr}, {winnr}, {name} [, {def}]) any {name} in {winnr} in tab page {tabnr} getwinposx() Number X coord in pixels of GUI Vim window getwinposy() Number Y coord in pixels of GUI Vim window -getwinvar( {nr}, {varname}) any variable {varname} in window {nr} -glob( {expr} [, {flag}]) String expand file wildcards in {expr} +getwinvar( {nr}, {varname} [, {def}]) + any variable {varname} in window {nr} +glob( {expr} [, {nosuf} [, {list}]]) + any expand file wildcards in {expr} globpath( {path}, {expr} [, {flag}]) String do glob({expr}) for all dirs in {path} has( {feature}) Number TRUE if feature {feature} supported @@ -1807,6 +1835,7 @@ inputsave() Number save and clear typeahead inputsecret( {prompt} [, {text}]) String like input() but hiding the text insert( {list}, {item} [, {idx}]) List insert {item} in {list} [before {idx}] +invert( {expr}) Number bitwise invert isdirectory( {directory}) Number TRUE if {directory} is a directory islocked( {expr}) Number TRUE if {expr} is locked items( {dict}) List key-value pairs in {dict} @@ -1821,9 +1850,11 @@ localtime() Number current time log( {expr}) Float natural logarithm (base e) of {expr} log10( {expr}) Float logarithm of Float {expr} to base 10 +luaeval( {expr}[, {expr}]) any evaluate |Lua| expression map( {expr}, {string}) List/Dict change each item in {expr} to {expr} -maparg( {name}[, {mode} [, {abbr}]]) - String rhs of mapping {name} in mode {mode} +maparg( {name}[, {mode} [, {abbr} [, {dict}]]]) + String or Dict + rhs of mapping {name} in mode {mode} mapcheck( {name}[, {mode} [, {abbr}]]) String check for mappings matching {name} match( {expr}, {pat}[, {start}[, {count}]]) @@ -1845,12 +1876,15 @@ mode( [expr]) String current editing mode mzeval( {expr}) any evaluate |MzScheme| expression nextnonblank( {lnum}) Number line nr of non-blank line >= {lnum} -nr2char( {expr}) String single char with ASCII value {expr} +nr2char( {expr}[, {utf8}]) String single char with ASCII/UTF8 value {expr} +or( {expr}, {expr}) Number bitwise OR pathshorten( {expr}) String shorten directory names in a path pow( {x}, {y}) Float {x} to the power of {y} prevnonblank( {lnum}) Number line nr of non-blank line <= {lnum} printf( {fmt}, {expr1}...) String format text pumvisible() Number whether popup menu is visible +pyeval( {expr}) any evaluate |Python| expression +py3eval( {expr}) any evaluate |python3| expression range( {expr} [, {max} [, {stride}]]) List items from {expr} to {max} readfile( {fname} [, {binary} [, {max}]]) @@ -1872,6 +1906,8 @@ resolve( {filename}) String get filename a shortcut points to reverse( {list}) List reverse {list} in-place round( {expr}) Float round off {expr} +screencol() Number current cursor column +screenrow() Number current cursor row search( {pattern} [, {flags} [, {stopline} [, {timeout}]]]) Number search for {pattern} searchdecl( {name} [, {global} [, {thisblock}]]) @@ -1898,20 +1934,23 @@ settabwinvar( {tabnr}, {winnr}, {varname}, {val}) set {varname} in window {winnr} in tab page {tabnr} to {val} setwinvar( {nr}, {varname}, {val}) set {varname} in window {nr} to {val} +sha256( {string}) String SHA256 checksum of {string} shellescape( {string} [, {special}]) String escape {string} for use as shell command argument +shiftwidth() Number effective value of 'shiftwidth' simplify( {filename}) String simplify filename as much as possible sin( {expr}) Float sine of {expr} sinh( {expr}) Float hyperbolic sine of {expr} -sort( {list} [, {func}]) List sort {list}, using {func} to compare +sort( {list} [, {func} [, {dict}]]) + List sort {list}, using {func} to compare soundfold( {word}) String sound-fold {word} spellbadword() String badly spelled word at cursor spellsuggest( {word} [, {max} [, {capital}]]) List spelling suggestions split( {expr} [, {pat} [, {keepempty}]]) List make |List| from {pat} separated {expr} -sqrt( {expr} Float squar root of {expr} +sqrt( {expr}) Float square root of {expr} str2float( {expr}) Float convert String to Float str2nr( {expr} [, {base}]) Number convert String to Number strchars( {expr}) Number character length of the String {expr} @@ -1927,13 +1966,14 @@ Number last index of {needle} in {haystack} strtrans( {expr}) String translate string to make it printable strwidth( {expr}) Number display cell length of the String {expr} -submatch( {nr}) String specific match in ":substitute" +submatch( {nr}) String specific match in ":s" or substitute() substitute( {expr}, {pat}, {sub}, {flags}) String all {pat} in {expr} replaced with {sub} synID( {lnum}, {col}, {trans}) Number syntax ID at {lnum} and {col} synIDattr( {synID}, {what} [, {mode}]) String attribute {what} of syntax ID {synID} synIDtrans( {synID}) Number translated syntax ID of {synID} +synconcealed( {lnum}, {col}) List info about concealing synstack( {lnum}, {col}) List stack of syntax IDs at {lnum} and {col} system( {expr} [, {input}]) String output of shell command/filter {expr} tabpagebuflist( [{arg}]) List list of buffer numbers in tab page @@ -1949,13 +1989,14 @@ toupper( {expr}) String the String {expr} switched to uppercase tr( {src}, {fromstr}, {tostr}) String translate chars of {src} in {fromstr} to chars in {tostr} -trunc( {expr} Float truncate Float {expr} +trunc( {expr}) Float truncate Float {expr} type( {name}) Number type of variable {name} undofile( {name}) String undo file name for {name} undotree() List undo file tree values( {dict}) List values in {dict} virtcol( {expr}) Number screen column of cursor or mark visualmode( [expr]) String last visual mode used +wildmenumode() Number whether 'wildmenu' mode is active winbufnr( {nr}) Number buffer number of window {nr} wincol() Number window column of the cursor winheight( {nr}) Number height of window {nr} @@ -1967,6 +2008,7 @@ winwidth( {nr}) Number width of window {nr} writefile( {list}, {fname} [, {binary}]) Number write list of lines to file {fname} +xor( {expr}, {expr}) Number bitwise XOR abs({expr}) *abs()* Return the absolute value of {expr}. When {expr} evaluates to @@ -2006,6 +2048,13 @@ Use |insert()| to add an item at another position. +and({expr}, {expr}) *and()* + Bitwise AND on the two arguments. The arguments are converted + to a number. A List, Dict or Float argument causes an error. + Example: > + :let flag = and(bits, 0x80) + + append({lnum}, {expr}) *append()* When {expr} is a |List|: Append each item of the |List| as a text line below line {lnum} in the current buffer. @@ -2250,14 +2299,17 @@ redo it is the number of the redone change. After undo it is one less than the number of the undone change. -char2nr({expr}) *char2nr()* +char2nr({expr}[, {utf8}]) *char2nr()* Return number value of the first char in {expr}. Examples: > char2nr(" ") returns 32 char2nr("ABC") returns 65 -< The current 'encoding' is used. Example for "utf-8": > +< When {utf8} is omitted or zero, the current 'encoding' is used. + Example for "utf-8": > char2nr("") returns 225 char2nr(""[0]) returns 195 -< |nr2char()| does the opposite. +< With {utf8} set to 1, always treat as utf-8 characters. + A combining character is a separate character. + |nr2char()| does the opposite. cindent({lnum}) *cindent()* Get the amount of indent for line {lnum} according the C @@ -2277,7 +2329,7 @@ position given with {expr}. The accepted positions are: . the cursor position $ the end of the cursor line (the result is the - number of characters in the cursor line plus one) + number of bytes in the cursor line plus one) 'x position of mark x (if the mark is not set, 0 is returned) Additionally {expr} can be [lnum, col]: a |List| with the line @@ -2531,6 +2583,8 @@ which is 0 if the file was deleted successfully, and non-zero when the deletion failed. Use |remove()| to delete an item from a |List|. + To delete a line from the buffer use |:delete|. Use |:exe| + when the line number is in a variable. *did_filetype()* did_filetype() Returns non-zero when autocommands are being executed and the @@ -2708,13 +2762,15 @@ {only available when compiled with the |+float| feature} -expand({expr} [, {flag}]) *expand()* +expand({expr} [, {nosuf} [, {list}]]) *expand()* Expand wildcards and the following special keywords in {expr}. - The result is a String. + 'wildignorecase' applies. - When there are several matches, they are separated by - characters. [Note: in version 5.0 a space was used, which - caused problems when a file name contains a space] + If {list} is given and it is non-zero, a List will be returned. + Otherwise the result is a String and when there are several + matches, they are separated by characters. [Note: in + version 5.0 a space was used, which caused problems when a + file name contains a space] If the expansion fails, the result is an empty string. A name for a non-existing file is not included. @@ -2731,6 +2787,7 @@ autocmd buffer number (as a String!) autocmd matched name sourced script file name + sourced script file line number word under the cursor WORD under the cursor the {clientid} of the last received @@ -2767,10 +2824,10 @@ When {expr} does not start with '%', '#' or '<', it is expanded like a file name is expanded on the command line. 'suffixes' and 'wildignore' are used, unless the optional - {flag} argument is given and it is non-zero. Names for - non-existing files are included. The "**" item can be used to - search in a directory tree. For example, to find all "README" - files in the current directory and below: > + {nosuf} argument is given and it is non-zero. + Names for non-existing files are included. The "**" item can + be used to search in a directory tree. For example, to find + all "README" files in the current directory and below: > :echo expand("**/README") < Expand() can also be used to expand variables and environment @@ -3043,7 +3100,7 @@ {name} can be a user defined function or an internal function. -garbagecollect([at_exit]) *garbagecollect()* +garbagecollect([{atexit}]) *garbagecollect()* Cleanup unused |Lists| and |Dictionaries| that have circular references. There is hardly ever a need to invoke this function, as it is automatically done when Vim runs out of @@ -3053,7 +3110,7 @@ This is useful if you have deleted a very big |List| and/or |Dictionary| with circular references in a script that runs for a long time. - When the optional "at_exit" argument is one, garbage + When the optional {atexit} argument is one, garbage collection will also be done when exiting Vim, if it wasn't done before. This is useful when checking for memory leaks. @@ -3091,7 +3148,7 @@ Example: > :let lines = getbufline(bufnr("myfile"), 1, "$") -getbufvar({expr}, {varname}) *getbufvar()* +getbufvar({expr}, {varname} [, {def}]) *getbufvar()* The result is the value of option or local buffer variable {varname} in buffer {expr}. Note that the name without "b:" must be used. @@ -3101,8 +3158,8 @@ doesn't work for a global variable, window-local variable or window-local option. For the use of {expr}, see |bufname()| above. - When the buffer or variable doesn't exist an empty string is - returned, there is no error message. + When the buffer or variable doesn't exist {def} or an empty + string is returned, there is no error message. Examples: > :let bufmodified = getbufvar(1, "&mod") :echo "todo myvar = " . getbufvar("todo", "myvar") @@ -3129,6 +3186,8 @@ one-byte character it is the character itself as a number. Use nr2char() to convert it to a String. + Use getcharmod() to obtain any additional modifiers. + When the user clicks a mouse button, the mouse event will be returned. The position can then be found in |v:mouse_col|, |v:mouse_lnum| and |v:mouse_win|. This example positions the @@ -3167,10 +3226,11 @@ 2 shift 4 control 8 alt (meta) - 16 mouse double click - 32 mouse triple click - 64 mouse quadruple click - 128 Macintosh only: command + 16 meta (when it's different from ALT) + 32 mouse double click + 64 mouse triple click + 96 mouse quadruple click (== 32 + 64) + 128 command (Macintosh only) Only the modifiers that have not been included in the character itself are obtained. Thus Shift-a results in "A" without a modifier. @@ -3187,7 +3247,8 @@ Return the position of the cursor in the command line as a byte count. The first column is 1. Only works when editing the command line, thus requires use of - |c_CTRL-\_e| or |c_CTRL-R_=|. Returns 0 otherwise. + |c_CTRL-\_e| or |c_CTRL-R_=| or an expression mapping. + Returns 0 otherwise. Also see |getcmdtype()|, |setcmdpos()| and |getcmdline()|. getcmdtype() *getcmdtype()* @@ -3200,8 +3261,8 @@ @ |input()| command - |:insert| or |:append| command Only works when editing the command line, thus requires use of - |c_CTRL-\_e| or |c_CTRL-R_=|. Returns an empty string - otherwise. + |c_CTRL-\_e| or |c_CTRL-R_=| or an expression mapping. + Returns an empty string otherwise. Also see |getcmdpos()|, |setcmdpos()| and |getcmdline()|. *getcwd()* @@ -3239,8 +3300,9 @@ "rwx" flags represent, in turn, the permissions of the owner of the file, the group the file belongs to, and other users. If a user does not have a given permission the flag for this - is replaced with the string "-". Example: > + is replaced with the string "-". Examples: > :echo getfperm("/etc/passwd") + :echo getfperm(expand("~/.vimrc")) < This will hopefully (from a security point of view) display the string "rw-r--r--" or even "rw-------". @@ -3374,26 +3436,30 @@ is one character with value 0x16. If {regname} is not specified, |v:register| is used. -gettabvar({tabnr}, {varname}) *gettabvar()* +gettabvar({tabnr}, {varname} [, {def}]) *gettabvar()* Get the value of a tab-local variable {varname} in tab page {tabnr}. |t:var| Tabs are numbered starting with one. Note that the name without "t:" must be used. + When the tab or variable doesn't exist {def} or an empty + string is returned, there is no error message. -gettabwinvar({tabnr}, {winnr}, {varname}) *gettabwinvar()* +gettabwinvar({tabnr}, {winnr}, {varname} [, {def}]) *gettabwinvar()* Get the value of window-local variable {varname} in window {winnr} in tab page {tabnr}. When {varname} starts with "&" get the value of a window-local option. + When {varname} is empty a dictionary with all window-local + variables is returned. + Note that {varname} must be the name without "w:". Tabs are numbered starting with one. For the current tabpage use |getwinvar()|. When {winnr} is zero the current window is used. This also works for a global option, buffer-local option and window-local option, but it doesn't work for a global variable or buffer-local variable. - When {varname} is empty a dictionary with all window-local - variables is returned. - Note that {varname} must be the name without "w:". + When the tab, window or variable doesn't exist {def} or an + empty string is returned, there is no error message. Examples: > :let list_is_on = gettabwinvar(1, 2, '&list') :echo "myvar = " . gettabwinvar(3, 1, 'myvar') @@ -3408,24 +3474,31 @@ the top of the GUI Vim window. The result will be -1 if the information is not available. -getwinvar({winnr}, {varname}) *getwinvar()* +getwinvar({winnr}, {varname} [, {def}]) *getwinvar()* Like |gettabwinvar()| for the current tabpage. Examples: > :let list_is_on = getwinvar(2, '&list') :echo "myvar = " . getwinvar(1, 'myvar') < -glob({expr} [, {flag}]) *glob()* +glob({expr} [, {nosuf} [, {list}]]) *glob()* Expand the file wildcards in {expr}. See |wildcards| for the use of special characters. - The result is a String. - When there are several matches, they are separated by - characters. - Unless the optional {flag} argument is given and is non-zero, + + Unless the optional {nosuf} argument is given and is non-zero, the 'suffixes' and 'wildignore' options apply: Names matching one of the patterns in 'wildignore' will be skipped and 'suffixes' affect the ordering of matches. - If the expansion fails, the result is an empty string. - A name for a non-existing file is not included. + 'wildignorecase' always applies. + + When {list} is present and it is non-zero the result is a List + with all matching files. The advantage of using a List is, + you also get filenames containing newlines correctly. + Otherwise the result is a String and when there are several + matches, they are separated by characters. + + If the expansion fails, the result is an empty String or List. + A name for a non-existing file is not included. A symbolic + link is only included if it points to an existing file. For most systems backticks can be used to get files names from any external command. Example: > @@ -3511,6 +3584,9 @@ "search" or "/" search pattern history "expr" or "=" typed expression history "input" or "@" input line history + "debug" or ">" debug command history + The {history} string does not need to be the whole name, one + character is sufficient. If {item} does already exist in the history, it will be shifted to become the newest entry. The result is a Number: 1 if the operation was successful, @@ -3694,10 +3770,10 @@ Like |input()|, but when the GUI is running and text dialogs are supported, a dialog window pops up to input the text. Example: > - :let n = inputdialog("value for shiftwidth", &sw) - :if n != "" - : let &sw = n - :endif + :let n = inputdialog("value for shiftwidth", shiftwidth()) + :if n != "" + : let &sw = n + :endif < When the dialog is cancelled {cancelreturn} is returned. When omitted an empty string is returned. Hitting works like pressing the OK button. Hitting @@ -3759,6 +3835,11 @@ Note that when {item} is a |List| it is inserted as a single item. Use |extend()| to concatenate |Lists|. +invert({expr}) *invert()* + Bitwise invert. The argument is converted to a number. A + List, Dict or Float argument causes an error. Example: > + :let bits = invert(bits) + isdirectory({directory}) *isdirectory()* The result is a Number, which is non-zero when a directory with the name {directory} exists. If {directory} doesn't @@ -3897,11 +3978,12 @@ Return the byte count from the start of the buffer for line {lnum}. This includes the end-of-line character, depending on the 'fileformat' option for the current buffer. The first - line returns 1. + line returns 1. 'encoding' matters, 'fileencoding' is ignored. This can also be used to get the byte count for the line just below the last line: > line2byte(line("$") + 1) -< This is the file size plus one. +< This is the buffer size plus one. If 'fileencoding' is empty + it is the file size plus one. When {lnum} is invalid, or the |+byte_offset| feature has been disabled at compile time, -1 is returned. Also see |byte2line()|, |go| and |:goto|. @@ -3941,6 +4023,20 @@ < -2.0 {only available when compiled with the |+float| feature} +luaeval({expr}[, {expr}]) *luaeval()* + Evaluate Lua expression {expr} and return its result converted + to Vim data structures. Second {expr} may hold additional + argument accessible as _A inside first {expr}. + Strings are returned as they are. + Boolean objects are converted to numbers. + Numbers are converted to |Float| values if vim was compiled + with |+float| and to numbers otherwise. + Dictionaries and lists obtained by vim.eval() are returned + as-is. + Other objects are returned as zero without any errors. + See |lua-luaeval| for more details. + {only available when compiled with the |+lua| feature} + map({expr}, {string}) *map()* {expr} must be a |List| or a |Dictionary|. Replace each item in {expr} with the result of evaluating @@ -3959,30 +4055,58 @@ The operation is done in-place. If you want a |List| or |Dictionary| to remain unmodified make a copy first: > - :let tlist = map(copy(mylist), ' & . "\t"') + :let tlist = map(copy(mylist), ' v:val . "\t"') < Returns {expr}, the |List| or |Dictionary| that was filtered. When an error is encountered while evaluating {string} no further items in {expr} are processed. -maparg({name}[, {mode} [, {abbr}]]) *maparg()* - Return the rhs of mapping {name} in mode {mode}. When there - is no mapping for {name}, an empty String is returned. +maparg({name}[, {mode} [, {abbr} [, {dict}]]]) *maparg()* + When {dict} is omitted or zero: Return the rhs of mapping + {name} in mode {mode}. The returned String has special + characters translated like in the output of the ":map" command + listing. + + When there is no mapping for {name}, an empty String is + returned. + + The {name} can have special key names, like in the ":map" + command. + {mode} can be one of these strings: "n" Normal - "v" Visual + "v" Visual (including Select) "o" Operator-pending "i" Insert "c" Cmd-line + "s" Select + "x" Visual "l" langmap |language-mapping| "" Normal, Visual and Operator-pending When {mode} is omitted, the modes for "" are used. + When {abbr} is there and it is non-zero use abbreviations instead of mappings. - The {name} can have special key names, like in the ":map" - command. The returned String has special characters - translated like in the output of the ":map" command listing. + + When {dict} is there and it is non-zero return a dictionary + containing all the information of the mapping with the + following items: + "lhs" The {lhs} of the mapping. + "rhs" The {rhs} of the mapping as typed. + "silent" 1 for a |:map-silent| mapping, else 0. + "noremap" 1 if the {rhs} of the mapping is not remappable. + "expr" 1 for an expression mapping (|:map-|). + "buffer" 1 for a buffer local mapping (|:map-local|). + "mode" Modes for which the mapping is defined. In + addition to the modes mentioned above, these + characters will be used: + " " Normal, Visual and Operator-pending + "!" Insert and Commandline mode + (|mapmode-ic|) + "sid" The script local ID, used for mappings + (||). + The mappings local to the current buffer are checked first, then the global mappings. This function can be used to map a key even when it's already @@ -4031,6 +4155,7 @@ {pat} matches. A match at the first character or |List| item returns zero. If there is no match -1 is returned. + For getting submatches see |matchlist()|. Example: > :echo match("testing", "ing") " results in 4 :echo match([1, 'x'], '\a') " results in 1 @@ -4236,7 +4361,7 @@ mzeval({expr}) *mzeval()* Evaluate MzScheme expression {expr} and return its result - convert to Vim data structures. + converted to Vim data structures. Numbers and strings are returned as they are. Pairs (including lists and improper lists) and vectors are returned as Vim |Lists|. @@ -4259,14 +4384,16 @@ below it, zero is returned. See also |prevnonblank()|. -nr2char({expr}) *nr2char()* +nr2char({expr}[, {utf8}]) *nr2char()* Return a string with a single character, which has the number value {expr}. Examples: > nr2char(64) returns "@" nr2char(32) returns " " -< The current 'encoding' is used. Example for "utf-8": > +< When {utf8} is omitted or zero, the current 'encoding' is used. + Example for "utf-8": > nr2char(300) returns I with bow character -< Note that a NUL character in the file is specified with +< With {utf8} set to 1, always return utf-8 characters. + Note that a NUL character in the file is specified with nr2char(10), because NULs are represented with newline characters. nr2char(0) is a real NUL and terminates the string, thus results in an empty string. @@ -4295,6 +4422,13 @@ call setpos('.', save_cursor) < Also see |setpos()|. +or({expr}, {expr}) *or()* + Bitwise OR on the two arguments. The arguments are converted + to a number. A List, Dict or Float argument causes an error. + Example: > + :let bits = or(bits, 0x80) + + pathshorten({expr}) *pathshorten()* Shorten directory names in the path {expr} and return the result. The tail, the file name, is kept as-is. The other @@ -4334,6 +4468,7 @@ Often used items are: %s string + %6S string right-aligned in 6 display cells %6s string right-aligned in 6 bytes %.9s string truncated to 9 bytes %c single byte @@ -4448,6 +4583,10 @@ s The text of the String argument is used. If a precision is specified, no more bytes than the number specified are used. + S The text of the String argument is used. If a + precision is specified, no more display cells than the + number specified are used. Without the |+multi_byte| + feature works just like 's'. *printf-f* *E807* f The Float argument is converted into a string of the @@ -4500,6 +4639,29 @@ This can be used to avoid some things that would remove the popup menu. + *E860* +py3eval({expr}) *py3eval()* + Evaluate Python expression {expr} and return its result + converted to Vim data structures. + Numbers and strings are returned as they are (strings are + copied though, unicode strings are additionally converted to + 'encoding'). + Lists are represented as Vim |List| type. + Dictionaries are represented as Vim |Dictionary| type with + keys converted to strings. + {only available when compiled with the |+python3| feature} + + *E858* *E859* +pyeval({expr}) *pyeval()* + Evaluate Python expression {expr} and return its result + converted to Vim data structures. + Numbers and strings are returned as they are (strings are + copied though). + Lists are represented as Vim |List| type. + Dictionaries are represented as Vim |Dictionary| type, + non-string keys result in error. + {only available when compiled with the |+python| feature} + *E726* *E727* range({expr} [, {max} [, {stride}]]) *range()* Returns a |List| with Numbers: @@ -4727,12 +4889,35 @@ echo round(-4.5) < -5.0 {only available when compiled with the |+float| feature} - - + +screencol() *screencol()* + The result is a Number, which is the current screen column of + the cursor. The leftmost column has number 1. + This function is mainly used for testing. + + Note: Always returns the current screen column, thus if used + in a command (e.g. ":echo screencol()") it will return the + column inside the command line, which is 1 when the command is + executed. To get the cursor position in the file use one of + the following mappings: > + nnoremap GG ":echom ".screencol()."\n" + nnoremap GG :echom screencol() +< +screenrow() *screenrow()* + The result is a Number, which is the current screen row of the + cursor. The top line has number one. + This function is mainly used for testing. + + Note: Same restrictions as with |screencol()|. + search({pattern} [, {flags} [, {stopline} [, {timeout}]]]) *search()* Search for regexp pattern {pattern}. The search starts at the cursor position (you can use |cursor()| to set it). + When a match has been found its line number is returned. + If there is no match a 0 is returned and the cursor doesn't + move. No error message is given. + {flags} is a String, which can contain these character flags: 'b' search backward instead of forward 'c' accept a match at the cursor position @@ -4760,15 +4945,12 @@ A zero value is equal to not giving the argument. When the {timeout} argument is given the search stops when - more than this many milli seconds have passed. Thus when + more than this many milliseconds have passed. Thus when {timeout} is 500 the search stops after half a second. The value must not be negative. A zero value is like not giving the argument. {only available when compiled with the |+reltime| feature} - If there is no match a 0 is returned and the cursor doesn't - move. No error message is given. - When a match has been found its line number is returned. *search()-sub-match* With the 'p' flag the returned value is one more than the first sub-match in \(\). One if none of them matched but the @@ -4987,7 +5169,8 @@ line. setline({lnum}, {text}) *setline()* - Set line {lnum} of the current buffer to {text}. + Set line {lnum} of the current buffer to {text}. To insert + lines use |append()|. {lnum} is used like with |getline()|. When {lnum} is just below the last line the {text} will be added as a new line. @@ -4998,7 +5181,7 @@ will be set to the items in the list. Example: > :call setline(5, ['aaa', 'bbb', 'ccc']) < This is equivalent to: > - :for [n, l] in [[5, 6, 7], ['aaa', 'bbb', 'ccc']] + :for [n, l] in [[5, 'aaa'], [6, 'bbb'], [7, 'ccc']] : call setline(n, l) :endfor < Note: The '[ and '] marks are not set. @@ -5112,8 +5295,9 @@ If {options} contains no register settings, then the default is to use character mode unless {value} ends in a . - Setting the '=' register is not possible. - Returns zero for success, non-zero for failure. + Setting the '=' register is not possible, but you can use > + :let @= = var_expr +< Returns zero for success, non-zero for failure. Examples: > :call setreg(v:register, @*) @@ -5136,8 +5320,6 @@ |t:var| Note that the variable name without "t:" must be used. Tabs are numbered starting with one. - Vim briefly goes to the tab page {tabnr}, this may trigger - TabLeave and TabEnter autocommands. This function is not available in the |sandbox|. settabwinvar({tabnr}, {winnr}, {varname}, {val}) *settabwinvar()* @@ -5150,8 +5332,6 @@ doesn't work for a global or local buffer variable. For a local buffer option the global value is unchanged. Note that the variable name without "w:" must be used. - Vim briefly goes to the tab page {tabnr}, this may trigger - TabLeave and TabEnter autocommands. Examples: > :call settabwinvar(1, 1, "&list", 0) :call settabwinvar(3, 2, "myvar", "foobar") @@ -5163,6 +5343,11 @@ :call setwinvar(1, "&list", 0) :call setwinvar(2, "myvar", "foobar") +sha256({string}) *sha256()* + Returns a String with 64 hex charactes, which is the SHA256 + checksum of {string}. + {only available when compiled with the |+cryptv| feature} + shellescape({string} [, {special}]) *shellescape()* Escape {string} for use as a shell command argument. On MS-Windows and MS-DOS, when 'shellslash' is not set, it @@ -5189,6 +5374,23 @@ :call system("chmod +w -- " . shellescape(expand("%"))) +shiftwidth() *shiftwidth()* + Returns the effective value of 'shiftwidth'. This is the + 'shiftwidth' value unless it is zero, in which case it is the + 'tabstop' value. To be backwards compatible in indent + plugins, use this: > + if exists('*shiftwidth') + func s:sw() + return shiftwidth() + endfunc + else + func s:sw() + return &sw + endfunc + endif +< And then use s:sw() instead of &sw. + + simplify({filename}) *simplify()* Simplify the file name as much as possible without changing the meaning. Shortcuts (on MS-Windows) or symbolic links (on @@ -5228,7 +5430,7 @@ {only available when compiled with the |+float| feature} -sort({list} [, {func}]) *sort()* *E702* +sort({list} [, {func} [, {dict}]]) *sort()* *E702* Sort the items in {list} in-place. Returns {list}. If you want a list to remain unmodified make a copy first: > :let sortedlist = sort(copy(mylist)) @@ -5236,6 +5438,8 @@ Numbers sort after Strings, |Lists| after Numbers. For sorting text in the current buffer use |:sort|. When {func} is given and it is one then case is ignored. + {dict} is for functions with the "dict" attribute. It will be + used to set the local variable "self". |Dictionary-function| When {func} is a |Funcref| or a function name, this function is called to compare items. The function is invoked with two items as argument and must return zero if they are equal, 1 or @@ -5316,7 +5520,8 @@ empty each white-separated sequence of characters becomes an item. Otherwise the string is split where {pattern} matches, - removing the matched characters. + removing the matched characters. 'ignorecase' is not used + here, add \c to ignore case. |/\c| When the first or last item is empty it is omitted, unless the {keepempty} argument is given and it's non-zero. Other empty items are kept when {pattern} matches at least one @@ -5416,8 +5621,8 @@ {haystack} of the first occurrence of the String {needle}. If {start} is specified, the search starts at index {start}. This can be used to find a second match: > - :let comma1 = stridx(line, ",") - :let comma2 = stridx(line, ",", comma1 + 1) + :let colon1 = stridx(line, ":") + :let colon2 = stridx(line, ":", colon1 + 1) < The search is done case-sensitive. For pattern searches use |match()|. -1 is returned if the {needle} does not occur in {haystack}. @@ -5507,9 +5712,11 @@ Also see |strlen()|, |strdisplaywidth()| and |strchars()|. submatch({nr}) *submatch()* - Only for an expression in a |:substitute| command. Returns - the {nr}'th submatch of the matched text. When {nr} is 0 - the whole matched text is returned. + Only for an expression in a |:substitute| command or + substitute() function. + Returns the {nr}'th submatch of the matched text. When {nr} + is 0 the whole matched text is returned. + Also see |sub-replace-expression|. Example: > :s/\d\+/\=submatch(0) + 1/ < This finds the first number in the line and adds one to it. @@ -5517,26 +5724,37 @@ substitute({expr}, {pat}, {sub}, {flags}) *substitute()* The result is a String, which is a copy of {expr}, in which - the first match of {pat} is replaced with {sub}. This works - like the ":substitute" command (without any flags). But the - matching with {pat} is always done like the 'magic' option is - set and 'cpoptions' is empty (to make scripts portable). - 'ignorecase' is still relevant. 'smartcase' is not used. - See |string-match| for how {pat} is used. - And a "~" in {sub} is not replaced with the previous {sub}. + the first match of {pat} is replaced with {sub}. + When {flags} is "g", all matches of {pat} in {expr} are + replaced. Otherwise {flags} should be "". + + This works like the ":substitute" command (without any flags). + But the matching with {pat} is always done like the 'magic' + option is set and 'cpoptions' is empty (to make scripts + portable). 'ignorecase' is still relevant, use |/\c| or |/\C| + if you want to ignore or match case and ignore 'ignorecase'. + 'smartcase' is not used. See |string-match| for how {pat} is + used. + + A "~" in {sub} is not replaced with the previous {sub}. Note that some codes in {sub} have a special meaning |sub-replace-special|. For example, to replace something with "\n" (two characters), use "\\\\n" or '\\n'. + When {pat} does not match in {expr}, {expr} is returned unmodified. - When {flags} is "g", all matches of {pat} in {expr} are - replaced. Otherwise {flags} should be "". + Example: > :let &path = substitute(&path, ",\\=[^,]*$", "", "") < This removes the last component of the 'path' option. > :echo substitute("testing", ".*", "\\U\\0", "") < results in "TESTING". + When {sub} starts with "\=", the remainder is interpreted as + an expression. See |sub-replace-expression|. Example: > + :echo substitute(s, '%\(\x\x\)', + \ '\=nr2char("0x" . submatch(1))', 'g') + synID({lnum}, {col}, {trans}) *synID()* The result is a Number, which is the syntax ID at the position {lnum} and {col} in the current window. @@ -5558,20 +5776,6 @@ :echo synIDattr(synID(line("."), col("."), 1), "name") < -synconcealed({lnum}, {col}) *synconcealed()* - The result is a List. The first item in the list is 0 if the - character at the position {lnum} and {col} is not part of a - concealable region, 1 if it is. The second item in the list is - a string. If the first item is 1, the second item contains the - text which will be displayed in place of the concealed text, - depending on the current setting of 'conceallevel'. The third - and final item in the list is a unique number representing the - specific syntax region matched. This allows detection of the - beginning of a new concealable region if there are two - consecutive regions with the same replacement character. - For an example use see $VIMRUNTIME/syntax/2html.vim . - - synIDattr({synID}, {what} [, {mode}]) *synIDattr()* The result is a String, which is the {what} attribute of syntax ID {synID}. This can be used to obtain information @@ -5612,6 +5816,20 @@ highlight the character. Highlight links given with ":highlight link" are followed. +synconcealed({lnum}, {col}) *synconcealed()* + The result is a List. The first item in the list is 0 if the + character at the position {lnum} and {col} is not part of a + concealable region, 1 if it is. The second item in the list is + a string. If the first item is 1, the second item contains the + text which will be displayed in place of the concealed text, + depending on the current setting of 'conceallevel'. The third + and final item in the list is a unique number representing the + specific syntax region matched. This allows detection of the + beginning of a new concealable region if there are two + consecutive regions with the same replacement character. + For an example use see $VIMRUNTIME/syntax/2html.vim . + + synstack({lnum}, {col}) *synstack()* Return a |List|, which is the stack of syntax items at the position {lnum} and {col} in the current window. Each item in @@ -5674,9 +5892,9 @@ omitted the current tab page is used. When {arg} is invalid the number zero is returned. To get a list of all buffers in all tabs use this: > - tablist = [] + let buflist = [] for i in range(tabpagenr('$')) - call extend(tablist, tabpagebuflist(i + 1)) + call extend(buflist, tabpagebuflist(i + 1)) endfor < Note that a buffer may appear in more than one window. @@ -5737,8 +5955,9 @@ If there are no matching tags, then an empty list is returned. To get an exact tag match, the anchors '^' and '$' should be - used in {expr}. Refer to |tag-regexp| for more information - about the tag search regular expression pattern. + used in {expr}. This also make the function work faster. + Refer to |tag-regexp| for more information about the tag + search regular expression pattern. Refer to |'tags'| for information about how the tags file is located by Vim. Refer to |tags-file-format| for the format of @@ -5839,6 +6058,8 @@ the undo file exists. {name} is always expanded to the full path, since that is what is used internally. + If {name} is empty undofile() returns an empty string, since a + buffer without a file name will not write an undo file. Useful in combination with |:wundo| and |:rundo|. When compiled without the +persistent_undo option this always returns an empty string. @@ -5898,13 +6119,13 @@ would be of unlimited width. When there is a at the position, the returned Number will be the column at the end of the . For example, for a in column 1, with 'ts' - set to 8, it returns 8. + set to 8, it returns 8. |conceal| is ignored. For the byte position use |col()|. For the use of {expr} see |col()|. When 'virtualedit' is used {expr} can be [lnum, col, off], where "off" is the offset in screen columns from the start of the character. E.g., a position within a or after the last - character. + character. When "off" is omitted zero is used. When Virtual editing is active in the current mode, a position beyond the end of the line can be returned. |'virtualedit'| The accepted positions are: @@ -5947,6 +6168,18 @@ Dictionary or Float is not a Number or String, thus does not cause the mode to be cleared. +wildmenumode() *wildmenumode()* + Returns non-zero when the wildmenu is active and zero + otherwise. See 'wildmenu' and 'wildmode'. + This can be used in mappings to handle the 'wildcharm' option + gracefully. (Makes only sense with |mapmode-c| mappings). + + For example to make work like in wildmode, use: > + :cnoremap wildmenumode() ? "\\" : "\" +< + (Note, this needs the 'wildcharm' option set appropriately). + + *winbufnr()* winbufnr({nr}) The result is a Number, which is the number of the buffer associated with window {nr}. When {nr} is zero, the number of @@ -5979,8 +6212,9 @@ winnr([{arg}]) The result is a Number, which is the number of the current window. The top window has number 1. When the optional argument is "$", the number of the - last window is returned (the window count). - When the optional argument is "#", the number of the last + last window is returned (the window count). > + let window_count = winnr('$') +< When the optional argument is "#", the number of the last accessed window is returned (where |CTRL-W_p| goes to). If there is no previous window or it is in another tab page 0 is returned. @@ -6056,8 +6290,16 @@ To copy a file byte for byte: > :let fl = readfile("foo", "b") :call writefile(fl, "foocopy", "b") + + +xor({expr}, {expr}) *xor()* + Bitwise XOR on the two arguments. The arguments are converted + to a number. A List, Dict or Float argument causes an error. + Example: > + :let bits = xor(bits, 0x80) < + *feature-list* There are three types of features: 1. Features that are only supported when they have been enabled when Vim @@ -6084,6 +6326,7 @@ beos BeOS version of Vim. browse Compiled with |:browse| support, and browse() will work. +browsefilter Compiled with support for |browsefilter|. builtin_terms Compiled with some builtin terminals. byte_offset Compiled with support for 'o' in 'statusline' cindent Compiled with 'cindent' support. @@ -6093,17 +6336,17 @@ cmdline_hist Compiled with |cmdline-history| support. cmdline_info Compiled with 'showcmd' and 'ruler' support. comments Compiled with |'comments'| support. +compatible Compiled to be very Vi compatible. cryptv Compiled with encryption support |encryption|. cscope Compiled with |cscope| support. -compatible Compiled to be very Vi compatible. debug Compiled with "DEBUG" defined. dialog_con Compiled with console dialog support. dialog_gui Compiled with GUI dialog support. diff Compiled with |vimdiff| and 'diff' support. digraphs Compiled with support for digraphs. dnd Compiled with support for the "~ register |quote_~|. -dos32 32 bits DOS (DJGPP) version of Vim. dos16 16 bits DOS version of Vim. +dos32 32 bits DOS (DJGPP) version of Vim. ebcdic Compiled on a machine with ebcdic character set. emacs_tags Compiled with support for Emacs tags. eval Compiled with expression evaluation support. Always @@ -6126,15 +6369,15 @@ gettext Compiled with message translation |multi-lang| gui Compiled with GUI enabled. gui_athena Compiled with Athena GUI. +gui_gnome Compiled with Gnome support (gui_gtk is also defined). gui_gtk Compiled with GTK+ GUI (any version). gui_gtk2 Compiled with GTK+ 2 GUI (gui_gtk is also defined). -gui_gnome Compiled with Gnome support (gui_gtk is also defined). gui_mac Compiled with Macintosh GUI. gui_motif Compiled with Motif GUI. gui_photon Compiled with Photon GUI. +gui_running Vim is running in the GUI, or it will start soon. gui_win32 Compiled with MS Windows Win32 GUI. gui_win32s idem, and Win32s system being used (Windows 3.1) -gui_running Vim is running in the GUI, or it will start soon. hangul_input Compiled with Hangul input support. |hangul| iconv Can use iconv() for conversion. insert_expand Compiled with support for CTRL-X expansion commands in @@ -6156,30 +6399,32 @@ mksession Compiled with support for |:mksession|. modify_fname Compiled with file name modifiers. |filename-modifiers| mouse Compiled with support mouse. -mouseshape Compiled with support for 'mouseshape'. mouse_dec Compiled with support for Dec terminal mouse. mouse_gpm Compiled with support for gpm (Linux console mouse) mouse_netterm Compiled with support for netterm mouse. mouse_pterm Compiled with support for qnx pterm mouse. mouse_sysmouse Compiled with support for sysmouse (*BSD console mouse) +mouse_sgr Compiled with support for sgr mouse. +mouse_urxvt Compiled with support for urxvt mouse. mouse_xterm Compiled with support for xterm mouse. +mouseshape Compiled with support for 'mouseshape'. multi_byte Compiled with support for 'encoding' multi_byte_encoding 'encoding' is set to a multi-byte encoding. multi_byte_ime Compiled with support for IME input method. multi_lang Compiled with support for multiple languages. mzscheme Compiled with MzScheme interface |mzscheme|. -netbeans_intg Compiled with support for |netbeans|. netbeans_enabled Compiled with support for |netbeans| and connected. +netbeans_intg Compiled with support for |netbeans|. ole Compiled with OLE automation support for Win32. os2 OS/2 version of Vim. -osfiletype Compiled with support for osfiletypes |+osfiletype| path_extra Compiled with up/downwards search in 'path' and 'tags' perl Compiled with Perl interface. persistent_undo Compiled with support for persistent undo history. postscript Compiled with PostScript file printing. printer Compiled with |:hardcopy| support. profile Compiled with |:profile| support. -python Compiled with Python interface. +python Compiled with Python 2.x interface. |has-python| +python3 Compiled with Python 3.x interface. |has-python| qnx QNX version of Vim. quickfix Compiled with |quickfix| support. reltime Compiled with |reltime()| support. @@ -6190,11 +6435,11 @@ signs Compiled with |:sign| support. smartindent Compiled with 'smartindent' support. sniff Compiled with SNiFF interface support. +spell Compiled with spell checking support |spell|. startuptime Compiled with |--startuptime| support. statusline Compiled with support for 'statusline', 'rulerformat' and special formats of 'titlestring' and 'iconstring'. sun_workshop Compiled with support for Sun |workshop|. -spell Compiled with spell checking support |spell|. syntax Compiled with syntax highlighting support |syntax|. syntax_items There are active syntax highlighting items for the current buffer. @@ -6215,9 +6460,9 @@ toolbar Compiled with support for |gui-toolbar|. unix Unix version of Vim. user_commands User-defined commands. -viminfo Compiled with viminfo support. -vim_starting True while initial source'ing takes place. vertsplit Compiled with vertically split windows |:vsplit|. +vim_starting True while initial source'ing takes place. |startup| +viminfo Compiled with viminfo support. virtualedit Compiled with 'virtualedit' option. visual Compiled with Visual mode. visualextra Compiled with extra Visual mode commands. @@ -6226,16 +6471,18 @@ vreplace Compiled with |gR| and |gr| commands. wildignore Compiled with 'wildignore' option. wildmenu Compiled with 'wildmenu' option. -windows Compiled with support for more than one window. -winaltkeys Compiled with 'winaltkeys' option. win16 Win16 version of Vim (MS-Windows 3.1). -win32 Win32 version of Vim (MS-Windows 95/98/ME/NT/2000/XP). -win64 Win64 version of Vim (MS-Windows 64 bit). +win32 Win32 version of Vim (MS-Windows 95 and later, 32 or + 64 bits) win32unix Win32 version of Vim, using Unix files (Cygwin) +win64 Win64 version of Vim (MS-Windows 64 bit). win95 Win32 version for MS-Windows 95/98/ME. +winaltkeys Compiled with 'winaltkeys' option. +windows Compiled with support for more than one window. writebackup Compiled with 'writebackup' default on. xfontset Compiled with X fontset support |xfontset|. xim Compiled with X input method support |xim|. +xpm_w32 Compiled with pixmap support for Win32. xsmp Compiled with X session management support. xsmp_interact Compiled with interactive X session management support. xterm_clipboard Compiled with support for xterm clipboard. @@ -6308,7 +6555,7 @@ < See |:verbose-cmd| for more information. - *E124* *E125* + *E124* *E125* *E853* :fu[nction][!] {name}([arguments]) [range] [abort] [dict] Define a new function by the name {name}. The name must be made of alphanumeric characters and '_', and @@ -6338,6 +6585,8 @@ is excluded, ":{range}call" will call the function for each line in the range, with the cursor on the start of each line. See |function-range-example|. + The cursor is still moved to the first line of the + range, as is the case with all Ex commands. When the [abort] argument is added, the function will abort as soon as an error is detected. @@ -6569,9 +6818,9 @@ ============================================================================== 6. Curly braces names *curly-braces-names* -Wherever you can use a variable, you can use a "curly braces name" variable. -This is a regular variable name with one or more expressions wrapped in braces -{} like this: > +In most places where you can use a variable, you can use a "curly braces name" +variable. This is a regular variable name with one or more expressions +wrapped in braces {} like this: > my_{adjective}_variable When Vim encounters this, it evaluates the expression inside the braces, puts @@ -6607,6 +6856,11 @@ This would call the function "my_func_whizz(parameter)". +This does NOT work: > + :let i = 3 + :let @{i} = '' " error + :echo @{i} " error + ============================================================================== 7. Commands *expression-commands* @@ -6741,7 +6995,8 @@ :let [{name}, ..., ; {lastname}] -= {expr1} Like above, but append/add/subtract the value for each |List| item. - *E106* + + *E121* :let {var-name} .. List the value of variable {var-name}. Multiple variable names may be given. Special names recognized here: *E738* @@ -7027,7 +7282,9 @@ is terminated. Example: > :try | throw "oops" | catch /^oo/ | echo "caught" | endtry -< +< Note that "catch" may need to be on a separate line + for when an error causes the parsing to skip the whole + line and not see the "|" that separates the commands. *:ec* *:echo* :ec[ho] {expr1} .. Echoes each {expr1}, with a space in between. The diff -Naur vim73.orig/runtime/doc/evim-fr.1 vim73/runtime/doc/evim-fr.1 --- vim73.orig/runtime/doc/evim-fr.1 2010-05-15 11:04:00.000000000 +0000 +++ vim73/runtime/doc/evim-fr.1 2013-06-07 17:07:08.552317586 +0000 @@ -1,4 +1,4 @@ -.TH EVIM 1 "16 fvrier 2002 February 16" +.TH EVIM 1 "16 fvrier 2002" .SH NAME evim \- Easy Vim , dite un fichier avec Vim sans utiliser les modes .SH SYNOPSIS @@ -54,3 +54,4 @@ .SH TRADUCTION Cette page de manuel a t traduite David Blanchet. 2005-03-26. +Mise jour 2013-05-10, Dominique Pell diff -Naur vim73.orig/runtime/doc/evim-fr.UTF-8.1 vim73/runtime/doc/evim-fr.UTF-8.1 --- vim73.orig/runtime/doc/evim-fr.UTF-8.1 2010-05-15 11:04:00.000000000 +0000 +++ vim73/runtime/doc/evim-fr.UTF-8.1 2013-06-07 17:07:08.558984234 +0000 @@ -1,4 +1,4 @@ -.TH EVIM 1 "16 février 2002 February 16" +.TH EVIM 1 "16 février 2002" .SH NAME evim \- « Easy Vim », édite un fichier avec Vim sans utiliser les modes .SH SYNOPSIS @@ -54,3 +54,4 @@ .SH TRADUCTION Cette page de manuel a été traduite David Blanchet. 2005-03-26. +Mise à jour 2013-05-10, Dominique Pellé diff -Naur vim73.orig/runtime/doc/filetype.txt vim73/runtime/doc/filetype.txt --- vim73.orig/runtime/doc/filetype.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/filetype.txt 2013-06-07 17:07:08.652317301 +0000 @@ -1,4 +1,4 @@ -*filetype.txt* For Vim version 7.3. Last change: 2008 Jul 15 +*filetype.txt* For Vim version 7.3. Last change: 2013 May 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -270,6 +270,9 @@ *autocmd-osfiletypes* +NOTE: this code is currently disabled, as the RISC OS implementation was +removed. In the future this will use the 'filetype' option. + On operating systems which support storing a file type with the file, you can specify that an autocommand should only be executed if the file is of a certain type. @@ -296,8 +299,6 @@ This will match files of type "&fff" whose names start with "diff". -Note that osfiletype checking is skipped if Vim is compiled without the -|+osfiletype| feature. *plugin-details* The "plugin" directory can be in any of the directories in the 'runtimepath' @@ -602,7 +603,7 @@ file: |ft_sql.txt|. -TEX *ft-tex-plugin* +TEX *ft-tex-plugin* *g:tex_flavor* If the first line of a *.tex file has the form > %& diff -Naur vim73.orig/runtime/doc/fold.txt vim73/runtime/doc/fold.txt --- vim73.orig/runtime/doc/fold.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/fold.txt 2013-06-07 17:07:08.665650596 +0000 @@ -60,7 +60,7 @@ The nesting of folds is limited with 'foldnestmax'. Some lines are ignored and get the fold level of the line above or below it, -whatever is the lowest. These are empty or white lines and lines starting +whichever is lower. These are empty or white lines and lines starting with a character in 'foldignore'. White space is skipped before checking for characters in 'foldignore'. For C use "#" to ignore preprocessor lines. diff -Naur vim73.orig/runtime/doc/ft_ada.txt vim73/runtime/doc/ft_ada.txt --- vim73.orig/runtime/doc/ft_ada.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/ft_ada.txt 2013-06-07 17:07:08.678983891 +0000 @@ -6,20 +6,20 @@ ADA *ada.vim* 1. Syntax Highlighting |ft-ada-syntax| -2. Plug-in |ft-ada-plugin| +2. File type Plug-in |ft-ada-plugin| 3. Omni Completion |ft-ada-omni| 3.1 Omni Completion with "gnat xref" |gnat-xref| 3.2 Omni Completion with "ctags" |ada-ctags| 4. Compiler Support |ada-compiler| 4.1 GNAT |compiler-gnat| - 4.1 Dec Ada |compiler-decada| + 4.2 Dec Ada |compiler-decada| 5. References |ada-reference| 5.1 Options |ft-ada-options| - 5.2 Functions |ft-ada-functions| - 5.3 Commands |ft-ada-commands| - 5.4 Variables |ft-ada-variables| - 5.5 Constants |ft-ada-constants| -8. Extra Plug-ins |ada-extra-plugins| + 5.2 Commands |ft-ada-commands| + 5.3 Variables |ft-ada-variables| + 5.4 Constants |ft-ada-constants| + 5.5 Functions |ft-ada-functions| +6. Extra Plug-ins |ada-extra-plugins| ============================================================================== 1. Syntax Highlighting ~ @@ -139,7 +139,7 @@ support yet. ============================================================================== -4. Compiler Support ~ +4. Compiler Support ~ *ada-compiler* The Ada mode supports more than one Ada compiler and will automatically load the @@ -367,7 +367,7 @@ makes no difference. ------------------------------------------------------------------------------ -5.3 Commands ~ +5.2 Commands ~ *ft-ada-commands* :AdaRainbow *:AdaRainbow* @@ -445,7 +445,7 @@ for Ctags generates. ------------------------------------------------------------------------------ -5.2 Functions ~ +5.5 Functions ~ *ft-ada-functions* ada#Word([{line}, {col}]) *ada#Word()* @@ -479,7 +479,7 @@ ============================================================================== -8. Extra Plugins ~ +6. Extra Plugins ~ *ada-extra-plugins* You can optionally install the following extra plug-ins. They work well with diff -Naur vim73.orig/runtime/doc/ft_sql.txt vim73/runtime/doc/ft_sql.txt --- vim73.orig/runtime/doc/ft_sql.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/ft_sql.txt 2013-06-07 17:07:08.692317187 +0000 @@ -1,4 +1,4 @@ -*ft_sql.txt* For Vim version 7.3. Last change: 2010 Jul 20 +*ft_sql.txt* For Vim version 7.3. Last change: 2013 May 15 by David Fishburn @@ -349,6 +349,7 @@ The static maps (which are based on the syntax highlight groups) follow this format: > imap k :call sqlcomplete#Map('sqlKeyword') + imap k :call sqlcomplete#Map('sqlKeyword\w*') This command breaks down as: > imap - Create an insert map @@ -369,6 +370,9 @@ command while editing a SQL file. 'sqlKeyword' - Display the items for the sqlKeyword highlight group + 'sqlKeyword\w*' - A second option available with Vim 7.4 which + uses a regular expression to determine which + syntax groups to use ) - Execute the :let command - Trigger the standard omni completion key stroke. Passing in 'sqlKeyword' instructs the SQL @@ -435,7 +439,7 @@ of columns, you can press , this will replace the column list with the list of tables. - This allows you to quickly drill down into a - table to view it's columns and back again. + table to view its columns and back again. - and can be also be chosen via your |.vimrc| > let g:ftplugin_sql_omni_key_right = '' @@ -645,7 +649,7 @@ - When completing tables, procedure or views and using dbext.vim 3.00 or higher the list of objects will also include the owner name. When completing these objects and omni_sql_include_owner is enabled - the owner name will be be replaced. > + the owner name will be replaced. > omni_sql_precache_syntax_groups < - Default: diff -Naur vim73.orig/runtime/doc/gui.txt vim73/runtime/doc/gui.txt --- vim73.orig/runtime/doc/gui.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/gui.txt 2013-06-07 17:07:08.705650482 +0000 @@ -1,4 +1,4 @@ -*gui.txt* For Vim version 7.3. Last change: 2010 May 14 +*gui.txt* For Vim version 7.3. Last change: 2011 Jul 22 VIM REFERENCE MANUAL by Bram Moolenaar @@ -147,6 +147,15 @@ If you are running the X Window System, you can get information about the window Vim is running in with this command: > :!xwininfo -id $WINDOWID +< + *gui-IME* *iBus* +Input methods for international characters in X that rely on the XIM +framework, most notably iBus, have been known to produce undesirable results +in gVim. These may include an inability to enter spaces, or long delays +between typing a character and it being recognized by the application. + +One workaround that has been successful, for unknown reasons, is to prevent +gvim from forking into the background by starting it with the |-f| argument. ============================================================================== 2. Scrollbars *gui-scrollbars* @@ -156,26 +165,26 @@ The interface looks like this (with ":set guioptions=mlrb"): - +------------------------------+ - | File Edit Help | <- Menu bar (m) - +-+--------------------------+-+ - |^| |^| - |#| Text area. |#| - | | | | - |v|__________________________|v| - Normal status line -> |-+ File.c 5,2 +-| - between Vim windows |^|""""""""""""""""""""""""""|^| - | | | | - | | Another file buffer. | | - | | | | - |#| |#| - Left scrollbar (l) -> |#| |#| <- Right - |#| |#| scrollbar (r) - | | | | - |v| |v| - +-+--------------------------+-+ - | |< #### >| | <- Bottom - +-+--------------------------+-+ scrollbar (b) + +------------------------------+ ` + | File Edit Help | <- Menu bar (m) ` + +-+--------------------------+-+ ` + |^| |^| ` + |#| Text area. |#| ` + | | | | ` + |v|__________________________|v| ` + Normal status line -> |-+ File.c 5,2 +-| ` + between Vim windows |^|""""""""""""""""""""""""""|^| ` + | | | | ` + | | Another file buffer. | | ` + | | | | ` + |#| |#| ` + Left scrollbar (l) -> |#| |#| <- Right ` + |#| |#| scrollbar (r) ` + | | | | ` + |v| |v| ` + +-+--------------------------+-+ ` + | |< #### >| | <- Bottom ` + +-+--------------------------+-+ scrollbar (b) ` Any of the scrollbar or menu components may be turned off by not putting the appropriate letter in the 'guioptions' string. The bottom scrollbar is diff -Naur vim73.orig/runtime/doc/gui_w16.txt vim73/runtime/doc/gui_w16.txt --- vim73.orig/runtime/doc/gui_w16.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/gui_w16.txt 2013-06-07 17:07:08.715650453 +0000 @@ -16,7 +16,7 @@ Other relevant documentation: |gui.txt| For generic items of the GUI. -|os_msdos.txt| For items common to DOS and Windows. +|os_msdos.txt| For items common to DOS and Windows. |gui_w32.txt| Some items here are also applicable to the Win16 version. {Vi does not have a Windows GUI} diff -Naur vim73.orig/runtime/doc/gui_w32.txt vim73/runtime/doc/gui_w32.txt --- vim73.orig/runtime/doc/gui_w32.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/gui_w32.txt 2013-06-07 17:07:08.755650339 +0000 @@ -1,4 +1,4 @@ -*gui_w32.txt* For Vim version 7.3. Last change: 2007 Aug 30 +*gui_w32.txt* For Vim version 7.3. Last change: 2012 Aug 04 VIM REFERENCE MANUAL by Bram Moolenaar @@ -17,7 +17,7 @@ Other relevant documentation: |gui.txt| For generic items of the GUI. -|os_win32.txt| For Win32 specific items. +|os_win32.txt| For Win32 specific items. {Vi does not have a Windows GUI} @@ -137,6 +137,9 @@ And if there already is a gvim running: "Edit with existing gvim" -- edit the file with the running gvim +The "edit with existing Vim" entries can be disabled by adding an entry in the +registry under HKLM\Software\Vim\Gvim, named DisableEditWithExisting, and with +any value. *install-registry* You can add the "Edit with Vim" menu entry in an easy way by using the "install.exe" program. It will add several registry entries for you. @@ -293,7 +296,9 @@ sense for most shell commands which produce output for Vim to use). If you want Vim to start a program and return immediately, you can use the following syntax on W95 & NT: > - :!start {command} + :!start [/min] {command} +The optional "/min" causes the window to be minimized. + On Win32s, you will have to go to another window instead. Don't forget that you must tell Windows 3.1x to keep executing a DOS command in the background while you switch back to Vim. @@ -484,4 +489,16 @@ And add gvim to the list of applications. This problem only appears to happen with the Intellimouse driver 2.2 and when "Universal Scrolling" is turned on. + +XPM support *w32-xpm-support* + +Gvim can be build on MS-Windows with support for XPM files. |+xpm_w32| +See the Make_mvc.mak file for instructions, search for XPM. + +To try out if XPM support works do this: > + :help + :exe 'sign define vimxpm icon=' . $VIMRUNTIME . '\\vim16x16.xpm' + :exe 'sign place 1 line=1 name=vimxpm file=' . expand('%:p') +< + vim:tw=78:sw=4:ts=8:ft=help:norl: diff -Naur vim73.orig/runtime/doc/gui_x11.txt vim73/runtime/doc/gui_x11.txt --- vim73.orig/runtime/doc/gui_x11.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/gui_x11.txt 2013-06-07 17:07:08.765650311 +0000 @@ -1,4 +1,4 @@ -*gui_x11.txt* For Vim version 7.3. Last change: 2010 Jul 20 +*gui_x11.txt* For Vim version 7.3. Last change: 2011 Sep 14 VIM REFERENCE MANUAL by Bram Moolenaar @@ -53,6 +53,8 @@ ":gui -b". "gvim --nofork" does the same as "gvim -f". + *E851* *E852* +When starting the GUI fails Vim will try to continue running in the terminal. If you want the GUI to run in the foreground always, include the 'f' flag in 'guioptions'. |-f|. diff -Naur vim73.orig/runtime/doc/hebrew.txt vim73/runtime/doc/hebrew.txt --- vim73.orig/runtime/doc/hebrew.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/hebrew.txt 2013-06-07 17:07:08.812316844 +0000 @@ -93,7 +93,7 @@ This is also the keymap when 'keymap=hebrew' is set. The advantage of 'keymap' is that it works properly when using UTF8, e.g. it inserts the correct characters; 'hkmap' does not. The 'keymap' keyboard can also - insert niqud and te`amim. To see what those mappings are,look at the + insert niqud and te`amim. To see what those mappings are, look at the keymap file 'hebrew.vim' etc. diff -Naur vim73.orig/runtime/doc/help.txt vim73/runtime/doc/help.txt --- vim73.orig/runtime/doc/help.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/help.txt 2013-06-07 17:07:08.822316815 +0000 @@ -1,4 +1,4 @@ -*help.txt* For Vim version 7.3. Last change: 2010 Jul 20 +*help.txt* For Vim version 7.3. Last change: 2012 Dec 06 VIM - main help file k @@ -195,12 +195,12 @@ *standard-plugin-list* Standard plugins ~ |pi_getscript.txt| Downloading latest version of Vim scripts -|pi_gzip.txt| Reading and writing compressed files -|pi_netrw.txt| Reading and writing files over a network -|pi_paren.txt| Highlight matching parens -|pi_tar.txt| Tar file explorer +|pi_gzip.txt| Reading and writing compressed files +|pi_netrw.txt| Reading and writing files over a network +|pi_paren.txt| Highlight matching parens +|pi_tar.txt| Tar file explorer |pi_vimball.txt| Create a self-installing Vim script -|pi_zip.txt| Zip archive explorer +|pi_zip.txt| Zip archive explorer LOCAL ADDITIONS: *local-additions* diff -Naur vim73.orig/runtime/doc/helphelp.txt vim73/runtime/doc/helphelp.txt --- vim73.orig/runtime/doc/helphelp.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/helphelp.txt 2013-06-07 17:07:08.842316758 +0000 @@ -1,4 +1,4 @@ -*helphelp.txt* For Vim version 7.3. Last change: 2010 Jul 29 +*helphelp.txt* For Vim version 7.3. Last change: 2012 Nov 28 VIM REFERENCE MANUAL by Bram Moolenaar @@ -7,7 +7,7 @@ Help on help files *helphelp* 1. Help commands |online-help| -2. Translating help files |help-translated| +2. Translated help files |help-translated| 3. Writing help files |help-writing| ============================================================================== @@ -188,17 +188,18 @@ Only for backwards compatibility. It now executes the ToolBar.FindHelp menu entry instead of using a builtin dialog. {only when compiled with |+GUI_GTK|} -< {not in Vi} + {not in Vi} *:helpt* *:helptags* *E154* *E150* *E151* *E152* *E153* *E670* :helpt[ags] [++t] {dir} Generate the help tags file(s) for directory {dir}. - All "*.txt" and "*.??x" files in the directory are - scanned for a help tag definition in between stars. - The "*.??x" files are for translated docs, they - generate the "tags-??" file, see |help-translated|. - The generated tags files are sorted. + All "*.txt" and "*.??x" files in the directory and + sub-directories are scanned for a help tag definition + in between stars. The "*.??x" files are for + translated docs, they generate the "tags-??" file, see + |help-translated|. The generated tags files are + sorted. When there are duplicates an error message is given. An existing tags file is silently overwritten. The optional "++t" argument forces adding the @@ -218,11 +219,12 @@ This is only available when compiled with the |+multi_lang| feature. At this moment translations are available for: - Chinese - multiple authors - French - translated by David Blanchet - Italian - translated by Antonio Colombo - Polish - translated by Mikolaj Machowski - Russian - translated by Vassily Ragosin + Chinese - multiple authors + French - translated by David Blanchet + Italian - translated by Antonio Colombo + Japanese - multiple authors + Polish - translated by Mikolaj Machowski + Russian - translated by Vassily Ragosin See the Vim website to find them: http://www.vim.org/translations.php A set of translated help files consists of these files: diff -Naur vim73.orig/runtime/doc/if_cscop.txt vim73/runtime/doc/if_cscop.txt --- vim73.orig/runtime/doc/if_cscop.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/if_cscop.txt 2013-06-07 17:07:08.862316701 +0000 @@ -1,4 +1,4 @@ -*if_cscop.txt* For Vim version 7.3. Last change: 2009 Mar 18 +*if_cscop.txt* For Vim version 7.3. Last change: 2011 Jun 12 VIM REFERENCE MANUAL by Andy Kahn @@ -112,8 +112,7 @@ :cscope add /projects/vim/cscope.out /usr/local/vim :cscope add cscope.out /usr/local/vim -C < - *cscope-find* *cs-find* - *E565* *E567* + *cscope-find* *cs-find* *E567* find : Query cscope. All cscope query options are available except option #5 ("Change this grep pattern"). @@ -198,7 +197,7 @@ USAGE :cs help - *E260* *E261* + *E261* kill : Kill a cscope connection (or kill all cscope connections). USAGE :cs kill {num|partial_name} @@ -265,13 +264,23 @@ :set cscopequickfix=s-,c-,d-,i-,t-,e- < *cscopetag* *cst* -If 'cscopetag' set, the commands ":tag" and CTRL-] as well as "vim -t" will -always use |:cstag| instead of the default :tag behavior. Effectively, by -setting 'cst', you will always search your cscope databases as well as your -tag files. The default is off. Examples: > +If 'cscopetag' is set, the commands ":tag" and CTRL-] as well as "vim -t" +will always use |:cstag| instead of the default :tag behavior. Effectively, +by setting 'cst', you will always search your cscope databases as well as +your tag files. The default is off. Examples: > :set cst :set nocst < + *cscoperelative* *csre* +If 'cscoperelative' is set, then in absence of a prefix given to cscope +(prefix is the argument of -P option of cscope), basename of cscope.out +location (usually the project root directory) will be used as the prefix +to construct an absolute path. The default is off. Note: This option is +only effective when cscope (cscopeprg) is initialized without a prefix +path (-P). Examples: > + :set csre + :set nocsre +< *cscopetagorder* *csto* The value of 'csto' determines the order in which |:cstag| performs a search. If 'csto' is set to zero, cscope database(s) are searched first, followed diff -Naur vim73.orig/runtime/doc/if_lua.txt vim73/runtime/doc/if_lua.txt --- vim73.orig/runtime/doc/if_lua.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/if_lua.txt 2013-06-07 17:07:08.868983349 +0000 @@ -1,4 +1,4 @@ -*if_lua.txt* For Vim version 7.3. Last change: 2010 Jul 22 +*if_lua.txt* For Vim version 7.3. Last change: 2012 Jun 29 VIM REFERENCE MANUAL by Luis Carvalho @@ -8,8 +8,11 @@ 1. Commands |lua-commands| 2. The vim module |lua-vim| -3. Buffer userdata |lua-buffer| -4. Window userdata |lua-window| +3. List userdata |lua-list| +4. Dict userdata |lua-dict| +5. Buffer userdata |lua-buffer| +6. Window userdata |lua-window| +7. The luaeval function |lua-luaeval| {Vi does not have any of these commands} @@ -56,13 +59,14 @@ < *:luado* -:[range]luado {body} Execute Lua function "function (line) {body} end" for - each line in the [range], with the function argument - being set to the text of each line in turn, without a - trailing . If the value returned by the function - is a string it becomes the text of the line in the - current turn. The default for [range] is the whole - file: "1,$". {not in Vi} +:[range]luado {body} Execute Lua function "function (line, linenr) {body} + end" for each line in the [range], with the function + argument being set to the text of each line in turn, + without a trailing , and the current line number. + If the value returned by the function is a string it + becomes the text of the line in the current turn. The + default for [range] is the whole file: "1,$". + {not in Vi} Examples: > @@ -88,11 +92,9 @@ All these commands execute a Lua chunk from either the command line (:lua and :luado) or a file (:luafile) with the given line [range]. Similarly to the Lua interpreter, each chunk has its own scope and so only global variables are -shared between command calls. Lua default libraries "table", "string", "math", -and "package" are available, "io" and "debug" are not, and "os" is restricted -to functions "date", "clock", "time", "difftime", and "getenv". In addition, -Lua "print" function has its output redirected to the Vim message area, with -arguments separated by a white space instead of a tab. +shared between command calls. All Lua default libraries are available. In +addition, Lua "print" function has its output redirected to the Vim message +area, with arguments separated by a white space instead of a tab. Lua uses the "vim" module (see |lua-vim|) to issue commands to Vim and manage buffers (|lua-buffer|) and windows (|lua-window|). However, @@ -108,9 +110,9 @@ module also includes routines for buffer, window, and current line queries, Vim evaluation and command execution, and others. - vim.isbuffer(value) Returns 'true' (boolean, not string) if - "value" is a buffer userdata and 'false' - otherwise (see |lua-buffer|). + vim.list() Returns an empty list (see |List|). + + vim.dict() Returns an empty dictionary (see |Dictionary|). vim.buffer([arg]) If "arg" is a number, returns buffer with number "arg" in the buffer list or, if "arg" @@ -121,16 +123,21 @@ 'true' returns the first buffer in the buffer list or else the current buffer. - vim.iswindow(value) Returns 'true' (boolean, not string) if - "value" is a window userdata and - 'false' otherwise (see |lua-window|). - vim.window([arg]) If "arg" is a number, returns window with number "arg" or 'nil' (nil value, not string) if not found. Otherwise, if "toboolean(arg)" is 'true' returns the first window or else the current window. + vim.type({arg}) Returns the type of {arg}. It is equivalent to + Lua's "type" function, but returns "list", + "dict", "buffer", or "window" if {arg} is a + list, dictionary, buffer, or window, + respectively. Examples: > + :lua l = vim.list() + :lua print(type(l), vim.type(l)) + :" userdata list +< vim.command({cmd}) Executes the vim (ex-mode) command {cmd}. Examples: > :lua vim.command"set tw=60" @@ -141,7 +148,7 @@ Vim strings and numbers are directly converted to Lua strings and numbers respectively. Vim lists and dictionaries are converted to Lua - tables (lists become integer-keyed tables). + userdata (see |lua-list| and |lua-dict|). Examples: > :lua tw = vim.eval"&tw" :lua print(vim.eval"{'a': 'one'}".a) @@ -157,7 +164,72 @@ ============================================================================== -3. Buffer userdata *lua-buffer* +3. List userdata *lua-list* + +List userdata represent vim lists, and the interface tries to follow closely +Vim's syntax for lists. Since lists are objects, changes in list references in +Lua are reflected in Vim and vice-versa. A list "l" has the following +properties and methods: + +Properties +---------- + o "#l" is the number of items in list "l", equivalent to "len(l)" + in Vim. + o "l[k]" returns the k-th item in "l"; "l" is zero-indexed, as in Vim. + To modify the k-th item, simply do "l[k] = newitem"; in + particular, "l[k] = nil" removes the k-th item from "l". + o "l()" returns an iterator for "l". + +Methods +------- + o "l:add(item)" appends "item" to the end of "l". + o "l:insert(item[, pos])" inserts "item" at (optional) + position "pos" in the list. The default value for "pos" is 0. + +Examples: +> + :let l = [1, 'item'] + :lua l = vim.eval('l') -- same 'l' + :lua l:add(vim.list()) + :lua l[0] = math.pi + :echo l[0] " 3.141593 + :lua l[0] = nil -- remove first item + :lua l:insert(true, 1) + :lua print(l, #l, l[0], l[1], l[-1]) + :lua for item in l() do print(item) end +< + +============================================================================== +4. Dict userdata *lua-dict* + +Similarly to list userdata, dict userdata represent vim dictionaries; since +dictionaries are also objects, references are kept between Lua and Vim. A dict +"d" has the following properties: + +Properties +---------- + o "#d" is the number of items in dict "d", equivalent to "len(d)" + in Vim. + o "d.key" or "d['key']" returns the value at entry "key" in "d". + To modify the entry at this key, simply do "d.key = newvalue"; in + particular, "d.key = nil" removes the entry from "d". + o "d()" returns an iterator for "d" and is equivalent to "items(d)" in + Vim. + +Examples: +> + :let d = {'n':10} + :lua d = vim.eval('d') -- same 'd' + :lua print(d, d.n, #d) + :let d.self = d + :lua for k, v in d() do print(d, k, v) end + :lua d.x = math.pi + :lua d.self = nil -- remove entry + :echo d +< + +============================================================================== +5. Buffer userdata *lua-buffer* Buffer userdata represent vim buffers. A buffer userdata "b" has the following properties and methods: @@ -209,7 +281,7 @@ < ============================================================================== -4. Window userdata *lua-window* +6. Window userdata *lua-window* Window objects represent vim windows. A window userdata "w" has the following properties and methods: @@ -241,4 +313,29 @@ < ============================================================================== - vim:tw=78:ts=8:ft=help:norl: +7. The luaeval function *lua-luaeval* *lua-eval* + +The (dual) equivalent of "vim.eval" for passing Lua values to Vim is +"luaeval". "luaeval" takes an expression string and an optional argument and +returns the result of the expression. It is semantically equivalent in Lua to: +> + local chunkheader = "local _A = select(1, ...) return " + function luaeval (expstr, arg) + local chunk = assert(loadstring(chunkheader .. expstr, "luaeval")) + return chunk(arg) -- return typval + end +< +Note that "_A" receives the argument to "luaeval". Examples: > + + :echo luaeval('math.pi') + :lua a = vim.list():add('newlist') + :let a = luaeval('a') + :echo a[0] " 'newlist' + :function Rand(x,y) " random uniform between x and y + : return luaeval('(_A.y-_A.x)*math.random()+_A.x', {'x':a:x,'y':a:y}) + : endfunction + :echo Rand(1,10) + + +============================================================================== + vim:tw=78:ts=8:noet:ft=help:norl: diff -Naur vim73.orig/runtime/doc/if_mzsch.txt vim73/runtime/doc/if_mzsch.txt --- vim73.orig/runtime/doc/if_mzsch.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/if_mzsch.txt 2013-06-07 17:07:08.878983320 +0000 @@ -1,4 +1,4 @@ -*if_mzsch.txt* For Vim version 7.3. Last change: 2010 Feb 11 +*if_mzsch.txt* For Vim version 7.3. Last change: 2012 Dec 17 VIM REFERENCE MANUAL by Sergey Khorev @@ -11,7 +11,8 @@ 3. Threads |mzscheme-threads| 4. Vim access from MzScheme |mzscheme-vim| 5. mzeval() Vim function |mzscheme-mzeval| -6. Dynamic loading |mzscheme-dynamic| +6. Using Function references |mzscheme-funcref| +7. Dynamic loading |mzscheme-dynamic| {Vi does not have any of these commands} @@ -21,10 +22,17 @@ Based on the work of Brent Fulgham. Dynamic loading added by Sergey Khorev -For downloading MzScheme and other info: - http://www.plt-scheme.org/software/mzscheme/ +MzScheme and PLT Scheme names have been rebranded as Racket. For more +information please check http://racket-lang.org -Note: On FreeBSD you should use the "drscheme" port. +Futures and places of Racket version 5.x up to and including 5.3.1 do not +work correctly with processes created by Vim. +The simplest solution is to build Racket on your own with these features +disabled: > + ./configure --disable-futures --disable-places --prefix=your-install-prefix + +To speed up the process, you might also want to use --disable-gracket and +--disable-docs ============================================================================== 1. Commands *mzscheme-commands* @@ -155,8 +163,11 @@ (eval {expr-string}) Evaluate the vim expression into respective MzScheme object: |Lists| are represented as Scheme lists, - |Dictionaries| as hash tables. - NOTE the name clashes with MzScheme eval + |Dictionaries| as hash tables, + |Funcref|s as functions (see also + |mzscheme-funcref|) + NOTE the name clashes with MzScheme eval, + use module qualifiers to overcome this. (range-start) Start/End of the range passed with (range-end) the Scheme command. (beep) beep @@ -237,7 +248,23 @@ evaluate MzScheme expressions and pass their values to VimL. ============================================================================== -6. Dynamic loading *mzscheme-dynamic* *E815* +6. Using Function references *mzscheme-funcref* + +MzScheme interface allows use of |Funcref|s so you can call Vim functions +directly from Scheme. For instance: > + function! MyAdd2(arg) + return a:arg + 2 + endfunction + mz (define f2 (vim-eval "function(\"MyAdd2\")")) + mz (f2 7) +< or : > + :mz (define indent (vim-eval "function('indent')")) + " return Vim indent for line 12 + :mz (indent 12) +< + +============================================================================== +7. Dynamic loading *mzscheme-dynamic* *E815* On MS-Windows the MzScheme libraries can be loaded dynamically. The |:version| output then includes |+mzscheme/dyn|. diff -Naur vim73.orig/runtime/doc/if_perl.txt vim73/runtime/doc/if_perl.txt --- vim73.orig/runtime/doc/if_perl.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/if_perl.txt 2013-06-07 17:07:08.902316587 +0000 @@ -1,4 +1,4 @@ -*if_perl.txt* For Vim version 7.3. Last change: 2010 Jul 21 +*if_perl.txt* For Vim version 7.3. Last change: 2012 Oct 25 VIM REFERENCE MANUAL by Sven Verdoolaege @@ -44,15 +44,17 @@ Sven Verdoolaege Matt Gerassimof -Perl for MS-Windows can be found at: -http://www.perl.com/CPAN/ports/nt/Standard/x86/ +Perl for MS-Windows can be found at: http://www.perl.com/ +The ActiveState one should work. ============================================================================== 3. Using the Perl interface *perl-using* *:perl* *:pe* :pe[rl] {cmd} Execute Perl command {cmd}. The current package - is "main". + is "main". Simple example to test if `:perl` is + working: > + :perl VIM::Msg("Hello") :pe[rl] << {endpattern} {script} @@ -173,7 +175,8 @@ VIM::DoCommand({cmd}) Executes Ex command {cmd}. *perl-Eval* -VIM::Eval({expr}) Evaluates {expr} and returns (success, val). +VIM::Eval({expr}) Evaluates {expr} and returns (success, value) in list + context or just value in scalar context. success=1 indicates that val contains the value of {expr}; success=0 indicates a failure to evaluate the expression. '@x' returns the contents of register diff -Naur vim73.orig/runtime/doc/if_pyth.txt vim73/runtime/doc/if_pyth.txt --- vim73.orig/runtime/doc/if_pyth.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/if_pyth.txt 2013-06-07 17:07:08.912316559 +0000 @@ -1,4 +1,4 @@ -*if_pyth.txt* For Vim version 7.3. Last change: 2010 Aug 13 +*if_pyth.txt* For Vim version 7.3. Last change: 2013 Jun 02 VIM REFERENCE MANUAL by Paul Moore @@ -6,13 +6,16 @@ The Python Interface to Vim *python* *Python* -1. Commands |python-commands| -2. The vim module |python-vim| -3. Buffer objects |python-buffer| -4. Range objects |python-range| -5. Window objects |python-window| -6. Dynamic loading |python-dynamic| -7. Python 3 |python3| +1. Commands |python-commands| +2. The vim module |python-vim| +3. Buffer objects |python-buffer| +4. Range objects |python-range| +5. Window objects |python-window| +6. Tab page objects |python-tabpage| +7. vim.bindeval objects |python-bindeval-objects| +8. pyeval(), py3eval() Vim functions |python-pyeval| +9. Dynamic loading |python-dynamic| +10. Python 3 |python3| {Vi does not have any of these commands} @@ -26,7 +29,9 @@ *:python* *:py* *E205* *E263* *E264* :[range]py[thon] {stmt} - Execute Python statement {stmt}. + Execute Python statement {stmt}. A simple check if + the `:python` command is working: > + :python print "Hello" :[range]py[thon] << {endmarker} {script} @@ -51,9 +56,25 @@ EOF endfunction < -Note: Python is very sensitive to the indenting. Also make sure the "class" -line and "EOF" do not have any indent. +Note: Python is very sensitive to the indenting. Make sure the "class" line +and "EOF" do not have any indent. + *:pydo* +:[range]pydo {body} Execute Python function "def _vim_pydo(line, linenr): + {body}" for each line in the [range], with the + function arguments being set to the text of each line + in turn, without a trailing , and the current + line number. The function should return a string or + None. If a string is returned, it becomes the text of + the line in the current turn. The default for [range] + is the whole file: "1,$". + {not in Vi} + +Examples: +> + :pydo return "%s\t%d" % (line[::-1], len(line)) + :pydo if line: return "%4d: %s" % (linenr, line) +< *:pyfile* *:pyf* :[range]pyf[ile] {file} Execute the Python script in {file}. The whole @@ -150,7 +171,21 @@ [{'cmd': '/^eval_expr(arg, nextcmd)$/', 'static': 0, 'name': 'eval_expr', 'kind': 'f', 'filename': './src/eval.c'}] - +vim.bindeval(str) *python-bindeval* + Like |python-eval|, but returns special objects described in + |python-bindeval-objects|. These python objects let you modify (|List| + or |Dictionary|) or call (|Funcref|) vim objects. + +vim.strwidth(str) *python-strwidth* + Like |strwidth()|: returns number of display cells str occupies, tab + is counted as one cell. + +vim.chdir(*args, **kwargs) *python-chdir* +vim.fchdir(*args, **kwargs) *python-fchdir* + Run os.chdir or os.fchdir, then all appropriate vim stuff. + Note: you should not use these functions directly, use os.chdir and + os.fchdir instead. Behavior of vim.fchdir is undefined in case + os.fchdir does not exist. Error object of the "vim" module @@ -170,12 +205,12 @@ to which the variables referred. vim.buffers *python-buffers* - A sequence object providing access to the list of vim buffers. The + A mapping object providing access to the list of vim buffers. The object supports the following operations: > :py b = vim.buffers[i] # Indexing (read-only) :py b in vim.buffers # Membership test :py n = len(vim.buffers) # Number of elements - :py for b in vim.buffers: # Sequential access + :py for b in vim.buffers: # Iterating over buffer list < vim.windows *python-windows* A sequence object providing access to the list of vim windows. The @@ -184,13 +219,28 @@ :py w in vim.windows # Membership test :py n = len(vim.windows) # Number of elements :py for w in vim.windows: # Sequential access +< Note: vim.windows object always accesses current tab page. + |python-tabpage|.windows objects are bound to parent |python-tabpage| + object and always use windows from that tab page (or throw vim.error + in case tab page was deleted). You can keep a reference to both + without keeping a reference to vim module object or |python-tabpage|, + they will not lose their properties in this case. + +vim.tabpages *python-tabpages* + A sequence object providing access to the list of vim tab pages. The + object supports the following operations: > + :py t = vim.tabpages[i] # Indexing (read-only) + :py t in vim.tabpages # Membership test + :py n = len(vim.tabpages) # Number of elements + :py for t in vim.tabpages: # Sequential access < vim.current *python-current* An object providing access (via specific attributes) to various "current" objects available in vim: vim.current.line The current line (RW) String - vim.current.buffer The current buffer (RO) Buffer - vim.current.window The current window (RO) Window + vim.current.buffer The current buffer (RW) Buffer + vim.current.window The current window (RW) Window + vim.current.tabpage The current tab page (RW) TabPage vim.current.range The current line range (RO) Range The last case deserves a little explanation. When the :python or @@ -198,6 +248,42 @@ "current range". A range is a bit like a buffer, but with all access restricted to a subset of lines. See |python-range| for more details. + Note: When assigning to vim.current.{buffer,window,tabpage} it expects + valid |python-buffer|, |python-window| or |python-tabpage| objects + respectively. Assigning triggers normal (with |autocommand|s) + switching to given buffer, window or tab page. It is the only way to + switch UI objects in python: you can't assign to + |python-tabpage|.window attribute. To switch without triggering + autocommands use > + py << EOF + saved_eventignore = vim.options['eventignore'] + vim.options['eventignore'] = 'all' + try: + vim.current.buffer = vim.buffers[2] # Switch to buffer 2 + finally: + vim.options['eventignore'] = saved_eventignore + EOF +< +vim.vars *python-vars* +vim.vvars *python-vvars* + Dictionary-like objects holding dictionaries with global (|g:|) and + vim (|v:|) variables respectively. Identical to `vim.bindeval("g:")`, + but faster. + +vim.options *python-options* + Object partly supporting mapping protocol (supports setting and + getting items) providing a read-write access to global options. + Note: unlike |:set| this provides access only to global options. You + cannot use this object to obtain or set local options' values or + access local-only options in any fashion. Raises KeyError if no global + option with such name exists (i.e. does not raise KeyError for + |global-local| options and global only options, but does for window- + and buffer-local ones). Use |python-buffer| objects to access to + buffer-local options and |python-window| objects to access to + window-local options. + + Type of this object is available via "Options" attribute of vim + module. Output from Python *python-output* Vim displays all Python code output in the Vim message area. Normal @@ -222,8 +308,9 @@ - from indexing vim.buffers (|python-buffers|) - from the "buffer" attribute of a window (|python-window|) -Buffer objects have one read-only attribute - name - the full file name for -the buffer. They also have three methods (append, mark, and range; see below). +Buffer objects have two read-only attributes - name - the full file name for +the buffer, and number - the buffer number. They also have three methods +(append, mark, and range; see below). You can also treat buffer objects as sequence objects. In this context, they act as if they were lists (yes, they are mutable) of strings, with each @@ -238,6 +325,24 @@ line numbers, which start from 1. This is particularly relevant when dealing with marks (see below) which use vim line numbers. +The buffer object attributes are: + b.vars Dictionary-like object used to access + |buffer-variable|s. + b.options Mapping object (supports item getting, setting and + deleting) that provides access to buffer-local options + and buffer-local values of |global-local| options. Use + |python-window|.options if option is window-local, + this object will raise KeyError. If option is + |global-local| and local value is missing getting it + will return None. + b.name String, RW. Contains buffer name (full path). + Note: when assigning to b.name |BufFilePre| and + |BufFilePost| autocommands are launched. + b.number Buffer number. Can be used as |python-buffers| key. + Read-only. + b.valid True or False. Buffer object becomes invalid when + corresponding buffer is wiped out. + The buffer object methods are: b.append(str) Append a line to the buffer b.append(str, nr) Idem, below line "nr" @@ -256,6 +361,8 @@ A trailing '\n' is allowed and ignored, so that you can do: > :py b.append(f.readlines()) +Buffer object type is available using "Buffer" attribute of vim module. + Examples (assume b is the current buffer) > :py print b.name # write the buffer file name :py b[0] = "hello!!!" # replace the top line @@ -267,6 +374,9 @@ :py n = len(b) # number of lines :py (row,col) = b.mark('a') # named mark :py r = b.range(1,5) # a sub-range of the buffer + :py b.vars["foo"] = "bar" # assign b:foo variable + :py b.options["ff"] = "dos" # set fileformat + :py del b.options["ar"] # same as :set autoread< ============================================================================== 4. Range objects *python-range* @@ -294,6 +404,8 @@ for Python's built-in list objects. r.append(list, nr) Idem, after line "nr" +Range object type is available using "Range" attribute of vim module. + Example (assume r is the current range): # Send all lines in a range to the default printer vim.command("%d,%dhardcopy!" % (r.start+1,r.end+1)) @@ -304,6 +416,8 @@ Window objects represent vim windows. You can obtain them in a number of ways: - via vim.current.window (|python-current|) - from indexing vim.windows (|python-windows|) + - from indexing "windows" attribute of a tab page (|python-tabpage|) + - from the "window" attribute of a tab page (|python-tabpage|) You can manipulate window objects only through their attributes. They have no methods, and no sequence or other interface. @@ -314,11 +428,167 @@ This is a tuple, (row,col). height (read-write) The window height, in rows width (read-write) The window width, in columns + vars (read-only) The window |w:| variables. Attribute is + unassignable, but you can change window + variables this way + options (read-only) The window-local options. Attribute is + unassignable, but you can change window + options this way. Provides access only to + window-local options, for buffer-local use + |python-buffer| and for global ones use + |python-options|. If option is |global-local| + and local value is missing getting it will + return None. + number (read-only) Window number. The first window has number 1. + This is zero in case it cannot be determined + (e.g. when the window object belongs to other + tab page). + row, col (read-only) On-screen window position in display cells. + First position is zero. + tabpage (read-only) Window tab page. + valid (read-write) True or False. Window object becomes invalid + when corresponding window is closed. + The height attribute is writable only if the screen is split horizontally. The width attribute is writable only if the screen is split vertically. +Window object type is available using "Window" attribute of vim module. + +============================================================================== +6. Tab page objects *python-tabpage* + +Tab page objects represent vim tab pages. You can obtain them in a number of +ways: + - via vim.current.tabpage (|python-current|) + - from indexing vim.tabpages (|python-tabpages|) + +You can use this object to access tab page windows. They have no methods and +no sequence or other interfaces. + +Tab page attributes are: + number The tab page number like the one returned by + |tabpagenr()|. + windows Like |python-windows|, but for current tab page. + vars The tab page |t:| variables. + window Current tabpage window. + valid True or False. Tab page object becomes invalid when + corresponding tab page is closed. + +TabPage object type is available using "TabPage" attribute of vim module. + +============================================================================== +7. vim.bindeval objects *python-bindeval-objects* + +vim.Dictionary object *python-Dictionary* + Dictionary-like object providing access to vim |Dictionary| type. + Attributes: + Attribute Description ~ + locked One of *python-.locked* + Value Description ~ + zero Variable is not locked + vim.VAR_LOCKED Variable is locked, but can be unlocked + vim.VAR_FIXED Variable is locked and can't be unlocked + Read-write. You can unlock locked variable by assigning + `True` or `False` to this attribute. No recursive locking + is supported. + scope One of + Value Description ~ + zero Dictionary is not a scope one + vim.VAR_DEF_SCOPE |g:| or |l:| dictionary + vim.VAR_SCOPE Other scope dictionary, + see |internal-variables| + Methods (note: methods do not support keyword arguments): + Method Description ~ + keys() Returns a list with dictionary keys. + values() Returns a list with dictionary values. + items() Returns a list of 2-tuples with dictionary contents. + update(iterable), update(dictionary), update(**kwargs) + Adds keys to dictionary. + get(key[, default=None]) + Obtain key from dictionary, returning the default if it is + not present. + pop(key[, default]) + Remove specified key from dictionary and return + corresponding value. If key is not found and default is + given returns the default, otherwise raises KeyError. + popitem() + Remove random key from dictionary and return (key, value) + pair. + has_key(key) + Check whether dictionary contains specified key, similar + to `key in dict`. + + __new__(), __new__(iterable), __new__(dictionary), __new__(update) + You can use `vim.Dictionary()` to create new vim + dictionaries. `d=vim.Dictionary(arg)` is the same as + `d=vim.bindeval('{}');d.update(arg)`. Without arguments + constructs empty dictionary. + + Examples: > + d = vim.Dictionary(food="bar") # Constructor + d['a'] = 'b' # Item assignment + print d['a'] # getting item + d.update({'c': 'd'}) # .update(dictionary) + d.update(e='f') # .update(**kwargs) + d.update((('g', 'h'), ('i', 'j'))) # .update(iterable) + for key in d.keys(): # .keys() + for val in d.values(): # .values() + for key, val in d.items(): # .items() + print isinstance(d, vim.Dictionary) # True + for key in d: # Iteration over keys + class Dict(vim.Dictionary): # Subclassing +< + Note: when iterating over keys you should not modify dictionary. + +vim.List object *python-List* + Sequence-like object providing access to vim |List| type. + Supports `.locked` attribute, see |python-.locked|. Also supports the + following methods: + Method Description ~ + extend(item) Add items to the list. + + __new__(), __new__(iterable) + You can use `vim.List()` to create new vim lists. + `l=vim.List(iterable)` is the same as + `l=vim.bindeval('[]');l.extend(iterable)`. Without + arguments constructs empty list. + Examples: > + l = vim.List("abc") # Constructor, result: ['a', 'b', 'c'] + l.extend(['abc', 'def']) # .extend() method + print l[1:] # slicing + l[:0] = ['ghi', 'jkl'] # slice assignment + print l[0] # getting item + l[0] = 'mno' # assignment + for i in l: # iteration + print isinstance(l, vim.List) # True + class List(vim.List): # Subclassing + +vim.Function object *python-Function* + Function-like object, acting like vim |Funcref| object. Supports `.name` + attribute and is callable. Accepts special keyword argument `self`, see + |Dictionary-function|. You can also use `vim.Function(name)` constructor, + it is the same as `vim.bindeval('function(%s)'%json.dumps(name))`. + + Examples: > + f = vim.Function('tr') # Constructor + print f('abc', 'a', 'b') # Calls tr('abc', 'a', 'b') + vim.command(''' + function DictFun() dict + return self + endfunction + ''') + f = vim.bindeval('function("DictFun")') + print f(self={}) # Like call('DictFun', [], {}) + print isinstance(f, vim.Function) # True + +============================================================================== +8. pyeval() and py3eval() Vim functions *python-pyeval* + +To facilitate bi-directional interface, you can use |pyeval()| and |py3eval()| +functions to evaluate Python expressions and pass their values to VimL. + ============================================================================== -6. Dynamic loading *python-dynamic* +9. Dynamic loading *python-dynamic* On MS-Windows the Python library can be loaded dynamically. The |:version| output then includes |+python/dyn|. @@ -335,12 +605,17 @@ sure edit "gvim.exe" and search for "python\d*.dll\c". ============================================================================== -7. Python 3 *python3* +10. Python 3 *python3* *:py3* *:python3* -The |:py3| and |:python3| commands work similar to |:python|. - *:py3file* -The |:py3file| command works similar to |:pyfile|. +The `:py3` and `:python3` commands work similar to `:python`. A simple check +if the `:py3` command is working: > + :py3 print("Hello") +< *:py3file* +The `:py3file` command works similar to `:pyfile`. + *:py3do* *E863* +The `:py3do` command works similar to `:pydo`. + Vim can be built in four ways (:version output): 1. No Python support (-python, -python3) @@ -355,7 +630,7 @@ When doing this on Linux/Unix systems and importing global symbols, this leads to a crash when the second Python version is used. So either global symbols are loaded but only one Python version is activated, or no global symbols are -loaded. The latter makes Python's "import" fail on libaries that expect the +loaded. The latter makes Python's "import" fail on libraries that expect the symbols to be provided by Vim. *E836* *E837* Vim's configuration script makes a guess for all libraries based on one @@ -377,6 +652,18 @@ 3. You undefine PY_NO_RTLD_GLOBAL in auto/config.h after configuration. This may crash Vim though. + *has-python* +You can test what Python version is available with: > + if has('python') + echo 'there is Python 2.x' + elseif has('python3') + echo 'there is Python 3.x' + endif + +Note however, that when Python 2 and 3 are both available and loaded +dynamically, these has() calls will try to load them. If only one can be +loaded at a time, just checking if Python 2 or 3 are available will prevent +the other one from being available. ============================================================================== vim:tw=78:ts=8:ft=help:norl: diff -Naur vim73.orig/runtime/doc/if_ruby.txt vim73/runtime/doc/if_ruby.txt --- vim73.orig/runtime/doc/if_ruby.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/if_ruby.txt 2013-06-07 17:07:08.922316530 +0000 @@ -1,4 +1,4 @@ -*if_ruby.txt* For Vim version 7.3. Last change: 2010 Jul 20 +*if_ruby.txt* For Vim version 7.3. Last change: 2012 Aug 02 VIM REFERENCE MANUAL by Shugo Maeda @@ -25,7 +25,8 @@ 1. Commands *ruby-commands* *:ruby* *:rub* -:rub[y] {cmd} Execute Ruby command {cmd}. +:rub[y] {cmd} Execute Ruby command {cmd}. A command to try it out: > + :ruby print "Hello" :rub[y] << {endpattern} {script} @@ -187,12 +188,12 @@ ============================================================================== 6. Dynamic loading *ruby-dynamic* -On MS-Windows the Ruby library can be loaded dynamically. The |:version| -output then includes |+ruby/dyn|. +On MS-Windows and Unix the Ruby library can be loaded dynamically. The +|:version| output then includes |+ruby/dyn|. -This means that Vim will search for the Ruby DLL file only when needed. When -you don't use the Ruby interface you don't need it, thus you can use Vim -without this DLL file. +This means that Vim will search for the Ruby DLL file or shared library only +when needed. When you don't use the Ruby interface you don't need it, thus +you can use Vim even though this library file is not on your system. You need to install the right version of Ruby for this to work. You can find the package to download from: @@ -208,6 +209,8 @@ If you want to build Vim with Ruby 1.9.1, you need to edit the config.h file and comment-out the check for _MSC_VER. +You may also need to rename the include directory name to match the version, +strangely for Ruby 1.9.3 the directory is called 1.9.1. ============================================================================== vim:tw=78:ts=8:ft=help:norl: diff -Naur vim73.orig/runtime/doc/if_tcl.txt vim73/runtime/doc/if_tcl.txt --- vim73.orig/runtime/doc/if_tcl.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/if_tcl.txt 2013-06-07 17:07:08.952316444 +0000 @@ -1,4 +1,4 @@ -*if_tcl.txt* For Vim version 7.3. Last change: 2008 Aug 16 +*if_tcl.txt* For Vim version 7.3. Last change: 2012 Aug 02 VIM REFERENCE MANUAL by Ingo Wilken @@ -27,7 +27,9 @@ 1. Commands *tcl-ex-commands* *E571* *E572* *:tcl* *:tc* -:tc[l] {cmd} Execute Tcl command {cmd}. +:tc[l] {cmd} Execute Tcl command {cmd}. A simple check if `:tcl` + is working: > + :tcl puts "Hello" :[range]tc[l] << {endmarker} {script} diff -Naur vim73.orig/runtime/doc/indent.txt vim73/runtime/doc/indent.txt --- vim73.orig/runtime/doc/indent.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/indent.txt 2013-06-07 17:07:08.968983063 +0000 @@ -1,4 +1,4 @@ -*indent.txt* For Vim version 7.3. Last change: 2010 Jul 30 +*indent.txt* For Vim version 7.3. Last change: 2013 May 20 VIM REFERENCE MANUAL by Bram Moolenaar @@ -128,13 +128,20 @@ used CTRL-T or CTRL-D. *cinoptions-values* -The 'cinoptions' option sets how Vim performs indentation. In the list below, +The 'cinoptions' option sets how Vim performs indentation. The value after +the option character can be one of these (N is any number): + N indent N spaces + -N indent N spaces to the left + Ns N times 'shiftwidth' spaces + -Ns N times 'shiftwidth' spaces to the left + +In the list below, "N" represents a number of your choice (the number can be negative). When there is an 's' after the number, Vim multiplies the number by 'shiftwidth': "1s" is 'shiftwidth', "2s" is two times 'shiftwidth', etc. You can use a -decimal point, too: "-0.5s" is minus half a 'shiftwidth'. The examples below -assume a 'shiftwidth' of 4. - +decimal point, too: "-0.5s" is minus half a 'shiftwidth'. +The examples below assume a 'shiftwidth' of 4. + *cino->* >N Amount added for "normal" indent. Used after a line that should increase the indent (lines starting with "if", an opening brace, etc.). (default 'shiftwidth'). @@ -145,6 +152,7 @@ foo; foo; foo; } } } < + *cino-e* eN Add N to the prevailing indent inside a set of braces if the opening brace at the End of the line (more precise: is not the first character in a line). This is useful if you want a @@ -160,6 +168,7 @@ bar; bar; bar; } } } < + *cino-n* nN Add N to the prevailing indent for a statement after an "if", "while", etc., if it is NOT inside a set of braces. This is useful if you want a different indent when there is no '{' @@ -174,6 +183,7 @@ bar; bar; bar; } } } < + *cino-f* fN Place the first opening brace of a function or other block in column N. This applies only for an opening brace that is not inside other braces and is at the start of the line. What comes @@ -184,6 +194,7 @@ { { { int foo; int foo; int foo; < + *cino-{* {N Place opening braces N characters from the prevailing indent. This applies only for opening braces that are inside other braces. (default 0). @@ -193,6 +204,7 @@ { { { foo; foo; foo; < + *cino-}* }N Place closing braces N characters from the matching opening brace. (default 0). @@ -202,6 +214,7 @@ foo; foo; foo; } } } < + *cino-^* ^N Add N to the prevailing indent inside a set of braces if the opening brace is in column 0. This can specify a different indent for whole of a function (some may like to set it to a @@ -216,6 +229,7 @@ } } } } } } < + *cino-L* LN Controls placement of jump labels. If N is negative, the label will be placed at column 1. If N is non-negative, the indent of the label will be the prevailing indent minus N. (default -1). @@ -229,6 +243,7 @@ } } } } } } < + *cino-:* :N Place case labels N characters from the indent of the switch(). (default 'shiftwidth'). @@ -240,6 +255,7 @@ default: default: } } < + *cino-=* =N Place statements occurring after a case label N characters from the indent of the label. (default 'shiftwidth'). @@ -247,6 +263,7 @@ case 11: case 11: a = a + 1; a = a + 1; b = b + 1; < + *cino-l* lN If N != 0 Vim will align with a case label instead of the statement after it in the same line. @@ -256,8 +273,10 @@ break; break; } } < + *cino-b* bN If N != 0 Vim will align a final "break" with the case label, so that case..break looks like a sort of block. (default: 0). + When using 1, consider adding "0=break" to 'cinkeys'. cino= cino=b1 > switch (x) switch(x) @@ -271,6 +290,7 @@ break; break; } } < + *cino-g* gN Place C++ scope declarations N characters from the indent of the block they are in. (default 'shiftwidth'). A scope declaration can be "public:", "protected:" or "private:". @@ -282,6 +302,7 @@ private: private: } } < + *cino-h* hN Place statements occurring after a C++ scope declaration N characters from the indent of the label. (default 'shiftwidth'). @@ -290,6 +311,21 @@ public: public: a = a + 1; a = a + 1; b = b + 1; < + *cino-N* + NN Indent inside C++ namespace N characters extra compared to a + normal block. (default 0). + + cino= cino=N-s > + namespace { namespace { + void function(); void function(); + } } + + namespace my namespace my + { { + void function(); void function(); + } } +< + *cino-p* pN Parameter declarations for K&R-style function declarations will be indented N characters from the margin. (default 'shiftwidth'). @@ -299,6 +335,7 @@ int a; int a; int a; char b; char b; char b; < + *cino-t* tN Indent a function return type declaration N characters from the margin. (default 'shiftwidth'). @@ -306,6 +343,7 @@ int int int func() func() func() < + *cino-i* iN Indent C++ base class declarations and constructor initializations, if they start in a new line (otherwise they are aligned at the right side of the ':'). @@ -319,13 +357,18 @@ BaseClass(3) BaseClass(3) {} {} < - +N Indent a continuation line (a line that spills onto the next) N - additional characters. (default 'shiftwidth'). + *cino-+* + +N Indent a continuation line (a line that spills onto the next) + inside a function N additional characters. (default + 'shiftwidth'). + Outside of a function, when the previous line ended in a + backslash, the 2 * N is used. cino= cino=+10 > a = b + 9 * a = b + 9 * c; c; < + *cino-c* cN Indent comment lines after the comment opener, when there is no other text with which to align, N characters from the comment opener. (default 3). See also |format-comments|. @@ -335,6 +378,7 @@ text. text. */ */ < + *cino-C* CN When N is non-zero, indent comment lines by the amount specified with the c flag above even if there is other text behind the comment opener. (default 0). @@ -345,12 +389,14 @@ ********/ ********/ < (Example uses ":set comments& comments-=s1:/* comments^=s0:/*") + *cino-/* /N Indent comment lines N characters extra. (default 0). cino= cino=/4 > a = b; a = b; /* comment */ /* comment */ c = d; c = d; < + *cino-(* (N When in unclosed parentheses, indent N characters from the line with the unclosed parentheses. Add a 'shiftwidth' for every unclosed parentheses. When N is 0 or the unclosed parentheses @@ -366,6 +412,7 @@ (c2 || c3)) (c2 || c3)) { { < + *cino-u* uN Same as (N, but for one level deeper. (default 'shiftwidth'). cino= cino=u2 > @@ -373,6 +420,7 @@ && (c22345 && (c22345 || c3)) || c3)) < + *cino-U* UN When N is non-zero, do not ignore the indenting specified by ( or u in case that the unclosed parentheses is the first non-white character in its line. (default 0). @@ -384,6 +432,7 @@ c3 c3 ) && c4; ) && c4; < + *cino-w* wN When in unclosed parentheses and N is non-zero and either using "(0" or "u0", respectively, or using "U0" and the unclosed parentheses is the first non-white character in its line, line @@ -396,6 +445,7 @@ || c3)) || c3)) foo; foo; < + *cino-W* WN When in unclosed parentheses and N is non-zero and either using "(0" or "u0", respectively and the unclosed parentheses is the last non-white character in its line and it is not the @@ -410,6 +460,23 @@ a_short_line(argument, a_short_line(argument, argument); argument); < + *cino-k* + kN When in unclosed parentheses which follow "if", "for" or + "while" and N is non-zero, overrides the behaviour defined by + "(N": causes the indent to be N characters relative to the outer + context (i.e. the line where "if", "for" or "while" is). Has + no effect on deeper levels of nesting. Affects flags like "wN" + only for the "if", "for" and "while" conditions. If 0, defaults + to behaviour defined by the "(N" flag. (default: 0). + + cino=(0 cino=(0,ks > + if (condition1 if (condition1 + && condition2) && condition2) + action(); action(); + function(argument1 function(argument1 + && argument2); && argument2); +< + *cino-m* mN When N is non-zero, line up a line starting with a closing parentheses with the first character of the line with the matching opening parentheses. (default 0). @@ -424,6 +491,7 @@ ) ) foo; foo; < + *cino-M* MN When N is non-zero, line up a line starting with a closing parentheses with the first character of the previous line. (default 0). @@ -433,10 +501,11 @@ cond2 cond2 ) ) < - *java-cinoptions* *java-indenting* - jN Indent java anonymous classes correctly. The value 'N' is - currently unused but must be non-zero (e.g. 'j1'). 'j1' will - indent for example the following code snippet correctly: > + *java-cinoptions* *java-indenting* *cino-j* + jN Indent Java anonymous classes correctly. Also works well for + Javascript. The value 'N' is currently unused but must be + non-zero (e.g. 'j1'). 'j1' will indent for example the + following code snippet correctly: > object.add(new ChangeListener() { public void stateChanged(ChangeEvent e) { @@ -444,10 +513,11 @@ } }); < - *javascript-cinoptions* *javascript-indenting* + *javascript-cinoptions* *javascript-indenting* *cino-J* JN Indent JavaScript object declarations correctly by not confusing them with labels. The value 'N' is currently unused but must be - non-zero (e.g. 'J1'). > + non-zero (e.g. 'J1'). If you enable this you probably also want + to set |cino-j|. > var bar = { foo: { @@ -462,23 +532,28 @@ } } < + *cino-)* )N Vim searches for unclosed parentheses at most N lines away. This limits the time needed to search for parentheses. (default 20 lines). + *cino-star* *N Vim searches for unclosed comments at most N lines away. This limits the time needed to search for the start of a comment. + If your /* */ comments stop indenting after N lines this is the + value you will want to change. (default 70 lines). + *cino-#* #N When N is non-zero recognize shell/Perl comments, starting with - '#'. Default N is zero: don't recognizes '#' comments. Note + '#'. Default N is zero: don't recognize '#' comments. Note that lines starting with # will still be seen as preprocessor lines. The defaults, spelled out in full, are: - cinoptions=>s,e0,n0,f0,{0,}0,^0,L-1,:s,=s,l0,b0,gs,hs,ps,ts,is,+s, - c3,C0,/0,(2s,us,U0,w0,W0,m0,j0,J0,)20,*70,#0 + cinoptions=>s,e0,n0,f0,{0,}0,^0,L-1,:s,=s,l0,b0,gs,hs,N0,ps,ts,is,+s, + c3,C0,/0,(2s,us,U0,w0,W0,k0,m0,j0,J0,)20,*70,#0 Vim puts a line in column 1 if: - It starts with '#' (preprocessor directives), if 'cinkeys' contains '#'. @@ -502,15 +577,117 @@ REMARKS ABOUT SPECIFIC INDENT FILES ~ +CLOJURE *ft-clojure-indent* *clojure-indent* + +Clojure indentation differs somewhat from traditional Lisps, due in part to +the use of square and curly brackets, and otherwise by community convention. +These conventions are not always universally followed, so the Clojure indent +script offers a few configurable options, listed below. + +If the current vim does not include searchpairpos(), the indent script falls +back to normal 'lisp' indenting, and the following options are ignored. + + *g:clojure_maxlines* + +Set maximum scan distance of searchpairpos(). Larger values trade performance +for correctness when dealing with very long forms. A value of 0 will scan +without limits. +> + " Default + let g:clojure_maxlines = 100 +< + + *g:clojure_fuzzy_indent* + *g:clojure_fuzzy_indent_patterns* + *g:clojure_fuzzy_indent_blacklist* + +The 'lispwords' option is a list of comma-separated words that mark special +forms whose subforms must be indented with two spaces. + +For example: +> + (defn bad [] + "Incorrect indentation") + + (defn good [] + "Correct indentation") +< +If you would like to specify 'lispwords' with a |pattern| instead, you can use +the fuzzy indent feature: +> + " Default + let g:clojure_fuzzy_indent = 1 + let g:clojure_fuzzy_indent_patterns = ['^with', '^def', '^let'] + let g:clojure_fuzzy_indent_blacklist = + \ ['-fn$', '\v^with-%(meta|out-str|loading-context)$'] + + " Legacy comma-delimited string version; the list format above is + " recommended. Note that patterns are implicitly anchored with ^ and $ + let g:clojure_fuzzy_indent_patterns = 'with.*,def.*,let.*' +< +|g:clojure_fuzzy_indent_patterns| and |g:clojure_fuzzy_indent_blacklist| are +|Lists| of patterns that will be matched against the unquoted, unqualified +symbol at the head of a list. This means that a pattern like "^foo" will match +all these candidates: "foobar", "my.ns/foobar", and "#'foobar". + +Each candidate word is tested for special treatment in this order: + + 1. Return true if word is literally in 'lispwords' + 2. Return false if word matches a pattern in + |g:clojure_fuzzy_indent_blacklist| + 3. Return true if word matches a pattern in + |g:clojure_fuzzy_indent_patterns| + 4. Return false and indent normally otherwise + + *g:clojure_special_indent_words* + +Some forms in Clojure are indented so that every subform is indented only two +spaces, regardless of 'lispwords'. If you have a custom construct that should +be indented in this idiosyncratic fashion, you can add your symbols to the +default list below. +> + " Default + let g:clojure_special_indent_words = + \ 'deftype,defrecord,reify,proxy,extend-type,extend-protocol,letfn' +< + + *g:clojure_align_multiline_strings* + +Align subsequent lines in multiline strings to the column after the opening +quote, instead of the same column. + +For example: +> + (def default + "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut + enim ad minim veniam, quis nostrud exercitation ullamco laboris + nisi ut aliquip ex ea commodo consequat.") + + (def aligned + "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut + enim ad minim veniam, quis nostrud exercitation ullamco laboris + nisi ut aliquip ex ea commodo consequat.") +< +This option is off by default. +> + " Default + let g:clojure_align_multiline_strings = 0 +< + + FORTRAN *ft-fortran-indent* -Block if, select case, and where constructs are indented. Comments, labelled -statements and continuation lines are indented if the Fortran is in free -source form, whereas they are not indented if the Fortran is in fixed source -form because of the left margin requirements. Hence manual indent corrections -will be necessary for labelled statements and continuation lines when fixed -source form is being used. For further discussion of the method used for the -detection of source format see |ft-fortran-syntax|. +Block if, select case, where, and forall constructs are indented. So are +type, interface, associate, block, and enum constructs. The indenting of +subroutines, functions, modules, and program blocks is optional. Comments, +labelled statements and continuation lines are indented if the Fortran is in +free source form, whereas they are not indented if the Fortran is in fixed +source form because of the left margin requirements. Hence manual indent +corrections will be necessary for labelled statements and continuation lines +when fixed source form is being used. For further discussion of the method +used for the detection of source format see |ft-fortran-syntax|. Do loops ~ All do loops are left unindented by default. Do loops can be unstructured in @@ -537,6 +714,20 @@ to get do loops indented in .f90 files and left alone in Fortran files with other extensions such as .for. +Program units ~ +The indenting of program units (subroutines, functions, modules, and program +blocks) is enabled by default but can be suppressed if a lighter, screen-width +preserving indent style is desired. To suppress the indenting of program +units for all fortran files set the global fortran_indent_less variable in +your .vimrc as follows > + + let fortran_indent_less=1 + +A finer level of suppression can be achieved by setting the corresponding +buffer-local variable as follows > + + let b:fortran_indent_less=1 + PHP *ft-php-indent* *php-indent* *php-indenting* @@ -549,12 +740,12 @@ :%s /\r$//g Or, you can simply |:let| the variable PHP_removeCRwhenUnix to 1 and the -script will silently remove them when Vim loads a PHP file (at each|BufRead|). +script will silently remove them when Vim loads a PHP file (at each |BufRead|). OPTIONS: ~ PHP indenting can be altered in several ways by modifying the values of some -variables: +global variables: *php-comment* To not enable auto-formating of comments by default (if you want to use your @@ -562,10 +753,21 @@ :let g:PHP_autoformatcomment = 0 Else, 't' will be removed from the 'formatoptions' string and "qrowcb" will be -added, see|fo-table|for more information. +added, see |fo-table| for more information. +------------- + +To add extra indentation to single-line comments: > + :let g:PHP_outdentSLComments = N + +With N being the number of 'shiftwidth' to add. + +Only single-line comments will be affected such as: > + # Comment + // Comment + /* Comment */ ------------- -To add an extra indent to every PHP lines with N being the number of +To add extra indentation to every PHP lines with N being the number of 'shiftwidth' to add: > :let g:PHP_default_indenting = N @@ -581,7 +783,7 @@ $command_hist = TRUE; ?> -(Notice the extra indent between the PHP container markers and the code) +(Notice the extra indentation between the PHP container markers and the code) ------------- To indent PHP tags as the surrounding code: > @@ -613,8 +815,10 @@ To indent 'case:' and 'default:' statements in switch() blocks: > :let g:PHP_vintage_case_default_indent = 1 -(Since in PHP braces are not required inside 'case/default' blocks, by default they are indented at the same level than the 'switch()' to avoid -unnecessary indentation) +In PHP braces are not required inside 'case/default' blocks therefore 'case:' +and 'default:' are indented at the same level than the 'switch()' to avoid +meaningless indentation. You can use the above option to return to the +traditional way. PYTHON *ft-python-indent* @@ -631,6 +835,43 @@ let g:pyindent_continue = '&sw * 2' +R *ft-r-indent* + +Function arguments are aligned if they span for multiple lines. If you prefer +do not have the arguments of functions aligned, put in your |vimrc|: +> + let r_indent_align_args = 0 +< +All lines beginning with a comment character, #, get the same indentation +level of the normal R code. Users of Emacs/ESS may be used to have lines +beginning with a single # indented in the 40th column, ## indented as R code, +and ### not indented. If you prefer that lines beginning with comment +characters are aligned as they are by Emacs/ESS, put in your |vimrc|: +> + let r_indent_ess_comments = 1 +< +If you prefer that lines beginning with a single # are aligned at a column +different from the 40th one, you should set a new value to the variable +r_indent_comment_column, as in the example below: +> + let r_indent_comment_column = 30 +< +Any code after a line that ends with "<-" is indented. Emacs/ESS does not +indent the code if it is a top level function. If you prefer that the +Vim-R-plugin behaves like Emacs/ESS in this regard, put in your |vimrc|: +> + let r_indent_ess_compatible = 1 +< +Below is an example of indentation with and without this option enabled: +> + ### r_indent_ess_compatible = 1 ### r_indent_ess_compatible = 0 + foo <- foo <- + function(x) function(x) + { { + paste(x) paste(x) + } } +< + SHELL *ft-sh-indent* The amount of indent applied under various circumstances in a shell file can diff -Naur vim73.orig/runtime/doc/index.txt vim73/runtime/doc/index.txt --- vim73.orig/runtime/doc/index.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/index.txt 2013-06-07 17:07:08.978983035 +0000 @@ -1,4 +1,4 @@ -*index.txt* For Vim version 7.3. Last change: 2010 Jul 21 +*index.txt* For Vim version 7.3. Last change: 2013 Jun 06 VIM REFERENCE MANUAL by Bram Moolenaar @@ -29,7 +29,7 @@ ============================================================================== 1. Insert mode *insert-index* -tag char action ~ +tag char action in Insert mode ~ ----------------------------------------------------------------------- |i_CTRL-@| CTRL-@ insert previously inserted text and stop insert @@ -94,8 +94,8 @@ |i_CTRL-Z| CTRL-Z when 'insertmode' set: suspend Vim |i_| end insert mode (unless 'insertmode' set) |i_CTRL-[| CTRL-[ same as -|i_CTRL-\_CTRL-N| CTRL-\ CTRL-N go to Normal mode -|i_CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode' +|i_CTRL-\_CTRL-N| CTRL-\ CTRL-N go to Normal mode +|i_CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode' CTRL-\ a - z reserved for extensions CTRL-\ others not used |i_CTRL-]| CTRL-] trigger abbreviation @@ -141,7 +141,7 @@ |i_| move window three lines up |i_| move window one page up |i_| move window six columns left -|i_| move window one page left +|i_| move window one page left |i_| move window six columns right |i_| move window one page right @@ -212,8 +212,8 @@ |CTRL-Y| CTRL-Y scroll N lines downwards |CTRL-Z| CTRL-Z suspend program (or start new shell) CTRL-[ not used -|CTRL-\_CTRL-N| CTRL-\ CTRL-N go to Normal mode (no-op) -|CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode' +|CTRL-\_CTRL-N| CTRL-\ CTRL-N go to Normal mode (no-op) +|CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode' CTRL-\ a - z reserved for extensions CTRL-\ others not used |CTRL-]| CTRL-] :ta to ident under cursor @@ -431,7 +431,7 @@ || 2 same as "i" || 1 same as "h" || 1 move cursor to the mouse click position -|| 2 same as "gP" at the mouse click position +|| 2 same as "gP" at the mouse click position || same as CTRL-F || same as CTRL-B || 1 same as "l" @@ -459,7 +459,7 @@ These can be used after an operator or in Visual mode to select an object. -tag command action in Normal mode ~ +tag command action in op-pending and Visual mode ~ ------------------------------------------------------------------------------ |v_aquote| a" double quoted string |v_a'| a' single quoted string @@ -640,7 +640,7 @@ |[s| [s 1 move to the previous misspelled word |[z| [z 1 move to start of open fold |[{| [{ 1 cursor N times back to unmatched '{' -|[ [ 2 same as "[p" +|[| [ 2 same as "[p" |]_CTRL-D| ] CTRL-D jump to first #define found in current and included files matching the word under the @@ -680,7 +680,7 @@ |]s| ]s 1 move to next misspelled word |]z| ]z 1 move to end of open fold |]}| ]} 1 cursor N times forward to unmatched '}' -|] ] 2 same as "]p" +|]| ] 2 same as "]p" ============================================================================== 2.4 Commands starting with 'g' *g* @@ -719,9 +719,13 @@ |gH| gH start Select line mode |gI| gI 2 like "I", but always start in column 1 |gJ| gJ 2 join lines without inserting space +|gN| gN 1,2 find the previous match with the last used + search pattern and Visually select it |gP| ["x]gP 2 put the text [from register x] before the cursor N times, leave the cursor after it +|gQ| gQ switch to "Ex" mode with Vim editing |gR| gR 2 enter Virtual Replace mode +|gT| gT go to the previous tab page |gU| gU{motion} 2 make Nmove text uppercase |gV| gV don't reselect the previous Visual area when executing a mapping or menu in Select @@ -750,6 +754,8 @@ lines down |gk| gk 1 like "k", but when 'wrap' on go N screen lines up +|gn| gn 1,2 find the next match with the last used + search pattern and Visually select it |gm| gm 1 go to character at middle of the screenline |go| go 1 cursor to byte N in the buffer |gp| ["x]gp 2 put the text [from register x] after the @@ -757,6 +763,7 @@ |gq| gq{motion} 2 format Nmove text |gr| gr{char} 2 virtual replace N chars with {char} |gs| gs go to sleep for N seconds (default 1) +|gt| gt go to the next tab page |gu| gu{motion} 2 make Nmove text lowercase |gv| gv reselect the previous Visual area |gw| gw{motion} 2 format Nmove text and keep cursor @@ -951,11 +958,13 @@ "Completion" below refers to context-sensitive completion. It will complete file names, tags, commands etc. as appropriate. +tag command action in Command-line editing mode ~ +------------------------------------------------------------------------------ CTRL-@ not used |c_CTRL-A| CTRL-A do completion on the pattern in front of the cursor and insert all matches |c_CTRL-B| CTRL-B cursor to begin of command-line -|c_CTRL-C| CTRL-C same as +|c_CTRL-C| CTRL-C same as |c_CTRL-D| CTRL-D list completions that match the pattern in front of the cursor |c_CTRL-E| CTRL-E cursor to end of command-line @@ -1004,8 +1013,8 @@ CTRL-Z not used (reserved for suspend) |c_| abandon command-line without executing it |c_| CTRL-[ same as -|c_CTRL-\_CTRL-N| CTRL-\ CTRL-N go to Normal mode, abandon command-line -|c_CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode', +|c_CTRL-\_CTRL-N| CTRL-\ CTRL-N go to Normal mode, abandon command-line +|c_CTRL-\_CTRL-G| CTRL-\ CTRL-G go to mode specified with 'insertmode', abandon command-line CTRL-\ a - d reserved for extensions |c_CTRL-\_e| CTRL-\ e {expr} replace the command line with the result of @@ -1046,6 +1055,8 @@ mentioning any arguments. The optional part of the command name is inside []. The commands are sorted on the non-optional part of their name. +tag command action ~ +------------------------------------------------------------------------------ |:!| :! filter lines or execute an external command |:!!| :!! repeat last ":!" command |:#| :# same as ":number" @@ -1125,7 +1136,7 @@ |:cgetbuffer| :cgetb[uffer] get errors from buffer |:cgetexpr| :cgete[xpr] get errors from expr |:cgetfile| :cg[etfile] read file with error messages -|:changes| :cha[nges] print the change list +|:changes| :changes print the change list |:chdir| :chd[ir] change directory |:checkpath| :che[ckpath] list included files |:checktime| :checkt[ime] check timestamp of loaded buffers @@ -1256,7 +1267,7 @@ |:k| :k set a mark |:keepalt| :keepa[lt] following command keeps the alternate file |:keepmarks| :kee[pmarks] following command keeps marks where they are -|:keepjumps| :keepj[jumps] following command keeps jumplist and marks +|:keepjumps| :keepj[umps] following command keeps jumplist and marks |:lNext| :lN[ext] go to previous entry in location list |:lNfile| :lNf[ile] go to last entry in previous file |:list| :l[ist] print lines @@ -1374,7 +1385,7 @@ |:promptrepl| :promptr[epl] open GUI dialog for search/replace |:perldo| :perld[o] execute Perl command for each line |:pop| :po[p] jump to older entry in tag stack -|:popup| :pop[up] popup a menu by name +|:popup| :popu[p] popup a menu by name |:ppop| :pp[op] ":pop" in preview window |:preserve| :pre[serve] write all text to swap file |:previous| :prev[ious] go to previous file in argument list @@ -1392,8 +1403,10 @@ |:pwd| :pw[d] print current directory |:py3| :py3 execute Python 3 command |:python3| :python3 same as :py3 +|:py3do| :py3d[o] execute Python 3 command for each line |:py3file| :py3f[ile] execute Python 3 script file |:python| :py[thon] execute Python command +|:pydo| :pyd[o] execute Python command for each line |:pyfile| :pyf[ile] execute Python script file |:quit| :q[uit] quit current window (when one window quit Vim) |:quitall| :quita[ll] quit Vim @@ -1460,7 +1473,7 @@ |:slast| :sla[st] split window and go to last file in the argument list |:smagic| :sm[agic] :substitute with 'magic' -|:smap| :sma[p] like ":map" but for Select mode +|:smap| :smap like ":map" but for Select mode |:smapclear| :smapc[lear] remove all mappings for Select mode |:smenu| :sme[nu] add menu for Select mode |:snext| :sn[ext] split window and go to next file in the @@ -1497,6 +1510,7 @@ |:sview| :sv[iew] split window and edit file read-only |:swapname| :sw[apname] show the name of the current swap file |:syntax| :sy[ntax] syntax highlighting +|:syntime| :synti[me] measure syntax highlighting speed |:syncbind| :sync[bind] sync scroll binding |:t| :t same as ":copy" |:tNext| :tN[ext] jump to previous matching tag diff -Naur vim73.orig/runtime/doc/insert.txt vim73/runtime/doc/insert.txt --- vim73.orig/runtime/doc/insert.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/insert.txt 2013-06-07 17:07:09.012316273 +0000 @@ -1,4 +1,4 @@ -*insert.txt* For Vim version 7.3. Last change: 2010 Jul 29 +*insert.txt* For Vim version 7.3. Last change: 2013 Apr 12 VIM REFERENCE MANUAL by Bram Moolenaar @@ -380,7 +380,16 @@ end of the line, it will be put on the last character in the line. In mappings it's often better to use (first put an "x" in the text, will then always put the cursor on it). Or use CTRL-\ CTRL-O, but then -beware of the cursor possibly being beyond the end of the line. +beware of the cursor possibly being beyond the end of the line. Note that the +command following CTRL-\ CTRL-O can still move the cursor, it is not restored +to its original position. + +The CTRL-O command takes you to Normal mode. If you then use a command enter +Insert mode again it normally doesn't nest. Thus when typing "aa" and +then takes you back to Normal mode, you do not need to type twice. +An exception is when not typing the command, e.g. when executing a mapping or +sourcing a script. This makes mappings work that briefly switch to Insert +mode. The shifted cursor keys are not available on all terminals. @@ -394,7 +403,12 @@ This redefines the backspace key to start a new undo sequence. You can now undo the effect of the backspace key, without changing what you typed before -that, with CTRL-O u. +that, with CTRL-O u. Another example: > + + :inoremap u + +This breaks undo at each line break. It also expands abbreviations before +this. Using CTRL-O splits undo: the text typed before and after it is undone separately. If you want to avoid this (e.g., in a mapping) you might be able @@ -479,7 +493,7 @@ *ins-smarttab* When the 'smarttab' option is on, a inserts 'shiftwidth' positions at the beginning of a line and 'tabstop' positions in other places. This means -that often spaces instead of a character are inserted. When 'smarttab +that often spaces instead of a character are inserted. When 'smarttab' is off, a always inserts 'tabstop' positions, and 'shiftwidth' is only used for ">>" and the like. {not in Vi} @@ -555,12 +569,11 @@ In 'list' mode, Virtual Replace mode acts as if it was not in 'list' mode, unless "L" is in 'cpoptions'. -Note that the only times characters beyond the cursor should appear to move -are in 'list' mode, and occasionally when 'wrap' is set (and the line changes -length to become shorter or wider than the width of the screen), or -momentarily when typing over a CTRL character. A CTRL character takes up two -screen spaces. When replacing it with two normal characters, the first will -be inserted and the second will replace the CTRL character. +Note that the only situations for which characters beyond the cursor should +appear to move are in List mode |'list'|, and occasionally when 'wrap' is set +(and the line changes length to become shorter or wider than the width of the +screen). In other cases spaces may be inserted to avoid following characters +to move. This mode is very useful for editing separated columns in tables, for entering new data while keeping all the columns aligned. @@ -1006,8 +1019,13 @@ number between zero and the cursor column "col('.')". This involves looking at the characters just before the cursor and including those characters that could be part of the completed item. The text between this column and the -cursor column will be replaced with the matches. Return -1 if no completion -can be done. +cursor column will be replaced with the matches. + +Special return values: + -1 If no completion can be done, the completion will be cancelled with an + error message. + -2 To cancel silently and stay in completion mode. + -3 To cancel silently and leave completion mode. On the second invocation the arguments are: a:findstart 0 @@ -1017,6 +1035,23 @@ The function must return a List with the matching words. These matches usually include the "a:base" text. When there are no matches return an empty List. + +In order to return more information than the matching words, return a Dict +that contains the List. The Dict can have these items: + words The List of matching words (mandatory). + refresh A string to control re-invocation of the function + (optional). + The only value currently recognized is "always", the + effect is that the function is called whenever the + leading text is changed. +Other items are ignored. + +For acting upon end of completion, see the |CompleteDone| autocommand event. + +For example, the function can contain this: > + let matches = ... list of words ... + return {'words': matches, 'refresh': 'always'} +< *complete-items* Each list item can either be a string or a Dictionary. When it is a string it is used as the completion. When it is a Dictionary it can contain these @@ -1034,17 +1069,21 @@ items that only differ in case are added dup when non-zero this match will be added even when an item with the same word is already present. + empty when non-zero this match will be added even when it is + an empty string -All of these except 'icase' must be a string. If an item does not meet these -requirements then an error message is given and further items in the list are -not used. You can mix string and Dictionary items in the returned list. +All of these except 'icase', 'dup' and 'empty' must be a string. If an item +does not meet these requirements then an error message is given and further +items in the list are not used. You can mix string and Dictionary items in +the returned list. The "menu" item is used in the popup menu and may be truncated, thus it should be relatively short. The "info" item can be longer, it will be displayed in the preview window when "preview" appears in 'completeopt'. The "info" item will also remain displayed after the popup menu has been removed. This is useful for function arguments. Use a single space for "info" to remove -existing text in the preview window. +existing text in the preview window. The size of the preview window is three +lines, but 'previewheight' is used when it has a value of 1 or 2. The "kind" item uses a single letter to indicate the kind of completion. This may be used to show the completion differently (different color or icon). @@ -1060,9 +1099,9 @@ list! Call |complete_check()| now and then to allow the user to press a key while still searching for matches. Stop searching when it returns non-zero. -The function is allowed to move the cursor, it is restored afterwards. This -option cannot be set from a |modeline| or in the |sandbox|, for security -reasons. + *E839* *E840* +The function is allowed to move the cursor, it is restored afterwards. +The function is not allowed to move to another window or delete text. An example that completes the names of the months: > fun! CompleteMonths(findstart, base) @@ -1767,6 +1806,11 @@ containing only a ".". Watch out for lines starting with a backslash, see |line-continuation|. +When in Ex mode (see |-e|) a backslash at the end of the line can be used to +insert a NUL character. To be able to have a line ending in a backslash use +two backslashes. This means that the number of backslashes is halved, but +only at the end of the line. + NOTE: These commands cannot be used with |:global| or |:vglobal|. ":append" and ":insert" don't work properly in between ":if" and ":endif", ":for" and ":endfor", ":while" and ":endwhile". @@ -1825,13 +1869,15 @@ See |++opt| for the possible values of [++opt]. *:r!* *:read!* -:[range]r[ead] !{cmd} Execute {cmd} and insert its standard output below +:[range]r[ead] [++opt] !{cmd} + Execute {cmd} and insert its standard output below the cursor or the specified line. A temporary file is used to store the output of the command which is then read into the buffer. 'shellredir' is used to save the output of the command, which can be set to include stderr or not. {cmd} is executed like with ":!{cmd}", any '!' is replaced with the previous command |:!|. + See |++opt| for the possible values of [++opt]. These commands insert the contents of a file, or the output of a command, into the buffer. They can be undone. They cannot be repeated with the "." diff -Naur vim73.orig/runtime/doc/intro.txt vim73/runtime/doc/intro.txt --- vim73.orig/runtime/doc/intro.txt 2010-08-15 12:23:20.000000000 +0000 +++ vim73/runtime/doc/intro.txt 2013-06-07 17:07:09.022316245 +0000 @@ -1,4 +1,4 @@ -*intro.txt* For Vim version 7.3. Last change: 2010 Jul 20 +*intro.txt* For Vim version 7.3. Last change: 2012 Sep 05 VIM REFERENCE MANUAL by Bram Moolenaar @@ -135,8 +135,10 @@ Bug reports: *bugs* *bug-reports* *bugreport.vim* -Send bug reports to: Vim bugs -This is not a maillist but the message is redirected to the Vim maintainer. +Send bug reports to: Vim Developers +This is a maillist, many people will see the message. If you don't want that, +e.g. because it is a security issue, send it to , this only goes +to the Vim maintainer (that's Bram). Please be brief; all the time that is spent on answering mail is subtracted from the time that is spent on improving Vim! Always give a reproducible example and try to find out which settings or other things influence the @@ -300,7 +302,7 @@ [] Characters in square brackets are optional. - *count* *[count]* *E489* + *count* *[count]* [count] An optional number that may precede the command to multiply or iterate the command. If no number is given, a count of one is used, unless otherwise noted. Note that in this manual the @@ -392,6 +394,8 @@ *quotecommandquote* "command" A reference to a command that you can type is enclosed in double quotes. +`command` New style command, this distinguishes it from other quoted + text and strings. *key-notation* *key-codes* *keycodes* These names for keys are used in the documentation. They can also be used @@ -616,7 +620,6 @@ Command-line *3 -- -- :start -- -- Ex :vi -- -- -- -- -- -- NA -- not possible *1 Go from Normal mode to Insert mode by giving the command "i", "I", "a", @@ -703,7 +706,7 @@ (see below). The 'linebreak' option can be set to wrap at a blank character. If the window has room after the last line of the buffer, Vim will show '~' in -the first column of the last lines in the window, like this: > +the first column of the last lines in the window, like this: +-----------------------+ |some line | @@ -715,7 +718,7 @@ Thus the '~' lines indicate that the end of the buffer was reached. If the last line in a window doesn't fit, Vim will indicate this with a '@' in -the first column of the last lines in the window, like this: > +the first column of the last lines in the window, like this: +-----------------------+ |first line | @@ -730,7 +733,7 @@ When the "lastline" flag is present in the 'display' option, you will not see '@' characters at the left side of window. If the last line doesn't fit completely, only the part that fits is shown, and the last three characters of -the last line are replaced with "@@@", like this: > +the last line are replaced with "@@@", like this: +-----------------------+ |first line | diff -Naur vim73.orig/runtime/doc/map.txt vim73/runtime/doc/map.txt --- vim73.orig/runtime/doc/map.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/map.txt 2013-06-07 17:07:09.045649511 +0000 @@ -1,4 +1,4 @@ -*map.txt* For Vim version 7.3. Last change: 2010 Jul 31 +*map.txt* For Vim version 7.3. Last change: 2013 May 05 VIM REFERENCE MANUAL by Bram Moolenaar @@ -49,7 +49,7 @@ :nm[ap] {lhs} {rhs} |mapmode-n| *:nm* *:nmap* :vm[ap] {lhs} {rhs} |mapmode-v| *:vm* *:vmap* :xm[ap] {lhs} {rhs} |mapmode-x| *:xm* *:xmap* -:smap {lhs} {rhs} |mapmode-s| *:smap* +:smap {lhs} {rhs} |mapmode-s| *:smap* :om[ap] {lhs} {rhs} |mapmode-o| *:om* *:omap* :map! {lhs} {rhs} |mapmode-ic| *:map!* :im[ap] {lhs} {rhs} |mapmode-i| *:im* *:imap* @@ -107,6 +107,8 @@ :cmapc[lear] |mapmode-c| *:cmapc* *:cmapclear* Remove ALL mappings for the modes where the map command applies. {not in Vi} + Use the argument to remove buffer-local + mappings |:map-| Warning: This also removes the default mappings. :map |mapmode-nvo| @@ -226,7 +228,7 @@ For abbreviations |v:char| is set to the character that was typed to trigger the abbreviation. You can use this to decide how to expand the {lhs}. You -can't change v:char and you should not insert it. +should not either insert or change the v:char. Be very careful about side effects! The expression is evaluated while obtaining characters, you may very well make the command dysfunctional. @@ -235,11 +237,18 @@ - Editing another buffer. - The |:normal| command. - Moving the cursor is allowed, but it is restored afterwards. -- You can use getchar(), but the existing typeahead isn't seen and new - typeahead is discarded. If you want the mapping to do any of these let the returned characters do that. +You can use getchar(), it consumes typeahead if there is any. E.g., if you +have these mappings: > + inoremap nr2char(getchar()) + inoremap x "foo" +If you now type CTRL-L nothing happens yet, Vim needs the next character to +decide what mapping to use. If you type 'x' the second mapping is used and +"foo" is inserted. If you type any other key the first mapping is used, +getchar() gets the typed key and returns it. + Here is an example that inserts a list number that increases: > let counter = 0 inoremap ListItem() @@ -480,9 +489,9 @@ have to type CTRL-V two times). Unfortunately, you cannot do this in a vimrc file. ** -A easier way to get a mapping that doesn't produce anything, is to use "" -for the {rhs}. This only works when the |<>| notation is enabled. For -example, to make sure that function key 8 does nothing at all: > +An easier way to get a mapping that doesn't produce anything, is to use +"" for the {rhs}. This only works when the |<>| notation is enabled. +For example, to make sure that function key 8 does nothing at all: > :map :map! < @@ -495,7 +504,7 @@ :set encoding=utf-8 The mapping for is defined with the latin1 encoding, resulting in a 0xc3 byte. If you type the character (0xe1 ) in UTF-8 encoding this is the -two bytes 0xc3 0xa1. You don't want the 0xc3 byte to be mapped then, +two bytes 0xc3 0xa1. You don't want the 0xc3 byte to be mapped then or otherwise it would be impossible to type the character. ** *mapleader* @@ -518,7 +527,7 @@ is just like , except that it uses "maplocalleader" instead of "mapleader". is to be used for mappings which are local to a buffer. Example: > - :map q \DoItNow + :map A oanother line < In a global plugin should be used and in a filetype plugin . "mapleader" and "maplocalleader" can be equal. Although, if @@ -542,6 +551,7 @@ character 123 character 27 character 127 + character 114 ('r') shifted ('R') This is useful to specify a (multi-byte) character in a 'keymap' file. Upper and lowercase differences are ignored. @@ -934,11 +944,12 @@ avoid that a typed {lhs} is expanded, since command-line abbreviations apply here. -:ab[breviate] [] {lhs} {rhs} +:ab[breviate] [] [] {lhs} {rhs} add abbreviation for {lhs} to {rhs}. If {lhs} already existed it is replaced with the new {rhs}. {rhs} may contain spaces. See |:map-| for the optional argument. + See |:map-| for the optional argument. *:una* *:unabbreviate* :una[bbreviate] {lhs} Remove abbreviation for {lhs} from the list. If none @@ -948,12 +959,12 @@ expansion insert a CTRL-V (type it twice). *:norea* *:noreabbrev* -:norea[bbrev] [] [lhs] [rhs] +:norea[bbrev] [] [] [lhs] [rhs] same as ":ab", but no remapping for this {rhs} {not in Vi} *:ca* *:cabbrev* -:ca[bbrev] [] [lhs] [rhs] +:ca[bbrev] [] [] [lhs] [rhs] same as ":ab", but for Command-line mode only. {not in Vi} @@ -962,12 +973,12 @@ in Vi} *:cnorea* *:cnoreabbrev* -:cnorea[bbrev] [] [lhs] [rhs] +:cnorea[bbrev] [] [] [lhs] [rhs] same as ":ab", but for Command-line mode only and no remapping for this {rhs} {not in Vi} *:ia* *:iabbrev* -:ia[bbrev] [] [lhs] [rhs] +:ia[bbrev] [] [] [lhs] [rhs] same as ":ab", but for Insert mode only. {not in Vi} *:iuna* *:iunabbrev* @@ -975,18 +986,18 @@ Vi} *:inorea* *:inoreabbrev* -:inorea[bbrev] [] [lhs] [rhs] +:inorea[bbrev] [] [] [lhs] [rhs] same as ":ab", but for Insert mode only and no remapping for this {rhs} {not in Vi} *:abc* *:abclear* -:abc[lear] Remove all abbreviations. {not in Vi} +:abc[lear] [] Remove all abbreviations. {not in Vi} *:iabc* *:iabclear* -:iabc[lear] Remove all abbreviations for Insert mode. {not in Vi} +:iabc[lear] [] Remove all abbreviations for Insert mode. {not in Vi} *:cabc* *:cabclear* -:cabc[lear] Remove all abbreviations for Command-line mode. {not +:cabc[lear] [] Remove all abbreviations for Command-line mode. {not in Vi} *using_CTRL-V* @@ -1093,16 +1104,20 @@ For starters: See section |40.2| in the user manual. - *E183* *user-cmd-ambiguous* + *E183* *E841* *user-cmd-ambiguous* All user defined commands must start with an uppercase letter, to avoid -confusion with builtin commands. (There are a few builtin commands, notably -:Next, :Print and :X, which do start with an uppercase letter. The builtin -will always take precedence in these cases). The other characters of the user -command can be uppercase letters, lowercase letters or digits. When using -digits, note that other commands that take a numeric argument may become -ambiguous. For example, the command ":Cc2" could be the user command ":Cc2" -without an argument, or the command ":Cc" with argument "2". It is advised to -put a space between the command name and the argument to avoid these problems. +confusion with builtin commands. Exceptions are these builtin commands: + :Next + :X +They cannot be used for a user defined command. ":Print" is also an existing +command, but it is deprecated and can be overruled. + +The other characters of the user command can be uppercase letters, lowercase +letters or digits. When using digits, note that other commands that take a +numeric argument may become ambiguous. For example, the command ":Cc2" could +be the user command ":Cc2" without an argument, or the command ":Cc" with +argument "2". It is advised to put a space between the command name and the +argument to avoid these problems. When using a user-defined command, the command can be abbreviated. However, if an abbreviation is not unique, an error will be issued. Furthermore, a @@ -1173,13 +1188,15 @@ command can take arguments, using the -nargs attribute. Valid cases are: -nargs=0 No arguments are allowed (the default) - -nargs=1 Exactly one argument is required - -nargs=* Any number of arguments are allowed (0, 1, or many) + -nargs=1 Exactly one argument is required, it includes spaces + -nargs=* Any number of arguments are allowed (0, 1, or many), + separated by white space -nargs=? 0 or 1 arguments are allowed -nargs=+ Arguments must be supplied, but any number are allowed Arguments are considered to be separated by (unescaped) spaces or tabs in this -context. +context, except when there is one argument, then the white space is part of +the argument. Note that arguments are used as text, not as expressions. Specifically, "s:var" will use the script-local variable in the script where the command was @@ -1202,23 +1219,32 @@ -complete=augroup autocmd groups -complete=buffer buffer names + -complete=behave :behave suboptions + -complete=color color schemes -complete=command Ex command (and arguments) + -complete=compiler compilers + -complete=cscope |:cscope| suboptions -complete=dir directory names -complete=environment environment variable names -complete=event autocommand events -complete=expression Vim expression -complete=file file and directory names + -complete=file_in_path file and directory names in |'path'| -complete=filetype filetype names |'filetype'| -complete=function function name -complete=help help subjects -complete=highlight highlight groups + -complete=history :history suboptions + -complete=locale locale names (as output of locale -a) -complete=mapping mapping name -complete=menu menus -complete=option options -complete=shellcmd Shell command + -complete=sign |:sign| suboptions -complete=syntax syntax file names |'syntax'| -complete=tag tags -complete=tag_listfiles tags, file names are shown when CTRL-D is hit + -complete=user user names -complete=var user variables -complete=custom,{func} custom completion, defined via {func} -complete=customlist,{func} custom completion, defined via {func} @@ -1285,7 +1311,8 @@ -range Range allowed, default is current line -range=% Range allowed, default is whole file (1,$) -range=N A count (default N) which is specified in the line - number position (like |:split|) + number position (like |:split|); allows for zero line + number. -count=N A count (default N) which is specified either in the line number position, or as an initial argument (like |:Next|). Specifying -count (without a default) acts like -count=0 diff -Naur vim73.orig/runtime/doc/mbyte.txt vim73/runtime/doc/mbyte.txt --- vim73.orig/runtime/doc/mbyte.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/mbyte.txt 2013-06-07 17:07:09.072316102 +0000 @@ -1,4 +1,4 @@ -*mbyte.txt* For Vim version 7.3. Last change: 2010 Jul 26 +*mbyte.txt* For Vim version 7.3. Last change: 2013 May 18 VIM REFERENCE MANUAL by Bram Moolenaar et al. @@ -48,9 +48,9 @@ If you already have a compiled Vim program, check if the |+multi_byte| feature is included. The |:version| command can be used for this. -If +multi_byte is not included, you should compile Vim with "big" features. -You can further tune what features are included. See the INSTALL files in the -source directory. +If +multi_byte is not included, you should compile Vim with "normal", "big" or +"huge" features. You can further tune what features are included. See the +INSTALL files in the source directory. LOCALE @@ -280,7 +280,7 @@ when compiled for EBCDIC). Supported 'encoding' values are: *encoding-values* -1 latin1 8-bit characters (ISO 8859-1) +1 latin1 8-bit characters (ISO 8859-1, also used for cp1252) 1 iso-8859-n ISO_8859 variant (n = 2 to 15) 1 koi8-r Russian 1 koi8-u Ukrainian @@ -336,7 +336,11 @@ Examples: > :set encoding=8bit-cp1252 :set encoding=2byte-cp932 -< + +The MS-Windows codepage 1252 is very similar to latin1. For practical reasons +the same encoding is used and it's called latin1. 'isprint' can be used to +display the characters 0x80 - 0xA0 or not. + Several aliases can be used, they are translated to one of the names above. An incomplete list: @@ -471,7 +475,7 @@ |charset| converter. Supported |charset|: ISO-2022-CN, ISO-2022-JP, ISO-2022-KR, EUC-CN, EUC-JP, EUC-KR, EUC-TW, UTF-7, UTF-8, ISO-8859 series, Shift_JIS, Big5 and HZ. Lv can be found at: - http://www.ff.iij4u.or.jp/~nrt/freeware/lv4495.tar.gz + http://www.ff.iij4u.or.jp/~nrt/lv/index.html *mbyte-conversion* @@ -611,7 +615,7 @@ charsets, such as JIS X 0208, if this field is 0, code points has the same value as GL, and GR if 1. -For example, in case of a 14 dots font corresponding to JIS X 0208, it is +For example, in case of a 16 dots font corresponding to JIS X 0208, it is written like: -misc-fixed-medium-r-normal--16-110-100-100-c-160-jisx0208.1990-0 @@ -793,8 +797,8 @@ number of Hira-gana characters are 76. So, first, we pre-input text as pronounced in Hira-gana, second, we convert Hira-gana to Kanji or Kata-Kana, if needed. There are some Kana-Kanji conversion server: jserver - (distributed with Wnn, see below) and canna. Canna could be found at: - ftp://ftp.nec.co.jp/pub/Canna/ (no longer works). + (distributed with Wnn, see below) and canna. Canna can be found at: + http://canna.sourceforge.jp/ There is a good input system: Wnn4.2. Wnn 4.2 contains, xwnmo (|IM-server|) @@ -853,7 +857,7 @@ USING XIM *multibyte-input* *E284* *E286* *E287* *E288* - *E285* *E291* *E292* *E290* *E289* + *E285* *E289* Note that Display and Input are independent. It is possible to see your language even though you have no input method for it. But when your Display @@ -1063,7 +1067,7 @@ is mapped to "A" and "b" to "B". Thus the first item is mapped to the second item. This is done for each line, until the end of the file. These items are exactly the same as what can be used in a |:lnoremap| command, -using "" to make the mappings local to the buffer.. +using "" to make the mappings local to the buffer. You can check the result with this command: > :lmap The two items must be separated by white space. You cannot include white @@ -1081,6 +1085,13 @@ used for the start of another character. The "accents" keymap uses this. *keymap-accents* +The first column can also be in |<>| form: + Ctrl-C + Alt-c + Alt-C +Note that the Alt mappings may not work, depending on your keyboard and +terminal. + Although it's possible to have more than one character in the second column, this is unusual. But you can use various ways to specify the character: > A a literal character @@ -1302,8 +1313,8 @@ character.) An exception is NUL (zero) which is displayed as "<00>". In the file and buffer the full range of Unicode characters can be used (31 -bits). However, displaying only works for 16 bit characters, and only for the -characters present in the selected font. +bits). However, displaying only works for the characters present in the +selected font. Useful commands: - "ga" shows the decimal, hexadecimal and octal value of the character under diff -Naur vim73.orig/runtime/doc/message.txt vim73/runtime/doc/message.txt --- vim73.orig/runtime/doc/message.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/message.txt 2013-06-07 17:07:09.098982692 +0000 @@ -1,4 +1,4 @@ -*message.txt* For Vim version 7.3. Last change: 2010 Aug 10 +*message.txt* For Vim version 7.3. Last change: 2013 Feb 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -27,8 +27,8 @@ This is especially useful if you accidentally typed at the hit-enter prompt. You are then back at the hit-enter prompt and can then scroll further back. -Note: when you stopped the output with "q" at the more prompt only up to that -point will be displayed. +Note: If the output has been stopped with "q" at the more prompt, it will only +be displayed up to this point. The previous command output is cleared when another command produces output. If you are using translated messages, the first printed line tells who @@ -65,7 +65,7 @@ LIST OF MESSAGES *E222* *E228* *E232* *E256* *E293* *E298* *E304* *E317* *E318* *E356* *E438* *E439* *E440* *E316* *E320* *E322* - *E323* *E341* *E473* *E570* *E685* > + *E323* *E341* *E473* *E570* *E685* > Add to read buffer makemap: Illegal mode Cannot create BalloonEval with both message and callback @@ -481,8 +481,10 @@ *E339* > Pattern too long -This only happens on systems with 16 bit ints: The compiled regexp pattern is +This happens on systems with 16 bit ints: The compiled regexp pattern is longer than about 65000 characters. Try using a shorter pattern. +It also happens when the offset of a rule doesn't fit in the space available. +Try simplifying the pattern. *E45* > 'readonly' option is set (add ! to override) @@ -728,7 +730,11 @@ Can't open file {filename} Can't read file {filename} -Vim cannot read a temporary file. +Vim cannot read a temporary file. Especially on Windows, this can be caused +by wrong escaping of special characters for cmd.exe; the approach was +changed with patch 7.3.443. Try using |shellescape()| for all shell arguments +given to |system()|, or explicitly add escaping with ^. Also see +'shellxquote' and 'shellxescape'. *E464* > Ambiguous use of user-defined command diff -Naur vim73.orig/runtime/doc/mlang.txt vim73/runtime/doc/mlang.txt --- vim73.orig/runtime/doc/mlang.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/mlang.txt 2013-06-07 17:07:09.105649340 +0000 @@ -1,4 +1,4 @@ -*mlang.txt* For Vim version 7.3. Last change: 2010 Jul 20 +*mlang.txt* For Vim version 7.3. Last change: 2012 Jan 15 VIM REFERENCE MANUAL by Bram Moolenaar @@ -59,7 +59,7 @@ system. Some systems accept aliases like "en" or "en_US", but some only accept the full specification like "en_US.ISO_8859-1". On Unix systems you can use - the this command to see what locales are supported: > + this command to see what locales are supported: > :!locale -a < With the "messages" argument the language used for messages is set. This can be different when you want, @@ -68,7 +68,7 @@ With the "ctype" argument the language used for character encoding is set. This affects the libraries that Vim was linked with. It's unusual to set this to - a different value from 'encoding'. This sets + a different value from 'encoding' or "C". This sets $LC_CTYPE. With the "time" argument the language used for time and date messages is set. This affects strftime(). diff -Naur vim73.orig/runtime/doc/motion.txt vim73/runtime/doc/motion.txt --- vim73.orig/runtime/doc/motion.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/motion.txt 2013-06-07 17:07:09.138982578 +0000 @@ -1,4 +1,4 @@ -*motion.txt* For Vim version 7.3. Last change: 2010 May 14 +*motion.txt* For Vim version 7.3. Last change: 2013 Mar 07 VIM REFERENCE MANUAL by Bram Moolenaar @@ -57,7 +57,7 @@ |>| > shift right |<| < shift left |zf| zf define a fold - |g@| g@ call function set with the 'operatorfunc' option + |g@| g@ call function set with the 'operatorfunc' option If the motion includes a count and the operator also had a count before it, the two counts are multiplied. For example: "2d3w" deletes six words. @@ -104,13 +104,14 @@ |Visual-mode|. You can use a ":" command for a motion. For example "d:call FindEnd()". -But this can't be redone with "." if the command is more than one line. +But this can't be repeated with "." if the command is more than one line. This can be repeated: > d:call search("f") This cannot be repeated: > d:if 1 call search("f") endif +Note that when using ":" any motion becomes characterwise exclusive. FORCING A MOTION TO BE LINEWISE, CHARACTERWISE OR BLOCKWISE @@ -269,11 +270,11 @@ {char} can be entered like with the |f| command. *;* -; Repeat latest f, t, F or T [count] times. +; Repeat latest f, t, F or T [count] times. See |cpo-;| *,* , Repeat latest f, t, F or T in opposite direction - [count] times. + [count] times. See also |cpo-;| ============================================================================== 3. Up-down motions *up-down-motions* @@ -326,6 +327,7 @@ non-blank character |linewise|. If 'startofline' not set, keep the same column. + *:[range]* :[range] Set the cursor on the last line number in [range]. [range] can also be just one line number, e.g., ":1" or ":'m". @@ -344,6 +346,8 @@ last number in it used as the byte count. End-of-line characters are counted depending on the current 'fileformat' setting. + Also see the |line2byte()| function, and the 'o' + option in 'statusline'. {not in Vi} {not available when compiled without the |+byte_offset| feature} @@ -511,6 +515,8 @@ These commands are {not in Vi}. These commands are not available when the |+textobjects| feature has been disabled at compile time. +Also see `gn` and `gN`, operating on the last search pattern. + *v_aw* *aw* aw "a word", select [count] words (see |word|). Leading or trailing white space is included, but not @@ -687,6 +693,7 @@ "daw" delete a word *daw* "diW" delete inner WORD (see |WORD|) *diW* "daW" delete a WORD (see |WORD|) *daW* + "dgn" delete the next search pattern match *dgn* "dd" delete one line |dd| "dis" delete inner sentence *dis* "das" delete a sentence *das* @@ -748,6 +755,13 @@ to be simulated by multiple commands. (does not move the cursor, this is not a motion command). + *m<* *m>* +m< or m> Set the |'<| or |'>| mark. Useful to change what the + `gv` command selects. (does not move the cursor, this + is not a motion command). + Note that the Visual mode cannot be set, only the + start and end position. + *:ma* *:mark* *E191* :[range]ma[rk] {a-zA-Z'} Set mark {a-zA-Z'} at last line number in [range], @@ -1015,8 +1029,6 @@ or *CTRL-I* ** CTRL-I Go to [count] newer cursor position in jump list (not a motion command). - In a |quickfix-window| it takes you to the position of - the error under the cursor. {not in Vi} {not available without the |+jumplist| feature} @@ -1033,20 +1045,20 @@ For example, after three jump commands you have this jump list: - jump line col file/line ~ + jump line col file/text ~ 3 1 0 some text ~ 2 70 0 another line ~ 1 1154 23 end. ~ > ~ -The "file/line" column shows the file name, or the text at the jump if it is +The "file/text" column shows the file name, or the text at the jump if it is in the current file (an indent is removed and a long line is truncated to fit in the window). You are currently in line 1167. If you then use the CTRL-O command, the cursor is put in line 1154. This results in: - jump line col file/line ~ + jump line col file/text ~ 2 1 0 some text ~ 1 70 0 another line ~ > 0 1154 23 end. ~ @@ -1076,7 +1088,7 @@ After the CTRL-O command that got you into line 1154 you could give another jump command (e.g., "G"). The jump list would then become: - jump line col file/line ~ + jump line col file/text ~ 4 1 0 some text ~ 3 70 0 another line ~ 2 1167 0 foo bar ~ diff -Naur vim73.orig/runtime/doc/netbeans.txt vim73/runtime/doc/netbeans.txt --- vim73.orig/runtime/doc/netbeans.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/netbeans.txt 2013-06-07 17:07:09.158982521 +0000 @@ -1,4 +1,4 @@ -*netbeans.txt* For Vim version 7.3. Last change: 2010 Jul 20 +*netbeans.txt* For Vim version 7.3. Last change: 2012 Jan 26 VIM REFERENCE MANUAL by Gordon Prieur et al. @@ -118,7 +118,8 @@ uncommenting a line with "--disable-netbeans" in the Makefile. Currently the NetBeans interface is supported by Vim running in a terminal and -by GVim when it is run with one of the following GUIs: GTK, GNOME, and Motif. +by GVim when it is run with one of the following GUIs: GTK, GNOME, Windows, +Athena and Motif. If Motif support is required the user must supply XPM libraries. See |workshop-xpm| for details on obtaining the latest version of XPM. @@ -262,6 +263,12 @@ plain UTF-8 text this protocol could also be used with any other communication mechanism. +Netbeans messages are processed when Vim is idle, waiting for user input. +When Vim is run in non-interactive mode, for example when running an automated +test case that sources a Vim script, the idle loop may not be called often +enough. In that case, insert |:sleep| commands in the Vim script. The |:sleep| +command does invoke Netbeans messages processing. + 6.1 Kinds of messages |nb-messages| 6.2 Terms |nb-terms| 6.3 Commands |nb-commands| @@ -819,7 +826,7 @@ ============================================================================== 7. NetBeans commands *netbeans-commands* - *:nbstart* *E511* + *:nbstart* *E511* *E838* :nbs[tart] {connection} Start a new Netbeans session with {connection} as the socket connection parameters. The format of {connection} is described in |netbeans-parameters|. @@ -832,11 +839,16 @@ signs. *:nbkey* -:nb[key] {key} Pass the {key} to the Vim Controller for processing - -When a hot-key has been installed with the specialKeys command, this command -can be used to generate a hotkey messages to the Vim Controller. The events -newDotAndMark, keyCommand and keyAtPos are generated (in this order). +:nb[key] {key} Pass the {key} to the Vim Controller for processing. + When a hot-key has been installed with the specialKeys + command, this command can be used to generate a hotkey + message to the Vim Controller. + This command can also be used to pass any text to the + Vim Controller. It is used by Pyclewn, for example, + to build the complete set of gdb commands as Vim user + commands. + The events newDotAndMark, keyCommand and keyAtPos are + generated (in this order). ============================================================================== diff -Naur vim73.orig/runtime/doc/options.txt vim73/runtime/doc/options.txt --- vim73.orig/runtime/doc/options.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/options.txt 2013-06-07 17:07:09.192315759 +0000 @@ -1,4 +1,4 @@ -*options.txt* For Vim version 7.3. Last change: 2010 Aug 15 +*options.txt* For Vim version 7.3. Last change: 2013 Jun 04 VIM REFERENCE MANUAL by Bram Moolenaar @@ -150,6 +150,18 @@ (the ^[ is a real here, use CTRL-V to enter it) The advantage over a mapping is that it works in all situations. +You can define any key codes, e.g.: > + :set t_xy=^[foo; +There is no warning for using a name that isn't recognized. You can map these +codes as you like: > + :map something +< *E846* +When a key code is not set, it's like it does not exist. Trying to get its +value will result in an error: > + :set t_kb= + :set t_kb + E846: Key code not set: t_kb + The t_xx options cannot be set from a |modeline| or in the |sandbox|, for security reasons. @@ -265,8 +277,10 @@ value, ":setlocal list" only changes the local value and ":e two" gets the global value. Note that if you do this next: > :e one -You will not get back the 'list' value as it was the last time you edited -"one". The options local to a window are not remembered for each buffer. +You will get back the 'list' value as it was the last time you edited "one". +The options local to a window are remembered for each buffer. This also +happens when the buffer is not loaded, but they are lost when the buffer is +wiped out |:bwipe|. *:setl* *:setlocal* :setl[ocal] ... Like ":set" but set only the value local to the @@ -289,9 +303,8 @@ copying the value. {not in Vi} -:se[t] {option}< Set the local value of {option} to its global value by - making it empty. Only makes sense for |global-local| - options. +:se[t] {option}< For |global-local| options: Remove the local value of + {option}, so that the global value will be used. {not in Vi} *:setg* *:setglobal* @@ -361,6 +374,7 @@ settings and syntax files to be loaded. {not in Vi} + *option-window* *optwin* :bro[wse] se[t] *:set-browse* *:browse-set* *:opt* *:options* :opt[ions] Open a window for viewing and setting all options. Options are grouped by function. @@ -388,6 +402,9 @@ contain non-id characters then. Note that if you want to use this for the "gf" command, you need to add the '{' and '}' characters to 'isfname'. +On MS-Windows, if $HOME is not defined as an environment variable, then +at runtime Vim will set it to the expansion of $HOMEDRIVE$HOMEPATH. + NOTE: expanding environment variables and "~/" is only done with the ":set" command, not when assigning a value to an option with ":let". @@ -684,6 +701,10 @@ when the system locale is set to one of CJK locales. See Unicode Standard Annex #11 (http://www.unicode.org/reports/tr11). + Vim may set this option automatically at startup time when Vim is + compiled with the |+termresponse| feature and if |t_u7| is set to the + escape sequence to request cursor position report. + *'antialias'* *'anti'* *'noantialias'* *'noanti'* 'antialias' 'anti' boolean (default: off) global @@ -729,7 +750,7 @@ - Reset the 'rightleft' option. - Disable the use of 'keymap' (without changing its value). Note that 'arabicshape' and 'delcombine' are not reset (it is a global - option. + option). Also see |arabic.txt|. *'arabicshape'* *'arshape'* @@ -741,7 +762,7 @@ feature} When on and 'termbidi' is off, the required visual character corrections that need to take place for displaying the Arabic language - take affect. Shaping, in essence, gets enabled; the term is a broad + take effect. Shaping, in essence, gets enabled; the term is a broad one which encompasses: a) the changing/morphing of characters based on their location within a word (initial, medial, final and stand-alone). @@ -802,7 +823,7 @@ been set. *'background'* *'bg'* -'background' 'bg' string (default "dark" or "light") +'background' 'bg' string (default "dark" or "light", see below) global {not in Vi} When set to "dark", Vim will try to use colors that look good on a @@ -836,6 +857,12 @@ color). To get around this, force the GUI window to be opened by putting a ":gui" command in the .gvimrc file, before where the value of 'background' is used (e.g., before ":syntax on"). + + For MS-DOS, Windows and OS/2 the default is "dark". + For other systems "dark" is used when 'term' is "linux", + "screen.linux", "cygwin" or "putty", or $COLORFGBG suggests a dark + background. Otherwise the default is "light". + Normally this option would be set in the .vimrc file. Possibly depending on the terminal name. Example: > :if &term == "pcterm" @@ -965,7 +992,7 @@ - The backup file will be created in the first directory in the list where this is possible. The directory must exist, Vim will not create it for you. - - Empty means that no backup file will be created ('patchmode' is + - Empty means that no backup file will be created ( 'patchmode' is impossible!). Writing may fail because of this. - A directory "." means to put the backup file in the same directory as the edited file. @@ -1026,6 +1053,11 @@ When $TMPDIR, $TMP or $TEMP is not defined, it is not used for the default value. "/tmp/*" is only used for Unix. + WARNING: Not having a backup file means that when Vim fails to write + your buffer correctly and then, for whatever reason, Vim exits, you + lose both the original file and what you were writing. Only disable + backups if you don't care about losing the file. + Note that environment variables are not expanded. If you want to use $HOME you must expand it explicitly, e.g.: > :let backupskip = escape(expand('$HOME'), '\') . '/tmp/*' @@ -1081,8 +1113,8 @@ Vim does not try to send a message to an external debugger (Netbeans or Sun Workshop). - The expression may be evaluated in the |sandbox|, see - |sandbox-option|. + The expression will be evaluated in the |sandbox| when set from a + modeline, see |sandbox-option|. It is not allowed to change text or jump to another window while evaluating 'balloonexpr' |textlock|. @@ -1198,7 +1230,8 @@ |:bwipeout| CAREFUL: when "unload", "delete" or "wipe" is used changes in a buffer - are lost without a warning. + are lost without a warning. Also, these values may break autocommands + that switch between buffers temporarily. This option is used together with 'buftype' and 'swapfile' to specify special kinds of buffers. See |special-buffers|. @@ -1425,6 +1458,7 @@ This option is a list of comma separated names. These names are recognized: + *clipboard-unnamed* unnamed When included, Vim will use the clipboard register '*' for all yank, delete, change and put operations which would normally go to the unnamed register. When a @@ -1434,6 +1468,20 @@ explicitly accessed using the "* notation. Also see |gui-clipboard|. + *clipboard-unnamedplus* + unnamedplus A variant of the "unnamed" flag which uses the + clipboard register '+' (|quoteplus|) instead of + register '*' for all yank, delete, change and put + operations which would normally go to the unnamed + register. When "unnamed" is also included to the + option, yank operations (but not delete, change or + put) will additionally copy the text into register + '*'. + Only available with the |+X11| feature. + Availability can be checked with: > + if has('unnamedplus') +< + *clipboard-autoselect* autoselect Works like the 'a' flag in 'guioptions': If present, then whenever Visual mode is started, or the Visual area extended, Vim tries to become the owner of the @@ -1445,9 +1493,16 @@ "autoselect" flag is used. Also applies to the modeless selection. + *clipboard-autoselectplus* + autoselectplus Like "autoselect" but using the + register instead of + the * register. Compare to the 'P' flag in + 'guioptions'. + + *clipboard-autoselectml* autoselectml Like "autoselect", but for the modeless selection only. Compare to the 'A' flag in 'guioptions'. + *clipboard-html* html When the clipboard contains HTML, use this when pasting. When putting text on the clipboard, mark it as HTML. This works to copy rendered HTML from @@ -1458,6 +1513,7 @@ Only supported for GTK version 2 and later. Only available with the |+multi_byte| feature. + *clipboard-exclude* exclude:{pattern} Defines a pattern that is matched against the name of the terminal 'term'. If there is a match, no @@ -1496,6 +1552,25 @@ feature} Number of screen lines to use for the command-line window. |cmdwin| + *'colorcolumn'* *'cc'* +'colorcolumn' 'cc' string (default "") + local to window + {not in Vi} + {not available when compiled without the |+syntax| + feature} + 'colorcolumn' is a comma separated list of screen columns that are + highlighted with ColorColumn |hl-ColorColumn|. Useful to align + text. Will make screen redrawing slower. + The screen column can be an absolute number, or a number preceded with + '+' or '-', which is added to or subtracted from 'textwidth'. > + + :set cc=+1 " highlight column after 'textwidth' + :set cc=+1,+2,+3 " highlight three columns after 'textwidth' + :hi ColorColumn ctermbg=lightgrey guibg=lightgrey +< + When 'textwidth' is zero then the items with '-' and '+' are not used. + A maximum of 256 columns are highlighted. + *'columns'* *'co'* *E594* 'columns' 'co' number (default 80 or terminal width) global @@ -1634,7 +1709,7 @@ when CTRL-P or CTRL-N are used. It is also used for whole-line completion |i_CTRL-X_CTRL-L|. It indicates the type of completion and the places to scan. It is a comma separated list of flags: - . scan the current buffer ('wrapscan' is ignored) + . scan the current buffer ( 'wrapscan' is ignored) w scan buffers from other windows b scan other loaded buffers that are in the buffer list u scan the unloaded buffers that are in the buffer list @@ -1680,7 +1755,8 @@ with CTRL-X CTRL-U. |i_CTRL-X_CTRL-U| See |complete-functions| for an explanation of how the function is invoked and what it should return. - + This option cannot be set from a |modeline| or in the |sandbox|, for + security reasons. *'completeopt'* *'cot'* 'completeopt' 'cot' string (default: "menu,preview") @@ -2069,6 +2145,12 @@ *cpo->* > When appending to a register, put a line break before the appended text. + *cpo-;* + ; When using |,| or |;| to repeat the last |t| search + and the cursor is right in front of the searched + character, the cursor won't move. When not included, + the cursor would skip over it and jump to the + following occurrence. POSIX flags. These are not included in the Vi default value, except when $VIM_POSIX was set on startup. |posix| @@ -2161,6 +2243,16 @@ Specifies whether to use quickfix window to show cscope results. See |cscopequickfix|. + *'cscoperelative'* *'csre'* +'cscoperelative' 'csre' boolean (default off) + global + {not available when compiled without the |+cscope| + feature} + {not in Vi} + In the absence of a prefix (-P) for cscope. setting this option enables + to use the basename of cscope.out path as the prefix. + See |cscoperelative|. + *'cscopetag'* *'cst'* *'nocscopetag'* *'nocst'* 'cscopetag' 'cst' boolean (default off) global @@ -2782,7 +2874,7 @@ See |file-formats| and |file-read|. For the character encoding of the file see 'fileencoding'. When 'binary' is set, the value of 'fileformat' is ignored, file I/O - works like it was set to "unix'. + works like it was set to "unix". This option is set automatically when starting to edit a file and 'fileformats' is not empty and 'binary' is off. When this option is set, after starting to edit a file, the 'modified' @@ -2817,13 +2909,14 @@ 2. If a is found and 'fileformats' includes "unix", 'fileformat' is set to "unix". Note that when a is found without a preceding , "unix" is preferred over "dos". - 3. If 'fileformats' includes "mac", 'fileformat' is set to "mac". - This means that "mac" is only chosen when "unix" is not present, - or when no is found in the file, and when "dos" is not - present, or no is present in the file. - Also if "unix" was first chosen, but the first is before - the first and there appears to be more 's than 's in - the file, then 'fileformat' is set to "mac". + 3. If 'fileformat' has not yet been set, and if 'fileformats' + includes "mac", 'fileformat' is set to "mac". + This means that "mac" is only chosen when: + "unix" is not present or no is found in the file, and + "dos" is not present or no is found in the file. + Except: if "unix" was chosen, but there is a before + the first , and there appear to be more s than s in + the first few lines, "mac" is used. 4. If 'fileformat' is still not set, the first name from 'fileformats' is used. When reading a file into an existing buffer, the same is done, but @@ -2831,6 +2924,9 @@ file only, the option is not changed. When 'binary' is set, the value of 'fileformats' is not used. + Note that when Vim starts up with an empty buffer this option is not + used. Set 'fileformat' in your .vimrc instead. + For systems with a Dos-like (), when reading files that are ":source"ed and for vimrc files, automatic detection may be done: @@ -2847,6 +2943,14 @@ NOTE: This option is set to the Vi default value when 'compatible' is set and to the Vim default value when 'compatible' is reset. + *'fileignorecase'* *'fic'* *'nofileignorecase'* *'nofic'* +'fileignorecase' 'fic' boolean (default on for systems where case in file + names is normally ignored) + global + {not in Vi} + When set case is ignored when using file names and directories. + See 'wildignorecase' for only ignoring case when doing completion. + *'filetype'* *'ft'* 'filetype' 'ft' string (default: "") local to buffer @@ -2871,8 +2975,6 @@ This will use the "c" filetype first, then the "doxygen" filetype. This works both for filetype plugins and for syntax files. More than one dot may appear. - Do not confuse this option with 'osfiletype', which is for the file - type that is actually stored with the file. This option is not copied to another buffer, independent of the 's' or 'S' flag in 'cpoptions'. Only normal file name characters can be used, "/\*?[|<>" are illegal. @@ -2966,8 +3068,8 @@ The expression used for when 'foldmethod' is "expr". It is evaluated for each line to obtain its fold level. See |fold-expr|. - The expression may be evaluated in the |sandbox|, see - |sandbox-option|. + The expression will be evaluated in the |sandbox| if set from a + modeline, see |sandbox-option|. This option can't be set from a |modeline| when the 'diff' option is on. @@ -3044,9 +3146,11 @@ {not in Vi} {not available when compiled without the |+folding| feature} - Sets the minimum number of screen lines for a fold to be displayed - closed. Also for manually closed folds. - Note that this only has an effect of what is displayed. After using + Sets the number of screen lines above which a fold can be displayed + closed. Also for manually closed folds. With the default value of + one a fold can only be closed if it takes up two or more screen lines. + Set to zero to be able to close folds of just one screen line. + Note that this only has an effect on what is displayed. After using "zc" to close a fold, which is displayed open because it's smaller than 'foldminlines', a following "zc" may close a containing fold. @@ -3070,6 +3174,10 @@ Specifies for which type of commands folds will be opened, if the command moves the cursor into a closed fold. It is a comma separated list of items. + NOTE: When the command is part of a mapping this option is not used. + Add the |zv| command to the mapping to get the same effect. + (rationale: the mapping may want to control opening folds itself) + item commands ~ all any block "(", "{", "[[", "[{", etc. @@ -3084,8 +3192,6 @@ Also for |[s| and |]s|. tag jumping to a tag: ":ta", CTRL-T, etc. undo undo or redo: "u" and CTRL-R - When the command is part of a mapping this option is not used. Add - the |zv| command to the mapping to get the same effect. When a movement command is used for an operator (e.g., "dl" or "y%") this option is not used. This means the operator will include the whole closed fold. @@ -3105,8 +3211,8 @@ An expression which is used to specify the text displayed for a closed fold. See |fold-foldtext|. - The expression may be evaluated in the |sandbox|, see - |sandbox-option|. + The expression will be evaluated in the |sandbox| if set from a + modeline, see |sandbox-option|. It is not allowed to change text or jump to another window while evaluating 'foldtext' |textlock|. @@ -3151,8 +3257,8 @@ format function will be used |C-indenting|. Environment variables are expanded |:set_env|. See |option-backslash| about including spaces and backslashes. - The expression may be evaluated in the |sandbox|, see - |sandbox-option|. + This option cannot be set from a |modeline| or in the |sandbox|, for + security reasons. *'formatexpr'* *'fex'* 'formatexpr' 'fex' string (default "") @@ -3185,8 +3291,9 @@ When the expression evaluates to non-zero Vim will fall back to using the internal format mechanism. - The expression may be evaluated in the |sandbox|, see - |sandbox-option|. + The expression will be evaluated in the |sandbox| when set from a + modeline, see |sandbox-option|. That stops the option from working, + since changing the buffer text is not allowed. *'fsync'* *'fs'* 'fsync' 'fs' boolean (default on) @@ -3338,7 +3445,7 @@ :highlight Cursor gui=NONE guifg=bg guibg=fg < *'guifont'* *'gfn'* - *E235* *E596* *E610* *E611* + *E235* *E596* 'guifont' 'gfn' string (default "") global {not in Vi} @@ -3470,6 +3577,10 @@ to set 'guifontwide' at all unless you want to override the choice made by Pango/Xft. + Windows +multibyte only: *guifontwide_win_mbyte* + + If set and valid, 'guifontwide' is used for IME instead of 'guifont'. + *'guiheadroom'* *'ghr'* 'guiheadroom' 'ghr' number (default 50) global @@ -3483,8 +3594,8 @@ screen. *'guioptions'* *'go'* -'guioptions' 'go' string (default "gmrLtT" (MS-Windows), - "agimrLtT" (GTK, Motif and Athena)) +'guioptions' 'go' string (default "egmrLtT" (MS-Windows), + "aegimrLtT" (GTK, Motif and Athena)) global {not in Vi} {only available when compiled with GUI enabled} @@ -3510,6 +3621,9 @@ windowing system's global selection unless explicitly told to by a yank or delete operation for the "* register. The same applies to the modeless selection. + *'go-P'* + 'P' Like autoselect but using the "+ register instead of the "* + register. *'go-A'* 'A' Autoselect for the modeless selection. Like 'a', but only applies to the modeless selection. @@ -3698,9 +3812,10 @@ 'highlight' 'hl' string (default (as a single string): "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,w:WarningMsg,W:WildMenu, + M:ModeMsg,n:LineNr,N:CursorLineNr, + r:Question,s:StatusLine,S:StatusLineNC, + c:VertSplit, t:Title,v:Visual, + w:WarningMsg,W:WildMenu, f:Folded,F:FoldColumn,A:DiffAdd, C:DiffChange,D:DiffDelete,T:DiffText, >:SignColumn,B:SpellBad,P:SpellCap, @@ -3726,6 +3841,8 @@ |hl-ModeMsg| M Mode (e.g., "-- INSERT --") |hl-LineNr| n line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. + |hl-CursorLineNr| N like n for when 'cursorline' or 'relativenumber' is + set. |hl-Question| r |hit-enter| prompt and yes/no questions |hl-StatusLine| s status line of current window |status-line| |hl-StatusLineNC| S status lines of not-current windows @@ -3787,14 +3904,16 @@ are not applied. See also: 'incsearch' and |:match|. When you get bored looking at the highlighted matches, you can turn it - off with |:nohlsearch|. As soon as you use a search command, the - highlighting comes back. + off with |:nohlsearch|. This does not change the option value, as + soon as you use a search command, the highlighting comes back. 'redrawtime' specifies the maximum time spent on finding matches. When the search pattern can match an end-of-line, Vim will try to highlight all of the matched text. However, this depends on where the search starts. This will be the first line in the window or the first line below a closed fold. A match in a previous line which is not drawn may not continue in a newly drawn line. + You can specify whether the highlight status is restored on startup + with the 'h' flag in 'viminfo' |viminfo-h|. NOTE: This option is reset when 'compatible' is set. *'history'* *'hi'* @@ -4003,8 +4122,8 @@ found. Allows doing "gf" on the name after an 'include' statement. Also used for ||. - The expression may be evaluated in the |sandbox|, see - |sandbox-option|. + The expression will be evaluated in the |sandbox| when set from a + modeline, see |sandbox-option|. It is not allowed to change text or jump to another window while evaluating 'includeexpr' |textlock|. @@ -4047,7 +4166,8 @@ It is used when a new line is created, for the |=| operator and in Insert mode as specified with the 'indentkeys' option. When this option is not empty, it overrules the 'cindent' and - 'smartindent' indenting. + 'smartindent' indenting. When 'lisp' is set, this option is + overridden by the Lisp indentation algorithm. When 'paste' is set this option is not used for indenting. The expression is evaluated with |v:lnum| set to the line number for which the indent is to be computed. The cursor is also in this line @@ -4067,8 +4187,8 @@ See |indent-expression|. NOTE: This option is made empty when 'compatible' is set. - The expression may be evaluated in the |sandbox|, see - |sandbox-option|. + The expression will be evaluated in the |sandbox| when set from a + modeline, see |sandbox-option|. It is not allowed to change text or jump to another window while evaluating 'indentexpr' |textlock|. @@ -4270,6 +4390,8 @@ "echo &key". This is to avoid showing it to someone who shouldn't know. It also means you cannot see it yourself once you have set it, be careful not to make a typing error! + You can use "&key" in an expression to detect whether encryption is + enabled. When 'key' is set it returns "*****" (five stars). *'keymap'* *'kmp'* *E544* 'keymap' 'kmp' string (default "") @@ -4495,24 +4617,31 @@ {not in Vi} Strings to use in 'list' mode and for the |:list| command. It is a comma separated list of string settings. + *lcs-eol* eol:c Character to show at the end of each line. When omitted, there is no extra character at the end of the line. + *lcs-tab* tab:xy Two characters to be used to show a tab. The first char is used once. The second char is repeated to fill the space that the tab normally occupies. "tab:>-" will show a tab that takes four spaces as ">---". When omitted, a tab is show as ^I. + *lcs-trail* trail:c Character to show for trailing spaces. When omitted, trailing spaces are blank. + *lcs-extends* extends:c Character to show in the last column, when 'wrap' is off and the line continues beyond the right of the screen. + *lcs-precedes* precedes:c Character to show in the first column, when 'wrap' is off and there is text preceding the character visible in the first column. + *lcs-conceal* conceal:c Character to show in place of concealed text, when 'conceallevel' is set to 1. + *lcs-nbsp* nbsp:c Character to show for a non-breakable space (character 0xA0, 160). Left blank when omitted. @@ -4601,32 +4730,15 @@ < This option cannot be set from a |modeline| or in the |sandbox|, for security reasons. - *'colorcolumn'* *'cc'* -'colorcolumn' 'cc' string (default "") - local to window - {not in Vi} - {not available when compiled without the |+syntax| - feature} - 'colorcolumn' is a comma separated list of screen columns that are - highlighted with ColorColumn |hl-ColorColumn|. Useful to align - text. Will make screen redrawing slower. - The screen column can be an absolute number, or a number preceded with - '+' or '-', which is added to or subtracted from 'textwidth'. > - - :set cc=+1 " highlight column after 'textwidth' - :set cc=+1,+2,+3 " highlight three columns after 'textwidth' - :hi ColorColumn ctermbg=lightgrey guibg=lightgrey -< - When 'textwidth' is zero then the items with '-' and '+' are not used. - A maximum of 256 columns are highlighted. - *'matchpairs'* *'mps'* 'matchpairs' 'mps' string (default "(:),{:},[:]") local to buffer {not in Vi} Characters that form pairs. The |%| command jumps from one to the - other. Currently only single byte character pairs are allowed, and - they must be different. The characters must be separated by a colon. + other. + Only character pairs are allowed that are different, thus you cannot + jump between two double quotes. + The characters must be separated by a colon. The pairs must be separated by a comma. Example for including '<' and '>' (HTML): > :set mps+=<:> @@ -4806,6 +4918,10 @@ written. A ":set nomodified" command also resets the original values to the current values and the 'modified' option will be reset. + This option is not set when a change is made to the buffer as the + result of a BufNewFile, BufRead/BufReadPost, BufWritePost, + FileAppendPost or VimLeave autocommand event. See |gzip-example| for + an explanation. When 'buftype' is "nowrite" or "nofile" this option may be set, but will be ignored. @@ -4994,7 +5110,7 @@ respectively; see |CTRL-A| for more info on these commands. alpha If included, single alphabetical characters will be incremented or decremented. This is useful for a list with a - letter index a), b), etc. *octal-number* + letter index a), b), etc. *octal-nrformats* octal If included, numbers that start with a zero will be considered to be octal. Example: Using CTRL-A on "007" results in "010". hex If included, numbers starting with "0x" or "0X" will be @@ -5014,8 +5130,20 @@ number. When a long, wrapped line doesn't start with the first character, '-' characters are put before the number. - See |hl-LineNr| for the highlighting used for the number. - When setting this option, 'relativenumber' is reset. + See |hl-LineNr| and |hl-CursorLineNr| for the highlighting used for + the number. + *number_relativenumber* + The 'relativenumber' option changes the displayed number to be + relative to the cursor. Together with 'number' there are these + four combinations (cursor in line 3): + + 'nonu' 'nu' 'nonu' 'nu' + 'nornu' 'nornu' 'rnu' 'rnu' + + |apple | 1 apple | 2 apple | 2 apple + |pear | 2 pear | 1 pear | 1 pear + |nobody | 3 nobody | 0 nobody |3 nobody + |there | 4 there | 1 there | 1 there *'numberwidth'* *'nuw'* 'numberwidth' 'nuw' number (Vim default: 4 Vi default: 8) @@ -5047,6 +5175,8 @@ invoked and what it should return. This option is usually set by a filetype plugin: |:filetype-plugin-on| + This option cannot be set from a |modeline| or in the |sandbox|, for + security reasons. *'opendevice'* *'odev'* *'noopendevice'* *'noodev'* @@ -5072,20 +5202,12 @@ security reasons. - *'osfiletype'* *'oft'* *E366* -'osfiletype' 'oft' string (RISC-OS default: "Text", - others default: "") + *'osfiletype'* *'oft'* +'osfiletype' 'oft' string (default: "") local to buffer {not in Vi} - {only available when compiled with the |+osfiletype| - feature} - Some operating systems store extra information about files besides - name, datestamp and permissions. This option contains the extra - information, the nature of which will vary between systems. - The value of this option is usually set when the file is loaded, and - is used to set the operating system file type when file is written. - It can affect the pattern matching of the automatic commands. - |autocmd-osfiletypes| + This option was supported on RISC OS, which has been removed. + *'paragraphs'* *'para'* 'paragraphs' 'para' string (default "IPLPPPQPP TPHPLIPpLpItpplpipbp") @@ -5190,7 +5312,7 @@ recognized as a compressed file. Only normal file name characters can be used, "/\*?[|<>" are illegal. - *'path'* *'pa'* *E343* *E345* *E347* + *'path'* *'pa'* *E343* *E345* *E347* *E854* 'path' 'pa' string (default on Unix: ".,/usr/include,," on OS/2: ".,/emx/include,," other systems: ".,,") @@ -5405,6 +5527,19 @@ matches will be highlighted. This is used to avoid that Vim hangs when using a very complicated pattern. + *'regexpengine'* *'re'* +'regexpengine' 're' number (default 0) + global + {not in Vi} + This selects the default regexp engine. |two-engines| + The possible values are: + 0 automatic selection + 1 old engine + 2 NFA engine + Note that when using the NFA engine and the pattern contains something + that is not supported the pattern will not match. This is only useful + for debugging the regexp engine. + *'relativenumber'* *'rnu'* *'norelativenumber'* *'nornu'* 'relativenumber' 'rnu' boolean (default off) local to window @@ -5421,8 +5556,12 @@ number. When a long, wrapped line doesn't start with the first character, '-' characters are put before the number. - See |hl-LineNr| for the highlighting used for the number. - When setting this option, 'number' is reset. + See |hl-LineNr| and |hl-CursorLineNr| for the highlighting used for + the number. + + The number in front of the cursor line also depends on the value of + 'number', see |number_relativenumber| for all combinations of the two + options. *'remap'* *'noremap'* 'remap' boolean (default on) @@ -5843,16 +5982,20 @@ security reasons. *'shellcmdflag'* *'shcf'* -'shellcmdflag' 'shcf' string (default: "-c", MS-DOS and Win32, when 'shell' - does not contain "sh" somewhere: "/c") +'shellcmdflag' 'shcf' string (default: "-c"; + MS-DOS and Win32, when 'shell' does not + contain "sh" somewhere: "/c") global {not in Vi} Flag passed to the shell to execute "!" and ":!" commands; e.g., "bash.exe -c ls" or "command.com /c dir". For the MS-DOS-like systems, the default is set according to the value of 'shell', to reduce the need to set this option by the user. It's not used for - OS/2 (EMX figures this out itself). See |option-backslash| about - including spaces and backslashes. See |dos-shell|. + OS/2 (EMX figures this out itself). + On Unix it can have more than one flag. Each white space separated + part is passed as an argument to the shell command. + See |option-backslash| about including spaces and backslashes. + Also see |dos-shell| for MS-DOS and MS-Windows. This option cannot be set from a |modeline| or in the |sandbox|, for security reasons. @@ -5873,9 +6016,10 @@ For Unix the default it "| tee". The stdout of the compiler is saved in a file and echoed to the screen. If the 'shell' option is "csh" or "tcsh" after initializations, the default becomes "|& tee". If the - 'shell' option is "sh", "ksh", "zsh" or "bash" the default becomes - "2>&1| tee". This means that stderr is also included. Before using - the 'shell' option a path is removed, thus "/bin/sh" uses "sh". + 'shell' option is "sh", "ksh", "mksh", "pdksh", "zsh" or "bash" the + default becomes "2>&1| tee". This means that stderr is also included. + Before using the 'shell' option a path is removed, thus "/bin/sh" uses + "sh". The initialization of this option is done after reading the ".vimrc" and the other initializations, so that when the 'shell' option is set there, the 'shellpipe' option changes automatically, unless it was @@ -5954,7 +6098,8 @@ {not in Vi} When on, use temp files for shell commands. When off use a pipe. When using a pipe is not possible temp files are used anyway. - Currently a pipe is only supported on Unix. You can check it with: > + Currently a pipe is only supported on Unix and MS-Windows 2K and + later. You can check it with: > :if has("filterpipe") < The advantage of using a pipe is that nobody can read the temp file and the 'shell' command does not need to support redirection. @@ -5978,8 +6123,18 @@ 0 and 2: use "shell 'shellcmdflag' cmd" to start external commands 1 and 3: use "shell cmd" to start external commands + *'shellxescape'* *'sxe'* +'shellxescape' 'sxe' string (default: ""; + for MS-DOS and MS-Windows: "\"&|<>()@^") + global + {not in Vi} + When 'shellxquote' is set to "(" then the characters listed in this + option will be escaped with a '^' character. This makes it possible + to execute most external commands with cmd.exe. + *'shellxquote'* *'sxq'* 'shellxquote' 'sxq' string (default: ""; + for Win32, when 'shell' is cmd.exe: "(" for Win32, when 'shell' contains "sh" somewhere: "\"" for Unix, when using system(): "\"") @@ -5989,11 +6144,15 @@ the "!" and ":!" commands. Includes the redirection. See 'shellquote' to exclude the redirection. It's probably not useful to set both options. - This is an empty string by default. Known to be useful for - third-party shells when using the Win32 version, such as the MKS Korn - Shell or bash, where it should be "\"". The default is adjusted - according the value of 'shell', to reduce the need to set this option - by the user. See |dos-shell|. + When the value is '(' then ')' is appended. When the value is '"(' + then ')"' is appended. + When the value is '(' then also see 'shellxescape'. + This is an empty string by default on most systems, but is known to be + useful for on Win32 version, either for cmd.exe which automatically + strips off the first and last quote on a command, or 3rd-party shells + such as the MKS Korn Shell or bash, where it should be "\"". The + default is adjusted according the value of 'shell', to reduce the need + to set this option by the user. See |dos-shell|. This option cannot be set from a |modeline| or in the |sandbox|, for security reasons. @@ -6011,6 +6170,8 @@ local to buffer Number of spaces to use for each step of (auto)indent. Used for |'cindent'|, |>>|, |<<|, etc. + When zero the 'ts' value will be used. Use the |shiftwidth()| + function to get the effective shiftwidth value. *'shortmess'* *'shm'* 'shortmess' 'shm' string (Vim default "filnxtToO", Vi default: "", @@ -6214,7 +6375,7 @@ Override the 'ignorecase' option if the search pattern contains upper case characters. Only used when the search pattern is typed and 'ignorecase' option is on. Used for the commands "/", "?", "n", "N", - ":g" and ":s". Not used for "*", "#", "gd", tag search, etc.. After + ":g" and ":s". Not used for "*", "#", "gd", tag search, etc. After "*" and "#" you can make 'smartcase' used by doing a "/" command, recalling the search pattern from history and hitting . NOTE: This option is reset when 'compatible' is set. @@ -6228,8 +6389,9 @@ Do smart autoindenting when starting a new line. Works for C-like programs, but can also be used for other languages. 'cindent' does something like this, works better in most cases, but is more strict, - see |C-indenting|. When 'cindent' is on, setting 'si' has no effect. - 'indentexpr' is a more advanced alternative. + see |C-indenting|. When 'cindent' is on or 'indentexpr' is set, + setting 'si' has no effect. 'indentexpr' is a more advanced + alternative. Normally 'autoindent' should also be on when using 'smartindent'. An indent is automatically inserted: - After a line ending in '{'. @@ -6273,6 +6435,7 @@ of 8, while being able to edit like it is set to 'sts'. However, commands like "x" still work on the actual characters. When 'sts' is zero, this feature is off. + When 'sts' is negative, the value of 'shiftwidth' is used. 'softtabstop' is set to 0 when the 'paste' option is set. See also |ins-expandtab|. When 'expandtab' is not set, the number of spaces is minimized by using s. @@ -6467,7 +6630,7 @@ where it was the last time the buffer was edited. NOTE: This option is set when 'compatible' is set. - *'statusline'* *'stl'* *E540* *E541* *E542* + *'statusline'* *'stl'* *E540* *E542* 'statusline' 'stl' string (default empty) global or local to window |global-local| {not in Vi} @@ -6480,12 +6643,15 @@ normal text. Each status line item is of the form: %-0{minwid}.{maxwid}{item} All fields except the {item} is optional. A single percent sign can - be given as "%%". Up to 80 items can be specified. + be given as "%%". Up to 80 items can be specified. *E541* When the option starts with "%!" then it is used as an expression, evaluated and the result is used as the option value. Example: > :set statusline=%!MyStatusLine() < The result can contain %{} items that will be evaluated too. + Note that the "%!" expression is evaluated in the context of the + current window and buffer, while %{} items are evaluated in the + context of the window that the statusline belongs to. When there is error while evaluating the option then it will be made empty to avoid further errors. Otherwise screen updating would loop. @@ -6533,7 +6699,7 @@ k S Value of "b:keymap_name" or 'keymap' when |:lmap| mappings are being used: "" n N Buffer number. - b N Value of byte under cursor. + b N Value of character under cursor. B N As above, in hexadecimal. o N Byte number in file of byte under cursor, first byte is 1. Mnemonic: Offset from start of file (with one added) @@ -6591,8 +6757,8 @@ The variable "actual_curbuf" is set to the 'bufnr()' number of the real current buffer. - The 'statusline' option may be evaluated in the |sandbox|, see - |sandbox-option|. + The 'statusline' option will be evaluated in the |sandbox| if set from + a modeline, see |sandbox-option|. It is not allowed to change text or jump to another window while evaluating 'statusline' |textlock|. @@ -6705,8 +6871,8 @@ usetab Like "useopen", but also consider windows in other tab pages. split If included, split the current window before loading - a buffer. Otherwise: do not split, use current window. - Supported in |quickfix| commands that display errors. + a buffer for a |quickfix| command that display errors. + Otherwise: do not split, use current window. newtab Like "split", but open a new tab page. Overrules "split" when both are present. @@ -6960,7 +7126,7 @@ {not in Vi} Encoding used for the terminal. This specifies what character encoding the keyboard produces and the display will understand. For - the GUI it only applies to the keyboard ('encoding' is used for the + the GUI it only applies to the keyboard ( 'encoding' is used for the display). Except for the Mac when 'macatsui' is off, then 'termencoding' should be "macroman". In the Win32 console version the default value is the console codepage @@ -7035,8 +7201,8 @@ the file should contain words with similar meaning, separated by non-keyword characters (white space is preferred). Maximum line length is 510 bytes. - To obtain a file to be used here, check out the wordlist FAQ at - http://www.hyphenologist.co.uk . + To obtain a file to be used here, check out this ftp site: + ftp://ftp.ox.ac.uk/pub/wordlists/ First get the README file. To include a comma in a file name precede it with a backslash. Spaces after a comma are ignored, otherwise spaces are included in the file name. See |option-backslash| about using backslashes. @@ -7311,6 +7477,12 @@ jsbterm JSB term mouse handling. *pterm-mouse* pterm QNX pterm mouse handling. + *urxvt-mouse* + urxvt Mouse handling for the urxvt (rxvt-unicode) terminal. + *sgr-mouse* + sgr Mouse handling for the terminal that emits SGR-styled + mouse reporting. Works with xterm version 277 or + later. The mouse handling must be enabled at compile time |+mouse_xterm| |+mouse_dec| |+mouse_netterm|. @@ -7323,6 +7495,7 @@ or "xterm2" already. The main use of this option is to set it to "xterm", when the terminal name doesn't start with "xterm", but it can handle xterm mouse codes. + The "sgr" value will be set if the xterm version is 277 or later. The "xterm2" value will be set if the xterm version is reported to be 95 or higher. This only works when compiled with the |+termresponse| feature and if |t_RV| is set to the escape sequence to request the @@ -7362,7 +7535,7 @@ given, no further entry is used. See |undo-persistence|. - *'undofile'* *'udf'* + *'undofile'* *'noundofile'* *'udf'* *'noudf'* 'undofile' 'udf' boolean (default off) local to buffer {not in Vi} @@ -7374,7 +7547,7 @@ For more information about this feature see |undo-persistence|. The undo file is not read when 'undoreload' causes the buffer from before a reload to be saved for undo. - WARNING: this is a very new feature. Use at your own risk! + When 'undofile' is turned off the undo file is NOT deleted. *'undolevels'* *'ul'* 'undolevels' 'ul' number (default 100, 1000 for Unix, VMS, @@ -7527,15 +7700,18 @@ parameter. The following is a list of the identifying characters and the effect of their value. CHAR VALUE ~ + *viminfo-!* ! When included, save and restore global variables that start with an uppercase letter, and don't contain a lowercase letter. Thus "KEEPTHIS and "K_L_M" are stored, but "KeepThis" - and "_K_L_M" are not. Only String and Number types are - stored. + and "_K_L_M" are not. Nested List and Dict items may not be + read back correctly, you end up with an empty item. + *viminfo-quote* " Maximum number of lines saved for each register. Old name of the '<' item, with the disadvantage that you need to put a backslash before the ", otherwise it will be recognized as the start of a comment! + *viminfo-%* % When included, save and restore the buffer list. If Vim is started with a file name argument, the buffer list is not restored. If Vim is started without a file name argument, the @@ -7545,38 +7721,48 @@ When followed by a number, the number specifies the maximum number of buffers that are stored. Without a number all buffers are stored. + *viminfo-'* ' Maximum number of previously edited files for which the marks are remembered. This parameter must always be included when 'viminfo' is non-empty. Including this item also means that the |jumplist| and the |changelist| are stored in the viminfo file. + *viminfo-/* / Maximum number of items in the search pattern history to be saved. If non-zero, then the previous search and substitute patterns are also saved. When not included, the value of 'history' is used. + *viminfo-:* : Maximum number of items in the command-line history to be saved. When not included, the value of 'history' is used. + *viminfo-<* < Maximum number of lines saved for each register. If zero then registers are not saved. When not included, all lines are saved. '"' is the old name for this item. Also see the 's' item below: limit specified in Kbyte. + *viminfo-@* @ Maximum number of items in the input-line history to be saved. When not included, the value of 'history' is used. + *viminfo-c* c When included, convert the text in the viminfo file from the 'encoding' used when writing the file to the current 'encoding'. See |viminfo-encoding|. + *viminfo-f* f Whether file marks need to be stored. If zero, file marks ('0 to '9, 'A to 'Z) are not stored. When not present or when non-zero, they are all stored. '0 is used for the current cursor position (when exiting or when doing ":wviminfo"). + *viminfo-h* h Disable the effect of 'hlsearch' when loading the viminfo file. When not included, it depends on whether ":nohlsearch" has been used since the last search command. + *viminfo-n* n Name of the viminfo file. The name must immediately follow the 'n'. Must be the last one! If the "-i" argument was given when starting Vim, that file name overrides the one given here with 'viminfo'. Environment variables are expanded when opening the file, not when setting the option. + *viminfo-r* r Removable media. The argument is a string (up to the next ','). This parameter can be given several times. Each specifies the start of a path for which no marks will be @@ -7585,6 +7771,7 @@ also use it for temp files, e.g., for Unix: "r/tmp". Case is ignored. Maximum length of each 'r' argument is 50 characters. + *viminfo-s* s Maximum size of an item in Kbyte. If zero then registers are not saved. Currently only applies to registers. The default "s10" will exclude registers with more than 10 Kbyte of text. @@ -7736,9 +7923,9 @@ {not available when compiled without the |+wildignore| feature} A list of file patterns. A file that matches with one of these - patterns is ignored when completing file or directory names, and - influences the result of |expand()|, |glob()| and |globpath()| unless - a flag is passed to disable this. + patterns is ignored when expanding |wildcards|, completing file or + directory names, and influences the result of |expand()|, |glob()| and + |globpath()| unless a flag is passed to disable this. The pattern is used like with |:autocmd|, see |autocmd-patterns|. Also see 'suffixes'. Example: > @@ -7747,6 +7934,17 @@ a pattern from the list. This avoids problems when a future version uses another default. + + *'wildignorecase'* *'wic'* *'nowildignorecase'* *'nowic'* +'wildignorecase' 'wic' boolean (default off) + global + {not in Vi} + When set case is ignored when completing file names and directories. + Has no effect when 'fileignorecase' is set. + Does not apply when the shell is used to expand wildcards, which + happens when there are special characters. + + *'wildmenu'* *'wmnu'* *'nowildmenu'* *'nowmnu'* 'wildmenu' 'wmnu' boolean (default off) global @@ -7761,6 +7959,7 @@ CTRL-P/CTRL-N, cause the highlight to move to the appropriate match. When 'wildmode' is used, "wildmenu" mode is used where "full" is specified. "longest" and "list" do not start "wildmenu" mode. + You can check the current mode with |wildmenumode()|. If there are more matches than can fit in the line, a ">" is shown on the right and/or a "<" is shown on the left. The status line scrolls as needed. @@ -8029,8 +8228,13 @@ {not in Vi} Make a backup before overwriting a file. The backup is removed after the file was successfully written, unless the 'backup' option is - also on. Reset this option if your file system is almost full. See - |backup-table| for another explanation. + also on. + WARNING: Switching this option off means that when Vim fails to write + your buffer correctly and then, for whatever reason, Vim exits, you + lose both the original file and what you were writing. Only reset + this option if your file system is almost full and it makes the write + fail (and make sure not to exit Vim until the write was successful). + See |backup-table| for another explanation. When the 'backupskip' pattern matches, a backup is not made anyway. NOTE: This option is set to the default value when 'compatible' is set. diff -Naur vim73.orig/runtime/doc/os_risc.txt vim73/runtime/doc/os_risc.txt --- vim73.orig/runtime/doc/os_risc.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/os_risc.txt 2013-06-07 17:07:09.345648655 +0000 @@ -1,322 +1,12 @@ -*os_risc.txt* For Vim version 7.3. Last change: 2010 Aug 07 +*os_risc.txt* For Vim version 7.3. Last change: 2011 May 10 VIM REFERENCE MANUAL by Thomas Leonard *riscos* *RISCOS* *RISC-OS* -This file contains the particularities for the RISC OS version of Vim. +The RISC OS support has been removed from Vim with patch 7.3.187. +If you would like to use Vim on RISC OS get the files from before that patch. -The RISC OS port is a completely new port and is not based on the old "archi" -port. -1. File locations |riscos-locations| -2. Filename munging |riscos-munging| -3. Command-line use |riscos-commandline| -4. Desktop (GUI) use |riscos-gui| -5. Remote use (telnet) |riscos-remote| -6. Temporary files |riscos-temp-files| -7. Interrupting |riscos-interrupt| -8. Memory usage |riscos-memory| -9. Filetypes |riscos-filetypes| -10. The shell |riscos-shell| -11. Porting new releases |riscos-porting| - -If I've missed anything, email me and I'll try to fix it. In fact, even if I -haven't missed anything then email me anyway to give me some confidence that it -actually works! - -Thomas Leonard - - [these URLs no longer work...] - Port homepage: http://www.ecs.soton.ac.uk/~tal197/ - or try: http://www.soton.ac.uk/~tal197/ - -============================================================================== - *riscos-locations* -1. File locations - -The Vim executable and shared resource files are all stored inside the !Vim -application directory. - -When !Vim is first seen by the filer, it aliases the *vi and *ex commands to -run the command-line versions of Vim (see |riscos-commandline|). - -!Vim.Resources and !Vim.Resources2 contain the files from the standard Vim -distribution, but modified slightly to work within the limits of ADFS, plus -some extra files such as the window templates. - -User choices are read from "Choices:*" and are saved to ".*". -If you have the new !Boot structure then these should be set up already. If -not, set Choices$Path to a list of directories to search when looking for -user configuration files. Set Choices$Write to the directory you want files -to be saved into (so your search patterns and marks can be remembered between -sessions). - -============================================================================== - *riscos-munging* -2. Filename munging - -All pathname munging is disabled by default, so Vim should behave like a -normal RISC OS application now. So, if you want to edit "doc/html" then you -actually type "*vi doc/html". - -The only times munging is done is when: - -- Searching included files from C programs, since these are always munged. - See |[I|. - Note: make sure you are in the right directory when you use this - command (i.e. the one with subdirectories "c" and "h"). - -- Sourcing files using |:so|. - Paths starting "$VIM/" are munged like this: - - $VIM/syntax/help.vim -> Vim:syntax.help - - Also, files ending in ".vim" have their extensions removed, and slashes - replaced with dots. - -Some tag files and script files may have to be edited to work under this port. - -============================================================================== - *riscos-commandline* -3. Command-line use - -To use Vim from the command-line use the "*vi" command (or "*ex" for -|Ex-mode|). - -Type "*vi -h" for a list of options. - -Running the command-line version of Vim in a large high-color mode may cause -the scrolling to be very slow. Either change to a mode with fewer colors or -use the GUI version. - -Also, holding down Ctrl will slow it down even more, and Ctrl-Shift will -freeze it, as usual for text programs. - -============================================================================== - *riscos-gui* -4. Desktop use - -Limitations: - -- Left scrollbars don't work properly (right and bottom are fine). -- Doesn't increase scroll speed if it gets behind. - -You can resize the window by dragging the lower-right corner, even though -there is no icon shown there. - -You can use the --rows and --columns arguments to specify the initial size of -the Vim window, like this: > - - *Vi -g --rows 20 --columns 80 - -The global clipboard is supported, so you can select some text and then -paste it directly into another application (provided it supports the -clipboard too). - -Clicking Menu now opens a menu like a normal RISC OS program. Hold down Shift -when clicking Menu to paste (from the global clipboard). - -Dragging a file to the window replaces the CURRENT buffer (the one with the -cursor, NOT the one you dragged to) with the file. - -Dragging with Ctrl held down causes a new Vim window to be opened for the -file (see |:sp|). - -Dragging a file in with Shift held down in insert mode inserts the pathname of -the file. - -:browse :w opens a standard RISC OS save box. -:browse :e opens a directory viewer. - -For fonts, you have the choice of the system font, an outline font, the system -font via ZapRedraw and any of the Zap fonts via ZapRedraw: > - - :set guifont= -< To use the system font via the VDU drivers. Supports - bold and underline. -> - :set guifont=Corpus.Medium -< Use the named outline font. You can use any font, but - only monospaced ones like Corpus look right. -> - :set guifont=Corpus.Medium:w8:h12:b:i -< As before, but with size of 8 point by 12 point, and - in bold italic. - If only one of width and height is given then that - value is used for both. If neither is given then 10 - point is used. - -Thanks to John Kortink, Vim can use the ZapRedraw module. Start the font name -with "!" (or "!!" for double height), like this: > - - :set guifont=!! -< Use the system font, but via ZapRedraw. This gives a - faster redraw on StrongARM processors, but you can't - get bold or italic text. Double height. -> - :set guifont=!script -< Uses the named Zap font (a directory in VimFont$Path). - The redraw is the same speed as for "!!", but you get - a nicer looking font. - Only the "man+" and "script" fonts are supplied - currently, but you can use any of the Zap fonts if - they are in VimFont$Path. - Vim will try to load font files "0", "B", "I" and "IB" - from the named directory. Only "0" (normal style) MUST - be present. Link files are not currently supported. - -Note that when using ZapRedraw the edit bar is drawn in front of the character -you are on rather than behind it. Also redraw is incorrect for screen modes -with eigen values of 0. If the font includes control characters then you can -get Vim to display them by changing the 'isprint' option. - -If you find the scrolling is too slow on your machine, try experimenting -with the 'scrolljump' and 'ttyscroll' options. - -In particular, StrongARM users may find that: > - - :set ttyscroll=0 - -makes scrolling faster in high-color modes. - -============================================================================= - *riscos-remote* -5. Remote use (telnet) - -I have included a built-in termcap entry, but you can edit the termcap file to -allow other codes to be used if you want to use Vim from a remote terminal. - -Although I do not have an internet connection to my Acorn, I have managed to -run Vim in a FreeTerm window using the loopback connection. - -It seems to work pretty well now, using "*vi -T ansi". - -============================================================================== - *riscos-temp-files* -6. Temporary files - -If Vim crashes then the swap and backup files (if any) will be in the -directories set with the 'directory' and 'bdir' options. By default the swap -files are in (i.e. inside !Scrap) and backups are in the -directory you were saving to. Vim will allow you to try and recover the file -when you next try to edit it. - -To see a list of swap files, press and type "*vi -r". - -Vim no longer brings up ATTENTION warnings if you try to edit two files with -the same name in different directories. - -However, it also no longer warns if you try to edit the same file twice (with -two copies of Vim), though you will still be warned when you save that the -datestamp has changed. - -============================================================================== - *riscos-interrupt* -7. Interrupting - -To break out of a looping macro, or similar, hold down Escape in the -command-line version, or press CTRL-C in the GUI version. - -============================================================================== - *riscos-memory* -8. Memory usage - -Vim will use dynamic areas on RISC OS 3.5 or later. If you can use them on -older machines then edit the !RunTxt and GVim files. I don't know what UnixLib -does by default on these machines so I'm playing safe. - -It doesn't work at all well without dynamic areas, since it can't change its -memory allocation once running. Hence you should edit "!Vim.GVim" and -"!Vim.!RunTxt" to choose the best size for you. You probably need at least -about 1400K. - -============================================================================== - *riscos-filetypes* -9. Filetypes - -You can now specify that autocommands are only executed for files of certain -types. The filetype is given in the form &xxx, when xxx is the filetype. - -Filetypes must be specified by number (e.g. &fff for Text). - -The system has changed from version 5.3. The new sequence of events is: - -- A file is loaded. |'osfiletype'| is set to the RISC OS filetype. -- Based on the filetype and pathname, Vim will try to set |'filetype'| to the - Vim-type of the file. -- Setting this option may load syntax files and perform other actions. -- Saving the file will give it a filetype of |'osfiletype'|. - -Some examples may make this clearer: - - Kind of file loaded osfiletype filetype ~ - C code "c.hellow" Text (&fff) C - LaTeX document LaTeX (&2a8) TeX - Draw document DrawFile (&aff) (not changed) - -============================================================================== - *riscos-shell* -10. The shell - -- Bangs (!s) are only replaced if they are followed by a space or end-of-line, - since many pathnames contain them. - -- You can prefix the command with "~", which stops any output from being - displayed. This also means that you don't have to press afterwards, - and stops the screen from being redrawn. {only in the GUI version} - -============================================================================== - *riscos-porting* -11. Porting new releases to RISC OS - -Downloading everything you need: - -- Get the latest source distribution (see www.vim.org) -- Get the runtime environment files (e.g. these help files) -- Get the RISC OS binary distribution (if possible) - - -Unarchiving: - -- Create a raFS disk and put the archives on it -- Un-gzip them -- Un-tar them (*tar xELf 50 archive/tar) - - -Recompiling the sources: - -- Create c, s, and h directories. -- Put all the header files in "h". \ -- Put all the C files in "c". | And lose the extensions -- Put the assembler file ("swis/s") in "s". / -- Rename all the files in "proto" to "h", like this: - raFS::VimSrc.source.proto.file/pro - becomes - raFS::VimSrc.source.h.file_pro -- In the files "h.proto" and "c.termlib", search and replace - .pro" - with - _pro.h" -- Create a simple Makefile if desired and do "*make -k". - Use "CC = gcc -DRISCOS -DUSE_GUI -O2 -x c" in the Makefile. -- Save the binary as !Vim.Vim in the binary distribution. - - -Updating the run-time environment: - -- Replace old or missing files inside !Vim.Resources with the - new files. -- Remove files in "doc" not ending in "/txt", except for "tags". -- Lose the extensions from the files in "doc". -- Edit the "doc.tags" file. Remove extensions from the second column: > - :%s/^\(.[^\t]*\t.*\)\.txt\t/\1\t/ -- Remove extensions from the syntax files. Split them into two directories - to avoid the 77 entry limit on old ADFS filesystems. -- Edit "Vim:FileType" to match "*.c.*" as well as "*/c" and so on. - Add filetype checking too. -- Edit "Vim:Menu" and remove all the keys from the menus: > - :%s/[^ \t]*// -< vim:tw=78:ts=8:ft=help:norl: diff -Naur vim73.orig/runtime/doc/os_vms.txt vim73/runtime/doc/os_vms.txt --- vim73.orig/runtime/doc/os_vms.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/os_vms.txt 2013-06-07 17:07:09.365648598 +0000 @@ -1,4 +1,4 @@ -*os_vms.txt* For Vim version 7.3. Last change: 2010 Jul 28 +*os_vms.txt* For Vim version 7.3. Last change: 2011 Aug 14 VIM REFERENCE MANUAL @@ -38,9 +38,6 @@ Or use one of the mirrors: ftp://ftp.vim.org/pub/vim/MIRRORS -You will need both the Unix and Extra archives to build vim.exe for VMS. -For using Vim's full power you will need the runtime files as well. - You can download precompiled executables from: http://www.polarhome.com/vim/ ftp://ftp.polarhome.com/pub/vim/ @@ -75,7 +72,7 @@ 4. Problems *vms-problems* The code has been tested under Open VMS 6.2 - 8.2 on Alpha, VAX and IA64 -platforms with the DEC C compiler. It should work without bigger problems. +platforms with the DEC C compiler. It should work without big problems. If your system does not have some include libraries you can tune up in OS_VMS_CONF.H file. @@ -88,11 +85,11 @@ Note: Under VAX it should work with the DEC C compiler without problems. The VAX C compiler is not fully ANSI C compatible in pre-processor directives -semantics, therefore you have to use a converter program what will do the lion +semantics, therefore you have to use a converter program that will do the lion part of the job. For detailed instructions read file INSTALLvms.txt -MMS_VIM.EXE is build together with VIM.EXE, but for XD.EXE you should -change to subdirectory and build it separately. +MMS_VIM.EXE is build together with VIM.EXE, but for XXD.EXE you should +change to a subdirectory and build it separately. CTAGS is not part of the Vim source distribution anymore, however the OpenVMS specific source might contain CTAGS source files as described above. @@ -184,9 +181,9 @@ The easiest way is just rename example files. You may leave the menu file (MENU.VIM) and files vimrc and gvimrc in the original $VIM directory. It will -be default setup for all users, and for users it is enough just to have their -own additions or resetting in their home directory in files .vimrc and .gvimrc. -It should work without problems. +be the default setup for all users, and for users it is enough to just have +their own additions or resetting in their home directory in files .vimrc and +.gvimrc. It should work without problems. Note: Remember, system rc files (default for all users) don't have a leading ".". So, system rc files are: > @@ -200,7 +197,7 @@ sys$login:.vimrc sys$login:.gvimrc -You can check that everything is on the right place with the :version command. +You can check that everything is at the right place with the :version command. Example LOGIN.COM: > @@ -209,15 +206,15 @@ $ gv*im:== spawn/nowait/input=NLA0 mcr VIM:VIM.EXE -g -GEOMETRY 80x40 $ set disp/create/node=192.168.5.223/trans=tcpip -Note: This set-up should be enough, if you are working on standalone server or -clustered environment, but if you want to use Vim as internode editor in +Note: This set-up should be enough, if you are working on a standalone server or +clustered environment, but if you want to use Vim as an internode editor in DECNET environment, it will satisfy as well. You just have to define the "whole" path: > $ define VIM "[""user password""]::device:" $ vi*m :== "mcr VIM:VIM.EXE" -As for example: > +For example: > $ define VIM "PLUTO::RF10:[UTIL.VIM]" $ define VIM "PLUTO""ZAY mypass""::RF10:[UTIL.VIM]" ! if passwd required @@ -300,12 +297,12 @@ 4) If you are working on MS-Windows or some other non X/Window environment you need to set up one X server and run Vim as in point 2. - For MS-Windows there are available free X servers as MIX , Omni X etc., + For MS-Windows there are available free X servers as MIX, Omni X etc., as well as excellent commercial products as eXcursion or ReflectionX with built-in DEC support. Please note, that executables without GUI are slightly faster during startup -then with enabled GUI in character mode. Therefore, if you do not use GUI +than with enabled GUI in character mode. Therefore, if you do not use GUI features, it is worth to choose non GUI executables. ============================================================================== @@ -326,8 +323,8 @@ 8.12 diff-mode 8.13 Allow '$' in C keywords 8.14 VIMTUTOR for beginners -8.15 Slow start in console mode issue -8.16 Common VIM directory - different architectures +8.15 Slow start in console mode issue +8.16 Common VIM directory - different architectures 8.1 Backspace/delete @@ -360,7 +357,7 @@ :set nowritebackup " does not have any purpose on VMS. It's the " default. -Recovery is working perfect as well from the default swap file. +Recovery is working perfectly as well from the default swap file. Read more with :help swapfile (Claude Marinier Vim 5.5, Zoltan Arpadffy @@ -386,7 +383,7 @@ rf10:test.c;1 (David Elins , Jerome Lauret - Vim 5.6 ) + Vim 5.6) 8.5 Remote host invocation @@ -445,14 +442,14 @@ builtin_dumb defaulting to 'vt320' --- -The solution is to define default terminal name: > +The solution is to define the default terminal name: > $ ! unknown terminal name. Let us use vt320 or ansi instead. $ ! Note: it's case sensitive $ define term "vt320" -Terminals from VT100 to VT320 (as V300, VT220, VT200 ) do not need any extra -keyboard mappings. They should work perfect as they are, including arrows, +Terminals from VT100 to VT320 (as V300, VT220, VT200) do not need any extra +keyboard mappings. They should work perfectly as they are, including arrows, Ins, Del buttons etc., except Backspace in GUI mode. To solve it, add to .gvimrc: > @@ -465,8 +462,8 @@ set ttyfast " set fast terminal -Note: if you're using Vim on remote host or through very slow connection, it's -recommended to avoid fast terminal option with: > +Note: if you're using Vim on remote host or through a very slow connection, it's +recommended to avoid the fast terminal option with: > set nottyfast " set terminal to slow mode @@ -483,8 +480,8 @@ OpenVMS users always have to be aware that the Vim command :! "just" drop them to DCL prompt. This feature is possible to use without any problem with all -DCL commands, but if we want to execute some program as XXD, CTAGS, JTAGS etc. -we're running into trouble if we follow the Vim documentation (see: help +DCL commands, but if we want to execute some programs such as XXD, CTAGS, JTAGS, +etc. we're running into trouble if we follow the Vim documentation (see: help xxd). Solution: Execute with the MC command and add the full path to the executable. @@ -534,7 +531,7 @@ $define SYS$PRINT HP5ANSI -You can print out whole buffer or just the marked area. +You can print out the whole buffer or just the marked area. More info under :help hardcopy (Zoltan Arpadffy, Vim 6.0c) @@ -561,16 +558,16 @@ From 6.0 diff functionality has been implemented, but OpenVMS does not use GNU/Unix like diff therefore built in diff does not work. There is a simple solution to solve this anomaly. Install a Unix like diff -and Vim will work perfect in diff mode too. You just have to redefine your +and Vim will work perfectly in diff mode too. You just have to redefine your diff program as: > define /nolog diff diff.exe Another, more sophisticated solution is described below (8.12 diff-mode) -There are some other programs as patch, make etc that may cause same problems. -At www.polarhome.com is possible to download an GNU package for Alpha and VAX -boxes that is meant to solve GNU problems on OpenVMS. -( Zoltan Arpadffy, Vim 6.1) +There are other programs such as patch, make etc that may cause the same +problems. At www.polarhome.com is possible to download an GNU package for +Alpha and VAX boxes that is meant to solve GNU problems on OpenVMS. +(Zoltan Arpadffy, Vim 6.1) 8.12 diff-mode @@ -632,7 +629,7 @@ 3. VIM diff: $ VIMDIFF 4. GVIM diff: $ GVIMDIFF -( Coen Engelbarts, Vim 6.1) +(Coen Engelbarts, Vim 6.1) 8.13 Allow '$' in C keywords @@ -653,46 +650,47 @@ tag-lookup, work on the whole identifier. (Ctags on VMS also supports '$' in C keywords since ctags version 5.1.) -( Coen Engelbarts, Vim 6.1) +(Coen Engelbarts, Vim 6.1) 8.14 VIMTUTOR for beginners -It exits VIMTUTOR.COM DCL script that can help Vim beginners to learn/make -first steps with Vim on OpenVMS. Depending of binary distribution you may -start it with: > +The VIMTUTOR.COM DCL script can help Vim beginners to learn/make their first +steps with Vim on OpenVMS. Depending of binary distribution you may start it +with: > @vim:vimtutor (Thomas.R.Wyant III, Vim 6.1) -8.14 Slow start in console mode issue +8.16 Slow start in console mode issue As GUI/GTK Vim works equally well in console mode, many administrators deploy those executables system wide. Unfortunately, on a remote slow connections GUI/GTK executables behave rather -slow when user wants to run Vim just in the console mode - because of X environment detection timeout. +slow when user wants to run Vim just in the console mode - because of X +environment detection timeout. Luckily, there is a simple solution for that. Administrators need to deploy both GUI/GTK build and just console build executables, like below: > - |- vim72 + |- vim73 |----- doc - |----- syntax + |----- syntax vimrc (system rc files) gvimrc - gvim.exe (the renamed GUI or GTK built vim.exe) - vim.exe (the console only executable) + gvim.exe (the renamed GUI or GTK built vim.exe) + vim.exe (the console only executable) Define system symbols like below in for ex in LOGIN.COM or SYLOGIN.COM: > - $ define/nolog VIM RF10:[UTIL.VIM72] ! where you VIM directory is + $ define/nolog VIM RF10:[UTIL.VIM73] ! where you VIM directory is $ vi*m :== mcr VIM:VIM.EXE $ gvi*m :== mcr VIM:GVIM.EXE $ ! or you can try to spawn with $ gv*im :== spawn/nowait/input=NLA0 mcr VIM:GVIM.EXE -g -GEOMETRY 80x40 -Like this, users that do not have X environment and want to use Vim just in +Like this, users that do not have X environment and want to use Vim just in console mode can avoid performance problems. (Zoltan Arpadffy, Vim 7.2) @@ -714,8 +712,8 @@ +---------------------------------+ It is convenient to have a common VIM directory but execute different -executables. -There are more solutions for this problem: +executables. +There are several solutions for this problem: Solution 1. All executables in the same directory with different names This is easily done with the following script that can be added @@ -755,7 +753,7 @@ $ define/nolog VIM RF10:[UTIL.IA64_EXE] ! IA64 executables $ endif $! VIMRUNTIME must be defined in order to find runtime files - $ define/nolog VIMRUNTIME RF10:[UTIL.VIM72] + $ define/nolog VIMRUNTIME RF10:[UTIL.VIM73] A good example for this approach is the [GNU]gnu_tools.com script from GNU_TOOLS.ZIP package downloadable from http://www.polarhome.com/vim/ @@ -769,7 +767,7 @@ Version 7.3 - CTAGS 5.8 included - VMS compile warnings fixed - floating-point overflow warning corrected on VAX -- filepath completition corrected - too many chars were escaped in filename +- filepath completion corrected - too many chars were escaped in filename and shell commands - the following plugins are included into VMS runtime: genutils 2.4, multiselect 2.2, multvals 3.1, selectbuf 4.3, @@ -784,10 +782,10 @@ Version 7.2 (2008 Aug 9) - VCF files write corrected - CTAGS 5.7 included -- corrected make_vms.mms (on VAX gave syntax error) +- corrected make_vms.mms (on VAX gave syntax error) Version 7.1 (2007 Jun 15) -- create TAGS file from menu +- create TAGS file from menu Version 7 (2006 May 8) - Improved low level char input (affects just console mode) diff -Naur vim73.orig/runtime/doc/os_win32.txt vim73/runtime/doc/os_win32.txt --- vim73.orig/runtime/doc/os_win32.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/os_win32.txt 2013-06-07 17:07:09.382315217 +0000 @@ -1,4 +1,4 @@ -*os_win32.txt* For Vim version 7.3. Last change: 2010 Jul 20 +*os_win32.txt* For Vim version 7.3. Last change: 2012 May 18 VIM REFERENCE MANUAL by George Reilly @@ -313,6 +313,37 @@ with :!start do not get passed Vim's open file handles, which means they do not have to be closed before Vim. To avoid this special treatment, use ":! start". + There are two optional arguments (see the next Q): + /min the window will be minimized + /b no console window will be opened + You can use only one of these flags at a time. A second one will be + treated as the start of the command. + +Q. How do I avoid getting a window for programs that I run asynchronously? +A. You have two possible solutions depending on what you want: + 1) You may use the /min flag in order to run program in a minimized state + with no other changes. It will work equally for console and GUI + applications. + 2) You can use the /b flag to run console applications without creating a + console window for them (GUI applications are not affected). But you + should use this flag only if the application you run doesn't require any + input. Otherwise it will get an EOF error because its input stream + (stdin) would be redirected to \\.\NUL (stdout and stderr too). + + Example for a console application, run Exuberant ctags: > + :!start /min ctags -R . +< When it has finished you should see file named "tags" in your current + directory. You should notice the window title blinking on your taskbar. + This is more noticable for commands that take longer. + Now delete the "tags" file and run this command: > + :!start /b ctags -R . +< You should have the same "tags" file, but this time there will be no + blinking on the taskbar. + Example for a GUI application: > + :!start /min notepad + :!start /b notepad +< The first command runs notepad minimized and the second one runs it + normally. Q. I'm using Win32s, and when I try to run an external command like "make", Vim doesn't wait for it to finish! Help! diff -Naur vim73.orig/runtime/doc/pattern.txt vim73/runtime/doc/pattern.txt --- vim73.orig/runtime/doc/pattern.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/pattern.txt 2013-06-07 17:07:09.388981864 +0000 @@ -1,4 +1,4 @@ -*pattern.txt* For Vim version 7.3. Last change: 2010 Jul 20 +*pattern.txt* For Vim version 7.3. Last change: 2013 Jun 02 VIM REFERENCE MANUAL by Bram Moolenaar @@ -21,7 +21,7 @@ 10. Highlighting matches |match-highlight| ============================================================================== -1. Search commands *search-commands* *E486* +1. Search commands *search-commands* */* /{pattern}[/] Search forward for the [count]'th occurrence of @@ -150,6 +150,11 @@ All matches for the last used search pattern will be highlighted if you set the 'hlsearch' option. This can be suspended with the |:nohlsearch| command. +When no match is found you get the error: *E486* Pattern not found +Note that for the |:global| command this behaves like a normal message, for Vi +compatibility. For the |:s| command the "e" flag can be used to avoid the +error message |:s_flags|. + *search-offset* *{offset}* These commands search for the specified pattern. With "/" and "?" an additional offset may be given. There are two types of offsets: line offsets @@ -214,7 +219,8 @@ the search, possibly in another direction or with another count. Note that two patterns are remembered: One for 'normal' search commands and one for the substitute command ":s". Each time an empty pattern is given, the previously -used pattern is used. +used pattern is used. However, if there is no previous search command, a +previous substitute pattern is used, if possible. The 'magic' option sticks with the last used pattern. If you change 'magic', this will not change how the last used pattern will be interpreted. @@ -344,6 +350,27 @@ or \z( pattern \) |/\z(| + */\%#=* *two-engines* +Vim includes two regexp engines: +1. An old, backtracking engine that supports everything. +2. A new, NFA engine that works much faster on some patterns, but does not + support everything. + +Vim will automatically select the right engine for you. However, if you run +into a problem or want to specifically select one engine or the other, you can +prepend one of the following to the pattern: + + \%#=0 Force automatic selection. Only has an effect when + 'regexpengine' has been set to a non-zero value. + \%#=1 Force using the old engine. + \%#=2 Force using the NFA engine. + +You can also use the 'regexpengine' option to change the default. + + *E864* *E868* *E874* *E875* *E876* *E877* *E878* +If selecting the NFA engine and it runs into something that is not implemented +the pattern will not match. This is only useful when debugging Vim. + ============================================================================== 3. Magic */magic* @@ -390,9 +417,10 @@ ============================================================================== 4. Overview of pattern items *pattern-overview* + *E865* *E866* *E867* *E869* Overview of multi items. */multi* *E61* *E62* -More explanation and examples below, follow the links. *E64* +More explanation and examples below, follow the links. *E64* *E871* multi ~ 'magic' 'nomagic' matches of the preceding atom ~ @@ -498,16 +526,18 @@ x x a character with no special meaning matches itself |/[]| [] \[] any character specified inside the [] -|/\%[]| \%[] \%[] a sequence of optionally matched atoms +|/\%[]| \%[] \%[] a sequence of optionally matched atoms |/\c| \c \c ignore case, do not use the 'ignorecase' option |/\C| \C \C match case, do not use the 'ignorecase' option +|/\Z| \Z \Z ignore differences in Unicode "combining characters". + Useful when searching voweled Hebrew or Arabic text. + |/\m| \m \m 'magic' on for the following chars in the pattern |/\M| \M \M 'magic' off for the following chars in the pattern |/\v| \v \v the following chars in the pattern are "very magic" |/\V| \V \V the following chars in the pattern are "very nomagic" -|/\Z| \Z \Z ignore differences in Unicode "combining characters". - Useful when searching voweled Hebrew or Arabic text. +|/\%#=| \%#=1 \%#=1 select regexp engine |/zero-width| |/\%d| \%d \%d match specified decimal character (eg \%d123) |/\%x| \%x \%x match specified hex character (eg \%x2a) @@ -575,7 +605,7 @@ \? Just like \=. Cannot be used when searching backwards with the "?" command. {not in Vi} - */\{* *E58* *E60* *E554* + */\{* *E58* *E60* *E554* *E870* \{n,m} Matches n to m of the preceding atom, as many as possible \{n} Matches n of the preceding atom \{n,} Matches at least n of the preceding atom, as many as possible @@ -631,17 +661,18 @@ */\@!* \@! Matches with zero width if the preceding atom does NOT match at the current position. |/zero-width| {not in Vi} - Like '(?!pattern)" in Perl. + Like "(?!pattern)" in Perl. Example matches ~ foo\(bar\)\@! any "foo" not followed by "bar" - a.\{-}p\@! "a", "ap", "app", etc. not followed by a "p" + a.\{-}p\@! "a", "ap", "app", "appp", etc. not immediately + followed by a "p" if \(\(then\)\@!.\)*$ "if " not followed by "then" Using "\@!" is tricky, because there are many places where a pattern does not match. "a.*p\@!" will match from an "a" to the end of the line, because ".*" can match all characters in the line and the "p" doesn't match at the end of the line. "a.\{-}p\@!" will match any - "a", "ap", "aap", etc. that isn't followed by a "p", because the "." + "a", "ap", "app", etc. that isn't followed by a "p", because the "." can match a "p" and "p\@!" doesn't match after that. You can't use "\@!" to look for a non-match before the matching @@ -650,16 +681,24 @@ "foobar" you could use "\(foo\)\@!...bar", but that doesn't match a bar at the start of a line. Use "\(foo\)\@ + /^\%(.*bar\)\@!.*\zsfoo +< This pattern first checks that there is not a single position in the + line where "bar" matches. If ".*bar" matches somewhere the \@! will + reject the pattern. When there is no match any "foo" will be found. + The "\zs" is to have the match start just before "foo". + */\@<=* \@<= Matches with zero width if the preceding atom matches just before what follows. |/zero-width| {not in Vi} - Like '(?<=pattern)" in Perl, but Vim allows non-fixed-width patterns. + Like "(?<=pattern)" in Perl, but Vim allows non-fixed-width patterns. Example matches ~ \(an\_s\+\)\@<=file "file" after "an" and white space or an end-of-line For speed it's often much better to avoid this multi. Try using "\zs" instead |/\zs|. To match the same as the above example: an\_s\+\zsfile + At least set a limit for the look-behind, see below. "\@<=" and "\@* \@> Matches the preceding atom like matching a whole pattern. {not in Vi} Like "(?>pattern)" in Perl. @@ -923,7 +979,7 @@ \l lowercase character: [a-z] */\l* \L non-lowercase character: [^a-z] */\L* \u uppercase character: [A-Z] */\u* -\U non-uppercase character [^A-Z] */\U* +\U non-uppercase character: [^A-Z] */\U* NOTE: Using the atom is faster than the [] form. @@ -948,7 +1004,8 @@ ~ matches the last given substitute string */~* */\~* \(\) A pattern enclosed by escaped parentheses. */\(* */\(\)* */\)* - E.g., "\(^a\)" matches 'a' at the start of a line. *E51* *E54* *E55* + E.g., "\(^a\)" matches 'a' at the start of a line. + *E51* *E54* *E55* *E872* *E873* \1 Matches the same string that was matched by */\1* *E65* the first sub-expression in \( and \). {not in Vi} @@ -979,6 +1036,8 @@ [xyz] any 'x', 'y' or 'z' [a-zA-Z]$ any alphabetic character at the end of a line \c[a-z]$ same + [А-яЁё] Russian alphabet (with utf-8 and cp1251) + */[\n]* With "\_" prepended the collection also includes the end-of-line. The same can be done by including "\n" in the collection. The @@ -1027,11 +1086,9 @@ These items only work for 8-bit characters. */[[=* *[==]* - An equivalence class. This means that characters are matched that - have almost the same meaning, e.g., when ignoring accents. The form - is: + have almost the same meaning, e.g., when ignoring accents. This + only works for Unicode, latin1 and latin9. The form is: [=a=] - Currently this is only implemented for latin1. Also works for the - latin1 characters in utf-8 and latin9. */[[.* *[..]* - A collation element. This currently simply accepts a single character in the form: @@ -1047,6 +1104,8 @@ any character that's not in "^]-\bdertnoUux". "[\xyz]" matches '\', 'x', 'y' and 'z'. It's better to use "\\" though, future expansions may use other characters after '\'. + - Omitting the trailing ] is not considered an error. "[]" works like + "[]]", it matches the ']' character. - The following translations are accepted when the 'l' flag is not included in 'cpoptions' {not in Vi}: \e @@ -1152,6 +1211,8 @@ Thus only the base characters need to match, the composing characters may be different and the number of composing characters may differ. Only relevant when 'encoding' is "utf-8". +Exception: If the pattern starts with one or more composing characters, these +must match. When a composing character appears at the start of the pattern of after an item that doesn't include the composing character, a match is found at any @@ -1161,8 +1222,20 @@ composing character by itself, except that it doesn't matter what comes before this. -The order of composing characters matters, even though changing the order -doesn't change what a character looks like. This may change in the future. +The order of composing characters does not matter. Also, the text may have +more composing characters than the pattern, it still matches. But all +composing characters in the pattern must be found in the text. + +Suppose B is a base character and x and y are composing characters: + pattern text match ~ + Bxy Bxy yes (perfect match) + Bxy Byx yes (order ignored) + Bxy By no (x missing) + Bxy Bx no (y missing) + Bx Bx yes (perfect match) + Bx By no (x missing) + Bx Bxy yes (extra y ignored) + Bx Byx yes (extra y ignored) ============================================================================== 9. Compare with Perl patterns *perl-patterns* diff -Naur vim73.orig/runtime/doc/pi_getscript.txt vim73/runtime/doc/pi_getscript.txt --- vim73.orig/runtime/doc/pi_getscript.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/pi_getscript.txt 2013-06-07 17:07:09.412315131 +0000 @@ -1,15 +1,21 @@ -*pi_getscript.txt* For Vim version 7.3. Last change: 2009 Oct 14 +*pi_getscript.txt* For Vim version 7.0. Last change: 2012 Apr 07 > - GETSCRIPT REFERENCE MANUAL by Charles E. Campbell, Jr. + GETSCRIPT REFERENCE MANUAL by Charles E. Campbell < -Authors: Charles E. Campbell, Jr. +Authors: Charles E. Campbell (remove NOSPAM from the email address) *GetLatestVimScripts-copyright* -Copyright: (c) 2004-2009 by Charles E. Campbell, Jr. *glvs-copyright* - The VIM LICENSE applies to getscript.vim and - pi_getscript.txt (see |copyright|) except use - "getscript" instead of "Vim". No warranty, express or implied. - Use At-Your-Own-Risk. +Copyright: (c) 2004-2012 by Charles E. Campbell *glvs-copyright* + The VIM LICENSE (see |copyright|) applies to the files in this + package, including getscriptPlugin.vim, getscript.vim, + GetLatestVimScripts.dist, and pi_getscript.txt, except use "getscript" + instead of "VIM". Like anything else that's free, getscript and its + associated files are provided *as is* and comes with no warranty of + any kind, either expressed or implied. No guarantees of + merchantability. No guarantees of suitability for any purpose. By + using this plugin, you agree that in no event will the copyright + holder be liable for any damages resulting from the use of this + software. Use at your own risk! Getscript is a plugin that simplifies retrieval of the latest versions of the scripts that you yourself use! Typing |:GLVS| will invoke getscript; it will @@ -77,7 +83,9 @@ 3. GetLatestVimScripts Usage *glvs-usage* *:GLVS* Unless it has been defined elsewhere, > + :GLVS + will invoke GetLatestVimScripts(). If some other plugin has defined that command, then you may type > @@ -127,7 +135,8 @@ http://vim.sourceforge.net/scripts/script.php?script_id=40 The "40" happens to be a ScriptID that GetLatestVimScripts needs to -download the associated page. +download the associated page, and is assigned by vim.sf.net itself +during initial uploading of the plugin. The second number on each line gives the script's SourceID. The SourceID records the count of uploaded scripts as determined by vim.sf.net; hence it @@ -151,19 +160,39 @@ script is automatically installable. Getscript will also use this line to help build the GetLatestVimScripts.dat file, by including a line such as: > - 884 1 AutoAlign.vim + 884 1 :AutoInstall: AutoAlign.vim < -in it an AutoAlign.vim line isn't already in GetLatestVimScripts.dat file. +assuming that such a line isn't already in GetLatestVimScripts.dat file. See |glvs-plugins| for more. Thus, GetLatestVimScripts thus provides a comprehensive ability to keep your plugins up-to-date! +In summary: + + * Optionally tell getscript that it is allowed to build/append a + GetLatestVimScripts.dat file based upon already installed plugins: > + let g:GetLatestVimScripts_allowautoinstall=1 +< + * A line such as > + " GetLatestVimScripts: 884 1 :AutoInstall: AutoAlign.vim +< in an already-downloaded plugin constitutes the concurrence of the + plugin author that getscript may do AutoInstall. Not all plugins + may be AutoInstall-able, and the plugin's author is best situated + to know whether or not his/her plugin will AutoInstall properly. + + * A line such as > + 884 1 :AutoInstall: AutoAlign.vim +< in your GetLatestVimScripts.dat file constitutes your permission + to getscript to do AutoInstall. AutoInstall requires both your + and the plugin author's permission. See |GetLatestVimScripts_dat|. + + *GetLatestVimScripts_dat* As an example of a file: > ScriptID SourceID Filename -------------------------- - 294 1 Align.vim - 120 2 decho.vim + 294 1 :AutoInstall: Align.vim + 120 2 Decho.vim 40 3 DrawIt.tar.gz 451 4 EasyAccents.vim 195 5 engspchk.vim @@ -201,8 +230,8 @@ ^ scriptid < -NOTE: :AutoInstall: is a plugin-author option, not a GetLatestVimScripts.dat~ - entry!~ +NOTE: The :AutoInstall: feature requires both the plugin author's and~ + the user's permission to operate!~ GetLatestVimScripts commands for those scripts are then appended, if not already present, to the user's GetLatest/GetLatestVimScripts.dat file. It is @@ -210,7 +239,7 @@ plugins depend upon. Now, as an author, you probably don't want GetLatestVimScripts to download -your own scripts for you yourself, thereby overwriting your not-yet-released +your own scripts atop your own copy, thereby overwriting your not-yet-released hard work. GetLatestVimScripts provides a solution for this: put > 0 0 yourscriptname @@ -314,6 +343,11 @@ default= $HOME/vimfiles (windows) Override where :AutoInstall: scripts will be installed. Doesn't override vimball installation. +> + g:GetLatestVimScripts_scriptaddr +< default='http://vim.sourceforge.net/script.php?script_id=' + Override this if your system needs + ... ='http://vim.sourceforge.net/script/script.php?script_id=' ============================================================================== 8. GetLatestVimScripts Algorithm *glvs-algorithm* *glvs-alg* @@ -351,6 +385,15 @@ ============================================================================== 9. GetLatestVimScripts History *getscript-history* *glvs-hist* {{{1 +v35 Apr 07, 2012 : * (MengHuan Yu) pointed out that the script url has + changed (somewhat). However, it doesn't work, and + the original one does (under Linux). I'll make it + yet-another-option. +v34 Jun 23, 2011 : * handles additional decompression options for tarballs + (tgz taz tbz txz) +v33 May 31, 2011 : * using fnameescape() instead of escape() + * *.xz support +v32 Jun 19, 2010 : * (Jan Steffens) added support for xz compression v31 Jun 29, 2008 : * (Bill McCarthy) fixed having hls enabled with getscript * (David Schaefer) the acd option interferes with vimballs Solution: bypass the acd option diff -Naur vim73.orig/runtime/doc/pi_gzip.txt vim73/runtime/doc/pi_gzip.txt --- vim73.orig/runtime/doc/pi_gzip.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/pi_gzip.txt 2013-06-07 17:07:09.418981779 +0000 @@ -1,4 +1,4 @@ -*pi_gzip.txt* For Vim version 7.3. Last change: 2002 Oct 29 +*pi_gzip.txt* For Vim version 7.3. Last change: 2012 Jul 19 VIM REFERENCE MANUAL by Bram Moolenaar @@ -25,6 +25,8 @@ *.Z compress (Lempel-Ziv) *.gz gzip *.bz2 bzip2 + *.lzma lzma + *.xz xz That's actually the only thing you need to know. There are no options. diff -Naur vim73.orig/runtime/doc/pi_netrw.txt vim73/runtime/doc/pi_netrw.txt --- vim73.orig/runtime/doc/pi_netrw.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/pi_netrw.txt 2013-06-07 17:07:09.482314931 +0000 @@ -1,22 +1,21 @@ -*pi_netrw.txt* For Vim version 7.3. Last change: 2010 Jul 28 +*pi_netrw.txt* For Vim version 7.3. Last change: 2013 May 18 - ----------------------------------------------------- - NETRW REFERENCE MANUAL by Charles E. Campbell, Jr. - ----------------------------------------------------- -Author: Charles E. Campbell, Jr. + ------------------------------------------------ + NETRW REFERENCE MANUAL by Charles E. Campbell + ------------------------------------------------ +Author: Charles E. Campbell (remove NOSPAM from Campbell's email first) -Copyright: Copyright (C) 1999-2010 Charles E Campbell, Jr *netrw-copyright* - Permission is hereby granted to use and distribute this code, with - or without modifications, provided that this copyright notice is - copied with it. Like anything else that's free, netrw.vim, - netrwPlugin.vim, netrwFileHandlers.vim, netrwSettings.vim, - syntax/netrw.vim, and pi_netrw.txt are provided *as is* and comes - with no warranty of any kind, either expressed or implied. No - guarantees of merchantability. No guarantees of suitability for - any purpose. By using this plugin, you agree that in no event will - the copyright holder be liable for any damages resulting from the - use of this software. +Copyright: Copyright (C) 1999-2013 Charles E Campbell *netrw-copyright* + The VIM LICENSE applies to the files in this package, including + netrw.vim, pi_netrw.txt, netrwFileHandlers.vim, netrwSettings.vim, and + syntax/netrw.vim. Like anything else that's free, netrw.vim and its + associated files are provided *as is* and comes with no warranty of + any kind, either expressed or implied. No guarantees of + merchantability. No guarantees of suitability for any purpose. By + using this plugin, you agree that in no event will the copyright + holder be liable for any damages resulting from the use of this + software. Use at your own risk! *dav* *ftp* *netrw-file* *rcp* *scp* @@ -26,82 +25,87 @@ ============================================================================== 1. Contents *netrw-contents* {{{1 -1. Contents.............................................|netrw-contents| -2. Starting With Netrw..................................|netrw-start| -3. Netrw Reference......................................|netrw-ref| - EXTERNAL APPLICATIONS AND PROTOCOLS................|netrw-externapp| - READING............................................|netrw-read| - WRITING............................................|netrw-write| - SOURCING...........................................|netrw-source| - DIRECTORY LISTING..................................|netrw-dirlist| - CHANGING THE USERID AND PASSWORD...................|netrw-chgup| - VARIABLES AND SETTINGS.............................|netrw-variables| - PATHS..............................................|netrw-path| -4. Network-Oriented File Transfer.......................|netrw-xfer| - NETRC..............................................|netrw-netrc| - PASSWORD...........................................|netrw-passwd| -5. Activation...........................................|netrw-activate| -6. Transparent File Editing.............................|netrw-transparent| -7. Ex Commands..........................................|netrw-ex| -8. Variables and Options................................|netrw-var| -9. Browsing.............................................|netrw-browse| - Introduction To Browsing...........................|netrw-intro-browse| - Quick Reference: Maps..............................|netrw-browse-maps| - Quick Reference: Commands..........................|netrw-browse-cmds| - Bookmarking A Directory............................|netrw-mb| - Browsing...........................................|netrw-cr| - Browsing With A Horizontally Split Window..........|netrw-o| - Browsing With A New Tab............................|netrw-t| - Browsing With A Vertically Split Window............|netrw-v| - Change Listing Style.(thin wide long tree).........|netrw-i| - Changing To A Bookmarked Directory.................|netrw-gb| - Changing To A Predecessor Directory................|netrw-u| - Changing To A Successor Directory..................|netrw-U| - Customizing Browsing With A User Function..........|netrw-x| - Deleting Bookmarks.................................|netrw-mB| - Deleting Files Or Directories......................|netrw-D| - Directory Exploring Commands.......................|netrw-explore| - Exploring With Stars and Patterns..................|netrw-star| - Displaying Information About File..................|netrw-qf| - Edit File Or Directory Hiding List.................|netrw-ctrl-h| - Editing The Sorting Sequence.......................|netrw-S| - Going Up...........................................|netrw--| - Hiding Files Or Directories........................|netrw-a| - Improving Browsing.................................|netrw-ssh-hack| - Listing Bookmarks And History......................|netrw-qb| - Making A New Directory.............................|netrw-d| - Making The Browsing Directory The Current Directory|netrw-c| - Marking Files......................................|netrw-mf| - Marking Files By Regular Expression................|netrw-mr| - Marked Files: Arbitrary Command....................|netrw-mx| - Marked Files: Compression And Decompression........|netrw-mz| - Marked Files: Copying..............................|netrw-mc| - Marked Files: Diff.................................|netrw-md| - Marked Files: Editing..............................|netrw-me| - Marked Files: Grep.................................|netrw-mg| - Marked Files: Hiding and Unhiding by Suffix........|netrw-mh| - Marked Files: Moving...............................|netrw-mm| - Marked Files: Printing.............................|netrw-mp| - Marked Files: Sourcing.............................|netrw-ms| - Marked Files: Tagging..............................|netrw-mT| - Marked Files: Setting the Target Directory.........|netrw-mt| - Marked Files: Unmarking............................|netrw-mu| - Netrw Browser Variables............................|netrw-browser-var| - Netrw Browsing And Option Incompatibilities........|netrw-incompatible| - Netrw Settings.....................................|netrw-settings| - Obtaining A File...................................|netrw-O| - Preview Window.....................................|netrw-p| - Previous Window....................................|netrw-P| - Refreshing The Listing.............................|netrw-ctrl-l| - Renaming Files Or Directories......................|netrw-move| - Reversing Sorting Order............................|netrw-r| - Selecting Sorting Style............................|netrw-s| - Setting Editing Window.............................|netrw-C| -10. Problems and Fixes...................................|netrw-problems| -11. Debugging Netrw Itself...............................|netrw-debug| -12. History..............................................|netrw-history| -13. Todo.................................................|netrw-todo| -14. Credits..............................................|netrw-credits| +1. Contents..............................................|netrw-contents| +2. Starting With Netrw...................................|netrw-start| +3. Netrw Reference.......................................|netrw-ref| + EXTERNAL APPLICATIONS AND PROTOCOLS.................|netrw-externapp| + READING.............................................|netrw-read| + WRITING.............................................|netrw-write| + SOURCING............................................|netrw-source| + DIRECTORY LISTING...................................|netrw-dirlist| + CHANGING THE USERID AND PASSWORD....................|netrw-chgup| + VARIABLES AND SETTINGS..............................|netrw-variables| + PATHS...............................................|netrw-path| +4. Network-Oriented File Transfer........................|netrw-xfer| + NETRC...............................................|netrw-netrc| + PASSWORD............................................|netrw-passwd| +5. Activation............................................|netrw-activate| +6. Transparent Remote File Editing.......................|netrw-transparent| +7. Ex Commands...........................................|netrw-ex| +8. Variables and Options.................................|netrw-variables| +9. Browsing..............................................|netrw-browse| + Introduction To Browsing............................|netrw-intro-browse| + Quick Reference: Maps...............................|netrw-browse-maps| + Quick Reference: Commands...........................|netrw-browse-cmds| + Bookmarking A Directory.............................|netrw-mb| + Browsing............................................|netrw-cr| + Browsing With A Horizontally Split Window...........|netrw-o| + Browsing With A New Tab.............................|netrw-t| + Browsing With A Vertically Split Window.............|netrw-v| + Change Listing Style.(thin wide long tree)..........|netrw-i| + Changing To A Bookmarked Directory..................|netrw-gb| + Changing To A Predecessor Directory.................|netrw-u| + Changing To A Successor Directory...................|netrw-U| + Customizing Browsing With A User Function...........|netrw-x| + Deleting Bookmarks..................................|netrw-mB| + Deleting Files Or Directories.......................|netrw-D| + Directory Exploring Commands........................|netrw-explore| + Exploring With Stars and Patterns...................|netrw-star| + Displaying Information About File...................|netrw-qf| + Edit File Or Directory Hiding List..................|netrw-ctrl-h| + Editing The Sorting Sequence........................|netrw-S| + Forcing treatment as a file or directory............|netrw-gd| |netrw-gf| + Going Up............................................|netrw--| + Hiding Files Or Directories.........................|netrw-a| + Improving Browsing..................................|netrw-ssh-hack| + Listing Bookmarks And History.......................|netrw-qb| + Making A New Directory..............................|netrw-d| + Making The Browsing Directory The Current Directory.|netrw-c| + Marking Files.......................................|netrw-mf| + Unmarking Files.....................................|netrw-mF| + Marking Files By QuickFix List......................|netrw-qF| + Marking Files By Regular Expression.................|netrw-mr| + Marked Files: Arbitrary Command.....................|netrw-mx| + Marked Files: Compression And Decompression.........|netrw-mz| + Marked Files: Copying...............................|netrw-mc| + Marked Files: Diff..................................|netrw-md| + Marked Files: Editing...............................|netrw-me| + Marked Files: Grep..................................|netrw-mg| + Marked Files: Hiding and Unhiding by Suffix.........|netrw-mh| + Marked Files: Moving................................|netrw-mm| + Marked Files: Printing..............................|netrw-mp| + Marked Files: Sourcing..............................|netrw-ms| + Marked Files: Setting the Target Directory..........|netrw-mt| + Marked Files: Tagging...............................|netrw-mT| + Marked Files: Target Directory Using Bookmarks......|netrw-Tb| + Marked Files: Target Directory Using History........|netrw-Th| + Marked Files: Unmarking.............................|netrw-mu| + Netrw Browser Variables.............................|netrw-browser-var| + Netrw Browsing And Option Incompatibilities.........|netrw-incompatible| + Netrw Settings Window...............................|netrw-settings-window| + Obtaining A File....................................|netrw-O| + Preview Window......................................|netrw-p| + Previous Window.....................................|netrw-P| + Refreshing The Listing..............................|netrw-ctrl-l| + Reversing Sorting Order.............................|netrw-r| + Renaming Files Or Directories.......................|netrw-R| + Selecting Sorting Style.............................|netrw-s| + Setting Editing Window..............................|netrw-C| +10. Problems and Fixes....................................|netrw-problems| +11. Debugging Netrw Itself................................|netrw-debug| +12. History...............................................|netrw-history| +13. Todo..................................................|netrw-todo| +14. Credits...............................................|netrw-credits| {Vi does not have any of this} @@ -140,6 +144,16 @@ ... default login USERID password "PASSWORD" < +Windows' ftp doesn't support .netrc; however, one may have in one's .vimrc: > + + let g:netrw_ftp_cmd= 'c:\Windows\System32\ftp -s:C:\Users\MyUserName\MACHINE' +< +Netrw will substitute the host's machine name for "MACHINE" from the url it is +attempting to open, and so one may specify > + userid + password +for each site in a separate file: c:\Users\MyUserName\MachineName. + Now about browsing -- when you just want to look around before editing a file. For browsing on your current host, just "edit" a directory: > @@ -180,26 +194,26 @@ Protocol Variable Default Value -------- ---------------- ------------- - dav: *g:netrw_dav_cmd* = "cadaver" if cadaver is executable - dav: g:netrw_dav_cmd = "curl -o" elseif curl is available - fetch: *g:netrw_fetch_cmd* = "fetch -o" if fetch is available - ftp: *g:netrw_ftp_cmd* = "ftp" - http: *g:netrw_http_cmd* = "elinks" if elinks is available + dav: *g:netrw_dav_cmd* = "cadaver" if cadaver is executable + dav: g:netrw_dav_cmd = "curl -o" elseif curl is available + fetch: *g:netrw_fetch_cmd* = "fetch -o" if fetch is available + ftp: *g:netrw_ftp_cmd* = "ftp" + http: *g:netrw_http_cmd* = "elinks" if elinks is available http: g:netrw_http_cmd = "links" elseif links is available http: g:netrw_http_cmd = "curl" elseif curl is available http: g:netrw_http_cmd = "wget" elseif wget is available http: g:netrw_http_cmd = "fetch" elseif fetch is available - rcp: *g:netrw_rcp_cmd* = "rcp" - rsync: *g:netrw_rsync_cmd* = "rsync -a" - scp: *g:netrw_scp_cmd* = "scp -q" - sftp: *g:netrw_sftp_cmd* = "sftp" + rcp: *g:netrw_rcp_cmd* = "rcp" + rsync: *g:netrw_rsync_cmd* = "rsync -a" + scp: *g:netrw_scp_cmd* = "scp -q" + sftp: *g:netrw_sftp_cmd* = "sftp" *g:netrw_http_xcmd* : the option string for http://... protocols are specified via this variable and may be independently overridden. By default, the option arguments for the http-handling commands are: > elinks : "-source >" - links : "-source >" + links : "-dump >" curl : "-o" wget : "-q -O" fetch : "-o" @@ -272,7 +286,7 @@ :Nsource "scp://[user@]machine[[:#]port]/path" uses scp :Nsource "sftp://[user@]machine/path" uses sftp -DIRECTORY LISTING *netrw-dirlist* {{{2 +DIRECTORY LISTING *netrw-trailingslash* *netrw-dirlist* {{{2 One may browse a directory to get a listing by simply attempting to edit the directory: > @@ -280,34 +294,42 @@ :e scp://[user]@hostname/path/ :e ftp://[user]@hostname/path/ < - For remote directories (ie. those using scp or ftp), that trailing - "/" is necessary (the slash tells netrw to treat the argument as a - directory to browse instead of a file to download). - - However, the Nread command can also be used to accomplish this: + For remote directory listings (ie. those using scp or ftp), that + trailing "/" is necessary (the slash tells netrw to treat the argument + as a directory to browse instead of as a file to download). - :Nread [protocol]://[user]@hostname/path/ + The Nread command may also be used to accomplish this (again, that + trailing slash is necessary): > + :Nread [protocol]://[user]@hostname/path/ +< *netrw-login* *netrw-password* CHANGING USERID AND PASSWORD *netrw-chgup* *netrw-userpass* {{{2 Attempts to use ftp will prompt you for a user-id and a password. - These will be saved in global variables g:netrw_uid and - s:netrw_passwd; subsequent uses of ftp will re-use those two items to - simplify the further use of ftp. However, if you need to use a - different user id and/or password, you'll want to call NetUserPass() + These will be saved in global variables |g:netrw_uid| and + |s:netrw_passwd|; subsequent use of ftp will re-use those two strings, + thereby simplifying use of ftp. However, if you need to use a + different user id and/or password, you'll want to call |NetUserPass()| first. To work around the need to enter passwords, check if your ftp supports a <.netrc> file in your home directory. Also see |netrw-passwd| (and if you're using ssh/scp hoping to figure out how - to not need to use passwords, look at |netrw-ssh-hack|). + to not need to use passwords for scp, look at |netrw-ssh-hack|). :NetUserPass [uid [password]] -- prompts as needed :call NetUserPass() -- prompts for uid and password :call NetUserPass("uid") -- prompts for password :call NetUserPass("uid","password") -- sets global uid and password +(Related topics: |ftp| |netrw-userpass| |netrw-start|) + NETRW VARIABLES AND SETTINGS *netrw-variables* {{{2 -(also see: |netrw-browser-var| |netrw-protocol| |netrw-settings| |netrw-var|) + (Also see: + |netrw-browser-var| : netrw browser option variables + |netrw-protocol| : file transfer protocol option variables + |netrw-settings| : additional file transfer options + |netrw-browser-options| : these options affect browsing directories + ) Netrw provides a lot of variables which allow you to customize netrw to your preferences. One way to look at them is via the command :NetrwSettings (see @@ -316,95 +338,102 @@ |netrw-externapp|: *b:netrw_lastfile* last file Network-read/written retained on a - per-buffer basis (supports plain :Nw ) + per-buffer basis (supports plain :Nw ) *g:netrw_bufsettings* the settings that netrw buffers have - (default) noma nomod nonu nowrap ro nobl + (default) noma nomod nonu nowrap ro nobl *g:netrw_chgwin* specifies a window number where file edits will take - place. (also see |netrw-C|) - (default) not defined + place. (also see |netrw-C|) + (default) not defined *g:Netrw_funcref* specifies a function (or functions) to be called when - netrw edits a file. The file is first edited, and - then the function reference (|Funcref|) is called. - This variable may also hold a |List| of Funcrefs. - (default) not defined + netrw edits a file. The file is first edited, and + then the function reference (|Funcref|) is called. + This variable may also hold a |List| of Funcrefs. + (default) not defined. (the capital in g:Netrw... + is required by its holding a function reference) > Example: place in .vimrc; affects all file opening fun! MyFuncRef() endfun let g:Netrw_funcref= function("MyFuncRef") < - *g:netrw_ftp* if it doesn't exist, use default ftp - =0 use default ftp (uid password) - =1 use alternate ftp method (user uid password) - If you're having trouble with ftp, try changing the - value of this variable to see if the alternate ftp - method works for your setup. + *g:netrw_ftp* if it doesn't exist, use default ftp + =0 use default ftp (uid password) + =1 use alternate ftp method (user uid password) + If you're having trouble with ftp, try changing the + value of this variable to see if the alternate ftp + method works for your setup. + + *g:netrw_ftp_options* Chosen by default, these options are supposed to turn + interactive prompting off and to restrain ftp from + attempting auto-login upon initial connection. + However, it appears that not all ftp implementations + support this (ex. ncftp). + ="-i -n" *g:netrw_ftpextracmd* default: doesn't exist - If this variable exists, then any string it contains - will be placed into the commands set to your ftp - client. As an example: - ="passive" + If this variable exists, then any string it contains + will be placed into the commands set to your ftp + client. As an example: + ="passive" *g:netrw_ftpmode* ="binary" (default) - ="ascii" + ="ascii" *g:netrw_ignorenetrc* =0 (default for linux, cygwin) - =1 If you have a <.netrc> file but it doesn't work and - you want it ignored, then set this variable as - shown. (default for Windows + cmd.exe) + =1 If you have a <.netrc> file but it doesn't work and + you want it ignored, then set this variable as + shown. (default for Windows + cmd.exe) *g:netrw_menu* =0 disable netrw's menu - =1 (default) netrw's menu enabled + =1 (default) netrw's menu enabled *g:netrw_nogx* if this variable exists, then the "gx" map will not - be available (see |netrw-gx|) + be available (see |netrw-gx|) *g:netrw_uid* (ftp) user-id, retained on a per-vim-session basis - *s:netrw_passwd* (ftp) password, retained on a per-vim-session basis + *s:netrw_passwd* (ftp) password, retained on a per-vim-session basis *g:netrw_preview* =0 (default) preview window shown in a horizontally - split window - =1 preview window shown in a vertically split window. - Also affects the "previous window" (see |netrw-P|) in - the same way. - - *g:netrw_scpport* = "-P" : option to use to set port for scp - *g:netrw_sshport* = "-p" : option to use to set port for ssh - - *g:netrw_sepchr* =\0xff - =\0x01 for enc == euc-jp (and perhaps it should be for - others, too, please let me - know) - Separates priority codes from filenames internally. - See |netrw-p12|. + split window + =1 preview window shown in a vertically split window. + Also affects the "previous window" (see |netrw-P|) in + the same way. + + *g:netrw_scpport* = "-P" : option to use to set port for scp + *g:netrw_sshport* = "-p" : option to use to set port for ssh + + *g:netrw_sepchr* =\0xff + =\0x01 for enc == euc-jp (and perhaps it should be for + others, too, please let me know) + Separates priority codes from filenames internally. + See |netrw-p12|. *g:netrw_silent* =0 : transfers done normally - =1 : transfers done silently + =1 : transfers done silently *g:netrw_use_errorwindow* =1 : messages from netrw will use a separate one - line window. This window provides reliable + line window. This window provides reliable delivery of messages. (default) =0 : messages from netrw will use echoerr ; messages don't always seem to show up this way, but one doesn't have to quit the window. *g:netrw_win95ftp* =1 if using Win95, will remove four trailing blank - lines that o/s's ftp "provides" on transfers - =0 force normal ftp behavior (no trailing line removal) + lines that o/s's ftp "provides" on transfers + =0 force normal ftp behavior (no trailing line removal) - *g:netrw_cygwin* =1 assume scp under windows is from cygwin. Also - permits network browsing to use ls with time and - size sorting (default if windows) - =0 assume Windows' scp accepts windows-style paths - Network browsing uses dir instead of ls - This option is ignored if you're using unix + *g:netrw_cygwin* =1 assume scp under windows is from cygwin. Also + permits network browsing to use ls with time and + size sorting (default if windows) + =0 assume Windows' scp accepts windows-style paths + Network browsing uses dir instead of ls + This option is ignored if you're using unix *g:netrw_use_nt_rcp* =0 don't use the rcp of WinNT, Win2000 and WinXP - =1 use WinNT's rcp in binary mode (default) + =1 use WinNT's rcp in binary mode (default) PATHS *netrw-path* {{{2 @@ -477,6 +506,9 @@ let g:netrw_scp_cmd = '"c:\Program Files\PuTTY\pscp.exe" -q -batch' let g:netrw_sftp_cmd= '"c:\Program Files\PuTTY\psftp.exe"' < +(note: it has been reported that windows 7 with putty v0.6's "-batch" option + doesn't work, so its best to leave it off for that system) + See |netrw-p8| for more about putty, pscp, psftp, etc. Ftp, an old protocol, seems to be blessed by numerous implementations. @@ -500,7 +532,24 @@ > vim ftp://[user@]machine[[:#]portnumber]/path < -However, ftp will often need to query the user for the userid and password. +Windows provides an ftp (typically c:\Windows\System32\ftp.exe) which uses +an option, -s:filename (filename can and probably should be a full path) +which contains ftp commands which will be automatically run whenever ftp +starts. You may use this feature to enter a user and password for one site: > + userid + password +< *netrw-windows-netrc* *netrw-windows-s* +If |g:netrw_ftp_cmd| contains -s:[path/]MACHINE, then (on Windows machines only) +netrw will substitute the current machine name requested for ftp connections +for MACHINE. Hence one can have multiple machine.ftp files containing login +and password for ftp. Example: > + + let g:netrw_ftp_cmd= 'c:\Windows\System32\ftp -s:C:\Users\Myself\MACHINE' + vim ftp://myhost.somewhere.net/ +will use a file > + C:\Users\Myself\myhost.ftp +< +Often, ftp will need to query the user for the userid and password. The latter will be done "silently"; ie. asterisks will show up instead of the actually-typed-in password. Netrw will retain the userid and password for subsequent read/writes from the most recent transfer so subsequent @@ -594,6 +643,9 @@ readable for others. Don't forget that the system administrator can still read the file! Ie. for Linux/Unix: chmod 600 .netrc +Even though Windows' ftp clients typically do not support .netrc, netrw has +a work-around: see |netrw-windows-s|. + PASSWORD *netrw-passwd* @@ -624,7 +676,7 @@ < ============================================================================== -6. Transparent File Editing *netrw-transparent* {{{1 +6. Transparent Remote File Editing *netrw-transparent* {{{1 Transparent file transfers occur whenever a regular file read or write (invoked via an |:autocmd| for |BufReadCmd|, |BufWriteCmd|, or |SourceCmd| @@ -698,13 +750,15 @@ ============================================================================== -8. Variables and Options *netrw-options* *netrw-var* {{{1 +8. Variables and Options *netrw-var* *netrw-settings* {{{1 -(if you're interested in the netrw browser settings, see: |netrw-browser-var|) +(also see: |netrw-options| |netrw-variables| |netrw-protocol| + |netrw-browser-settings| |netrw-browser-options| ) The script provides several variables which act as options to affect 's file transfer behavior. These variables typically may be set in the user's <.vimrc> file: (see also |netrw-settings| |netrw-protocol|) + *netrw-options* > ------------- Netrw Options @@ -736,6 +790,7 @@ =1 use default method to do ftp > ----------------------------------------------------------------------- < + *netrw-internal-variables* The script will also make use of the following variables internally, albeit temporarily. > @@ -874,6 +929,7 @@ endfunction endif > +(Related topics: |ftp| |netrw-userpass| |netrw-start|) ============================================================================== 9. Browsing *netrw-browsing* *netrw-browse* *netrw-help* {{{1 @@ -1023,6 +1079,7 @@ v Enter the file/directory under the cursor in a new |netrw-v| browser window. A vertical split is used. x View file with an associated program |netrw-x| + X Execute filename under cursor via |system()| |netrw-X| % Open a new file in netrw's current directory |netrw-%| @@ -1036,8 +1093,8 @@ <2-leftmouse> (gvim only) when: * in a netrw-selected file, AND * |g:netrw_retmap| == 1 AND - * the user doesn't already have a <2-leftmouse> mapping - defined before netrw is autoloaded, + * the user doesn't already have a <2-leftmouse> + mapping defined before netrw is autoloaded, then a double clicked leftmouse button will return to the netrw browser window. See |g:netrw_retmap|. (gvim only) like mf, will mark files @@ -1129,25 +1186,26 @@ horizontal split is used. (for vertical splitting, see |netrw-v|) Normally, the o key splits the window horizontally with the new window and -cursor at the top. To change to splitting the window horizontally with the -new window and cursor at the bottom, have - - let g:netrw_alto = 1 - -in your <.vimrc>. (also see |netrw-t| |netrw-T| |netrw-v|) +cursor at the top. Associated setting variables: |g:netrw_alto| |g:netrw_winsize| +Related Actions |netrw-cr| |netrw-p| |netrw-t| |netrw-v| +Associated setting variables: + |g:netrw_alto| control above/below splitting + |g:netrw_winsize| control initial sizing -BROWSING WITH A NEW TAB *netrw-t* *netrw-T* {{{2 +BROWSING WITH A NEW TAB *netrw-t* Normally one enters a file or directory using the . The "t" map allows one to open a new window holding the new directory listing or file in -a new tab. The "T" version puts the file or directory into a background tab -(see |gT|) +a new tab. -Related actions: |netrw-o| |netrw-v| +If you'd like to have the new listing in a background tab, use |gT|. +Related Actions |netrw-cr| |netrw-o| |netrw-p| |netrw-v| +Associated setting variables: + |g:netrw_winsize| control initial sizing BROWSING WITH A VERTICALLY SPLIT WINDOW *netrw-v* {{{2 @@ -1156,18 +1214,18 @@ vertical split is used. (for horizontal splitting, see |netrw-o|) Normally, the v key splits the window vertically with the new window and -cursor at the left. To change to splitting the window vertically with the new -window and cursor at the right, have - - let g:netrw_altv = 1 - -in your <.vimrc>. (also see: |netrw-o| |netrw-t| |netrw-T|) +cursor at the left. There is only one tree listing buffer; using "v" on a displayed subdirectory will split the screen, but the same buffer will be shown twice. Associated setting variable: |g:netrw_altv| |g:netrw_winsize| +Related Actions |netrw-cr| |netrw-o| |netrw-t| |netrw-v| +Associated setting variables: + |g:netrw_altv| control right/left splitting + |g:netrw_winsize| control initial sizing + CHANGE LISTING STYLE (THIN LONG WIDE TREE) *netrw-i* {{{2 @@ -1196,6 +1254,18 @@ let g:netrw_liststyle= 4 the tree style will become your default listing style. +One typical way to use the netrw tree display is to: > + + vim . + (use i until a tree display shows) + navigate to a file + v (edit as desired in vertically split window) + ctrl-w h (to return to the netrw listing) + P (edit newly selected file in the previous window) + ctrl-w h (to return to the netrw listing) + P (edit newly selected file in the previous window) + ...etc... +< Associated setting variables: |g:netrw_liststyle| |g:netrw_maxfilenamelen| |g:netrw_timefmt| |g:netrw_list_cmd| @@ -1214,6 +1284,8 @@ {cnt}gb Any count may be used to reference any of the bookmarks. +Note that |netrw-qb| shows both bookmarks and history; to go +to a location stored in the history see |netrw-u| and |netrw-U|. Related Topics: |netrw-mB| how to delete bookmarks @@ -1225,10 +1297,17 @@ Every time you change to a new directory (new for the current session), netrw will save the directory in a recently-visited directory history -list (unless g:netrw_dirhistmax is zero; by default, it's ten). With the +list (unless |g:netrw_dirhistmax| is zero; by default, it's ten). With the "u" map, one can change to an earlier directory (predecessor). To do the opposite, see |netrw-U|. +The "u" map also accepts counts to go back in the history several slots. +For your convenience, |netrw-qb| lists the history number which can be +re-used in that count. + +See |g:netrw_dirhistmax| for how to control the quantity of history stack +slots. + CHANGING TO A SUCCESSOR DIRECTORY *netrw-U* *netrw-downdir* {{{2 @@ -1236,6 +1315,11 @@ This map is the opposite of the "u" map. (see |netrw-u|) Use the q map to list both the bookmarks and history. (see |netrw-qb|) +The "U" map also accepts counts to go forward in the history several slots. + +See |g:netrw_dirhistmax| for how to control the quantity of history stack +slots. + NETRW CLEAN *netrw-clean* *:NetrwClean* @@ -1368,7 +1452,8 @@ g:netrw_rmf_cmd: ssh HOSTNAME rm -f -Associated setting variable: |g:netrw_local_rmdir| |g:netrw_rm_cmd| +Related topics: |netrw-d| +Associated setting variable: |g:netrw_localrmdir| |g:netrw_rm_cmd| |g:netrw_rmdir_cmd| |g:netrw_ssh_cmd| @@ -1502,7 +1587,7 @@ Associated setting variables: |g:netrw_hide| |g:netrw_list_hide| Associated topics: |netrw-a| |netrw-gh| |netrw-mh| - + *netrw-sort-sequence* EDITING THE SORTING SEQUENCE *netrw-S* *netrw-sortsequence* {{{2 When "Sorted by" is name, one may specify priority via the sorting sequence @@ -1527,6 +1612,28 @@ Associated setting variables: |g:netrw_sort_sequence| |g:netrw_sort_options| +EXECUTING FILE UNDER CURSOR VIA SYSTEM() *netrw-X* + +Pressing X while the cursor is atop an executable file will yield a prompt +using the filename asking for any arguments. Upon pressing a [return], netrw +will then call |system()| with that command and arguments. The result will +be displayed by |:echomsg|, and so |:messages| will repeat display of the +result. Ansi escape sequences will be stripped out. + + +FORCING TREATMENT AS A FILE OR DIRECTORY *netrw-gd* *netrw-gf* {{{2 + +Remote symbolic links (ie. those listed via ssh or ftp) are problematic +in that it is difficult to tell whether they link to a file or to a +directory. + +To force treatment as a file: use > + gf +< +To force treatment as a directory: use > + gd +< + GOING UP *netrw--* {{{2 To go up a directory, press "-" or press the when atop the ../ directory @@ -1589,7 +1696,7 @@ to toggle between hiding files which begin with a period (dot) and not hiding them. -Associated setting variable: |g:netrw_list_hide| +Associated setting variable: |g:netrw_list_hide| |g:netrw_hide| Associated topics: |netrw-a| |netrw-ctrl-h| |netrw-mh| IMPROVING BROWSING *netrw-listhack* *netrw-ssh-hack* {{{2 @@ -1687,22 +1794,23 @@ With the "d" map one may make a new directory either remotely (which depends on the global variable g:netrw_mkdir_cmd) or locally (which depends on the -global variable g:netrw_local_mkdir). Netrw will issue a request for the new +global variable g:netrw_localmkdir). Netrw will issue a request for the new directory's name. A bare at that point will abort the making of the directory. Attempts to make a local directory that already exists (as either a file or a directory) will be detected, reported on, and ignored. -Currently, making a directory via ftp is not supported. - -Associated setting variable: |g:netrw_local_mkdir| |g:netrw_mkdir_cmd| +Related topics: |netrw-D| +Associated setting variables: |g:netrw_localmkdir| |g:netrw_mkdir_cmd| + |g:netrw_remote_mkdir| MAKING THE BROWSING DIRECTORY THE CURRENT DIRECTORY *netrw-c* {{{2 By default, |g:netrw_keepdir| is 1. This setting means that the current -directory will not track the browsing directory. +directory will not track the browsing directory. (done for backwards +compatibility with v6's file explorer). -Setting g:netrw_keepdir to 0 tells netrw to make vim's current directory to +Setting g:netrw_keepdir to 0 tells netrw to make vim's current directory track netrw's browsing directory. However, given the default setting for g:netrw_keepdir of 1 where netrw @@ -1725,6 +1833,7 @@ |netrw-mc| Copy marked files to target |netrw-md| Apply vimdiff to marked files |netrw-me| Edit marked files + |netrw-mF| Unmark marked files |netrw-mg| Apply vimgrep to marked files |netrw-mm| Move marked files |netrw-mp| Print marked files @@ -1732,6 +1841,7 @@ |netrw-mT| Generate tags using marked files |netrw-mx| Apply shell command to marked files |netrw-mz| Compress/Decompress marked files + |netrw-qF| Mark files using quickfix list |netrw-O| Obtain marked files |netrw-R| Rename marked files @@ -1740,6 +1850,16 @@ with using gvim. One may unmark all files by pressing "mu" (see |netrw-mu|). +Marked files are highlighted using the "netrwMarkFile" highlighting group, +which by default is linked to "Identifier" (see Identifier under +|group-name|). You may change the highlighting group by putting something +like > + + highlight clear netrwMarkFile + hi link netrwMarkFile ..whatever.. +< +into $HOME/.vim/after/syntax/netrw.vim . + *markfilelist* *global_markfilelist* *local_markfilelist* All marked files are entered onto the global marked file list; there is only one such list. In addition, every netrw buffer also has its own local marked @@ -1749,6 +1869,22 @@ lists. +UNMARKING FILES *netrw-mF* {{{2 + (also see |netrw-mf|) + +This command will unmark all files in the current buffer. One may also use +mf (|netrw-mf|) on a specific file to unmark just that file. + + +MARKING FILES BY QUICKFIX LIST *netrw-qF* + (also see |netrw-mf|) + +One may convert the |quickfix-error-lists| into a marked file list using +"qF". You may then proceed with commands such as me (|netrw-me|) to +edit them. Quickfix error lists are generated, for example, by calls +to |:vimgrep|. + + MARKING FILES BY REGULAR EXPRESSION *netrw-mr* {{{2 (also see |netrw-mf|) @@ -1789,7 +1925,8 @@ (Uses the global marked file list) Select a target directory with mt (|netrw-mt|). Then change directory, -select file(s) (see |netrw-mf|), and press "mc". +select file(s) (see |netrw-mf|), and press "mc". The copy is done +from the current window (where one does the mf) to the target. Associated setting variable: |g:netrw_localcopycmd| |g:netrw_ssh_cmd| @@ -1806,17 +1943,27 @@ This command will place the marked files on the |arglist| and commence editing them. One may return the to explorer window with |:Rexplore|. +(use |:n| and |:p| to edit next and previous files in the arglist) MARKED FILES: GREP *netrw-mg* {{{2 (See |netrw-mf| and |netrw-mr| for how to mark files) (uses the global marked file list) -This command will apply |:vimgrep| to the marked files. The command will ask -for the requested pattern; one may enter: > +This command will apply |:vimgrep| to the marked files. +The command will ask for the requested pattern; one may then enter: > + /pattern/[g][j] ! /pattern/[g][j] pattern < +In the cases of "j" option usage as shown above, "mg" will winnow the current +marked file list to just those possessing the specified pattern. +Thus, one may use > + mr ...file-pattern + mg ..contents-pattern +to have a marked file list satisfying the file-pattern but containing the +desried contents-pattern. + MARKED FILES: HIDING AND UNHIDING BY SUFFIX *netrw-mh* {{{2 (See |netrw-mf| and |netrw-mr| for how to mark files) (uses the local marked file list) @@ -1841,7 +1988,8 @@ Use at your own risk! Select a target directory with mt (|netrw-mt|). Then change directory, -select file(s) (see |netrw-mf|), and press "mm". +select file(s) (see |netrw-mf|), and press "mm". The move is done +from the current window (where one does the mf) to the target. Associated setting variable: |g:netrw_localmovecmd| |g:netrw_ssh_cmd| @@ -1861,6 +2009,36 @@ Netrw will source the marked files (using vim's |:source| command) +MARKED FILES: SETTING THE TARGET DIRECTORY *netrw-mt* {{{2 + (See |netrw-mf| and |netrw-mr| for how to mark files) + +Set the marked file copy/move-to target (see |netrw-mc| and |netrw-mm|): + + * If the cursor is atop a file name, then the netrw window's currently + displayed directory is used for the copy/move-to target. + + * Also, if the cursor is in the banner, then the netrw window's currently + displayed directory is used for the copy/move-to target. + Unless the target already is the current directory. In which case, + remove the target. + + * However, if the cursor is atop a directory name, then that directory is + used for the copy/move-to target + +There is only one copy/move-to target per vim session; ie. the target is a +script variable (see |s:var|) and is shared between all netrw windows (in an +instance of vim). + +When using menus and gvim, netrw provides a "Targets" entry which allows one +to pick a target from the list of bookmarks and history. + +Related topics: + Marking Files......................................|netrw-mf| + Marking Files by Regular Expression................|netrw-mr| + Marked Files: Target Directory Using Bookmarks.....|netrw-Tb| + Marked Files: Target Directory Using History.......|netrw-Th| + + MARKED FILES: TAGGING *netrw-mT* {{{2 (See |netrw-mf| and |netrw-mr| for how to mark files) (uses the global marked file list) @@ -1870,7 +2048,7 @@ netrw will use ssh (see |g:netrw_ssh_cmd|), and so ssh must be available for this to work on remote systems. For your local system, see |ctags| on how to get a version. I myself use hdrtags, currently available at -http://mysite.verizon.net/astronaut/src/index.html , and have > +http://www.drchip.org/astronaut/src/index.html , and have > let g:netrw_ctags= "hdrtag" < @@ -1886,34 +2064,48 @@ Associated setting variables: |g:netrw_ctags| |g:netrw_ssh_cmd| +MARKED FILES: TARGET DIRECTORY USING BOOKMARKS *netrw-Tb* {{{2 -MARKED FILES: SETTING THE TARGET DIRECTORY *netrw-mt* {{{2 - (See |netrw-mf| and |netrw-mr| for how to mark files) +Sets the marked file copy/move-to target (see |netrw-mc| and |netrw-mm|). -Set the marked file copy/move-to target (see |netrw-mc| and |netrw-mm|): +The |netrw-qb| map will give you a list of bookmarks (and history). +One may choose one of the bookmarks to become your marked file +target by using [count]Tb (default count: 1). - * if the cursor is atop a file name, then the netrw window's currently - displayed directory is used for the copy/move-to target. +Related topics: + Listing Bookmarks and History......................|netrw-qb| + Marked Files: Setting The Target Directory.........|netrw-mt| + Marked Files: Target Directory Using History.......|netrw-Th| + Marking Files......................................|netrw-mf| + Marking Files by Regular Expression................|netrw-mr| - * also, if the cursor is in the banner, then the netrw window's currently - displayed directory is used for the copy/move-to target. - * however, if the cursor is atop a directory name, then that directory is - used for the copy/move-to target +MARKED FILES: TARGET DIRECTORY USING HISTORY *netrw-Th* {{{2 + +Sets the marked file copy/move-to target (see |netrw-mc| and |netrw-mm|). + +The |netrw-qb| map will give you a list of history (and bookmarks). +One may choose one of the history entries to become your marked file +target by using [count]Th (default count: 0; ie. the current directory). + +Related topics: + Listing Bookmarks and History......................|netrw-qb| + Marked Files: Setting The Target Directory.........|netrw-mt| + Marked Files: Target Directory Using Bookmarks.....|netrw-Tb| + Marking Files......................................|netrw-mf| + Marking Files by Regular Expression................|netrw-mr| -There is only one copy/move-to target per vim session; ie. the target is a -script variable (see |s:var|) and is shared between all netrw windows (in an -instance of vim). MARKED FILES: UNMARKING *netrw-mu* {{{2 (See |netrw-mf| and |netrw-mr| for how to mark files) The "mu" mapping will unmark all currently marked files. - + *netrw-browser-settings* NETRW BROWSER VARIABLES *netrw-browser-options* *netrw-browser-var* {{{2 -(if you're interested in the netrw file transfer settings, see |netrw-options|) +(if you're interested in the netrw file transfer settings, see |netrw-options| + and |netrw-protocol|) The browser provides settings in the form of variables which you may modify; by placing these settings in your <.vimrc>, you may customize @@ -1936,6 +2128,10 @@ NOTE: suppressing the banner is a new feature which may cause problems. + *g:netrw_bannerbackslash* if this variable exists and is not zero, the + banner will be displayed with backslashes + rather than forward slashes. + *g:netrw_browse_split* when browsing, will open the file by: =0: re-using the same window =1: horizontally splitting the window first @@ -1963,26 +2159,58 @@ Will compress marked files with this command + *g:Netrw_corehandler* Allows one to specify something additional + to do when handling files via netrw's + browser's "x" command (see |netrw-x|). If + present, g:Netrw_corehandler specifies + either one or more function references + (see |Funcref|). (the capital g:Netrw... + is required its holding a function reference) + + *g:netrw_ctags* ="ctags" - The default external program used to create tags + The default external program used to create + tags - *g:netrw_cursorline* = 1 (default) - will use the |'cursorline'| local setting when - |g:netrw_liststyle| ==0 (thin listing) or - |g:netrw_liststyle| ==1 (long listing) or - |g:netrw_liststyle| ==3 (tree listing) - (ie. doesn't affect the wide listing) - =0: off - =2: like ==1, but the wide listing gets both - cursorline and |'cursorcolumn'|locally set + *g:netrw_cursor* = 2 (default) + This option controls the use of the + |'cursorline'| (cul) and |'cursorcolumn'| + (cuc) settings by netrw: + + Value Thin-Long-Tree Wide + =0 u-cul u-cuc u-cul u-cuc + =1 u-cul u-cuc cul u-cuc + =2 cul u-cuc cul u-cuc + =3 cul u-cuc cul cuc + =4 cul cuc cul cuc + + Where + u-cul : user's |'cursorline'| setting used + u-cuc : user's |'cursorcolumn'| setting used + cul : |'cursorline'| locally set + cuc : |'cursorcolumn'| locally set - *g:netrw_decompress* = { ".gz" : "gunzip" , + *g:netrw_decompress* = { ".gz" : "gunzip" , ".bz2" : "bunzip2" , ".zip" : "unzip" , ".tar" : "tar -xf"} A dictionary mapping suffices to decompression programs. + *g:netrw_dirhistmax* =10: controls maximum quantity of past + history. May be zero to supppress + history. + (related: |netrw-qb| |netrw-u| |netrw-U|) + + *g:netrw_dynamic_maxfilenamelen* =32: enables dynamic determination of + |g:netrw_maxfilenamelen|, which affects + local file long listing. + *g:netrw_errorlvl* =0: error levels greater than or equal to + this are permitted to be displayed + 0: notes + 1: warnings + 2: errors + *g:netrw_fastbrowse* =0: slow speed directory browsing; never re-uses directory listings, always obtains directory listings. @@ -2046,7 +2274,10 @@ These characters in directory names are escaped before applying glob() - *g:netrw_hide* if true, the hiding list is used + *g:netrw_hide* Controlled by the "a" map (see |netrw-a|) + =0 : show all + =1 : show not-hidden files + =2 : show hidden files only default: =0 *g:netrw_home* The home directory for where bookmarks and @@ -2082,15 +2313,15 @@ Copies marked files (|netrw-mf|) to target directory (|netrw-mt|, |netrw-mc|) + *g:netrw_localmkdir* command for making a local directory + default: "mkdir" + *g:netrw_localmovecmd* ="mv" Linux/Unix/MacOS/Cygwin ="move" Windows Moves marked files (|netrw-mf|) to target directory (|netrw-mt|, |netrw-mm|) - *g:netrw_local_mkdir* command for making a local directory - default: "mkdir" - - *g:netrw_local_rmdir* remove directory command (rmdir) + *g:netrw_localrmdir* remove directory command (rmdir) default: "rmdir" *g:netrw_maxfilenamelen* =32 by default, selected so as to make long @@ -2101,16 +2332,26 @@ columnar. *g:netrw_mkdir_cmd* command for making a remote directory + via ssh (also see |g:netrw_remote_mkdir|) default: "ssh USEPORT HOSTNAME mkdir" - *g:netrw_mousemaps* =1 (default) enables the mouse buttons - while browsing: + *g:netrw_mousemaps* =1 (default) enables mouse buttons while + browsing to: leftmouse : open file/directory shift-leftmouse : mark file middlemouse : same as P rightmouse : remove file/directory =0: disables mouse maps + *g:netrw_nobeval* doesn't exist (default) + If this variable exists, then balloon + evaluation will be suppressed + (see |'ballooneval'|) + + *g:netrw_remote_mkdir* command for making a local directory + via ftp (also see |g:netrw_mkdir_cmd|) + default: "mkdir" + *g:netrw_retmap* if it exists and is set to one, then: * if in a netrw-selected file, AND * no normal-mode <2-leftmouse> mapping exists, @@ -2136,7 +2377,7 @@ *g:netrw_rmdir_cmd* command for removing directories default: "ssh USEPORT HOSTNAME rmdir" - *g:netrw_rmf_cmd* command for removing softlinks + *g:netrw_rmf_cmd* command for removing softlinks default: "ssh USEPORT HOSTNAME rm -f" *g:netrw_sort_by* sort by "name", "time", or "size" @@ -2161,7 +2402,7 @@ \.info$,\.swp$,\.obj$' *g:netrw_special_syntax* If true, then certain files will be shown - in special syntax in the browser: + using special syntax in the browser: netrwBak : *.bak netrwCompress: *.gz *.bz2 *.Z *.zip @@ -2171,7 +2412,7 @@ netrwMakefile: [mM]akefile *.mak netrwObj : *.o *.obj netrwTags : tags ANmenu ANtags - netrwTilde : *~ + netrwTilde : *~ netrwTmp : tmp* *tmp These syntax highlighting groups are linked @@ -2182,11 +2423,6 @@ < into one's <.vimrc> to use one's own preferences. - *g:netrw_ssh_cmd* One may specify an executable command - to use instead of ssh for remote actions - such as listing, file removal, etc. - default: ssh - *g:netrw_ssh_browse_reject* ssh can sometimes produce unwanted lines, messages, banners, and whatnot that one doesn't want masquerading as "directories" and "files". @@ -2194,6 +2430,11 @@ messages. By default its value is: '^total\s\+\d\+$' + *g:netrw_ssh_cmd* One may specify an executable command + to use instead of ssh for remote actions + such as listing, file removal, etc. + default: ssh + *g:netrw_tmpfile_escape* =' &;' escape() is applied to all temporary files @@ -2219,8 +2460,14 @@ *g:netrw_winsize* specify initial size of new windows made with "o" (see |netrw-o|), "v" (see |netrw-v|), - |:Hexplore| or |:Vexplore|. - default: "" + |:Hexplore| or |:Vexplore|. The g:netrw_winsize + is an integer describing the percentage of the + current netrw buffer's window to be used for + the new window. + If g:netrw_winsize is less than zero, then + the absolute value of g:netrw_winsize lines + or columns will be used for the new window. + default: 50 (for 50%) *g:netrw_xstrlen* Controls how netrw computes string lengths, including multi-byte characters' string @@ -2254,7 +2501,7 @@ autochdir sets the current directory to that containing the "file" (even if that "file" is itself a directory). -NETRW SETTINGS *netrw-settings* {{{2 +NETRW SETTINGS WINDOW *netrw-settings-window* {{{2 With the NetrwSettings.vim plugin, > :NetrwSettings @@ -2263,7 +2510,7 @@ settings therein will be used. One may also press "?" on any of the lines for help on what each of the variables do. -(also see: |netrw-browser-var| |netrw-protocol| |netrw-var| |netrw-variables|) +(also see: |netrw-browser-var| |netrw-protocol| |netrw-variables|) ============================================================================== @@ -2297,7 +2544,7 @@ * To automatically make the currently browsed directory the current directory, see |g:netrw_keepdir|. - + *netrw-createfile* OPEN A NEW FILE IN NETRW'S CURRENT DIRECTORY *netrw-%* To open a file in netrw's current directory, press "%". This map will @@ -2323,15 +2570,14 @@ 1. Make vertical splitting the default for previewing files 2. Make the default listing style "tree" 3. When a vertical preview window is opened, the directory listing - will use only 30 columns; the rest of the window is used for the - preview window. + will use only 30% of the columns available; the rest of the window + is used for the preview window. PREVIOUS WINDOW *netrw-P* *netrw-prvwin* {{{2 To edit a file or directory in the previously used (last accessed) window (see :he |CTRL-W_p|), press a "P". If there's only one window, then the one window -will be horizontally split (above/below splitting is controlled by -|g:netrw_alto|, and its initial size is controlled by |g:netrw_winsize|). +will be horizontally split (by default). If there's more than one window, the previous window will be re-used on the selected file/directory. If the previous window's associated buffer @@ -2339,6 +2585,13 @@ the user will be asked if s/he wishes to save the buffer first (yes, no, or cancel). +Related Actions |netrw-cr| |netrw-o| |netrw-t| |netrw-v| +Associated setting variables: + |g:netrw_alto| control above/below splitting + |g:netrw_altv| control right/left splitting + |g:netrw_preview| control horizontal vs vertical splitting + |g:netrw_winsize| control initial sizing + REFRESHING THE LISTING *netrw-ctrl-l* *netrw-ctrl_l* {{{2 @@ -2347,6 +2600,15 @@ refresh a local directory by using ":e .". +REVERSING SORTING ORDER *netrw-r* *netrw-reverse* {{{2 + +One may toggle between normal and reverse sorting order by pressing the +"r" key. + +Related topics: |netrw-s| +Associated setting variable: |g:netrw_sort_direction| + + RENAMING FILES OR DIRECTORIES *netrw-move* *netrw-rename* *netrw-R* {{{2 If there are no marked files: (see |netrw-mf|) @@ -2377,15 +2639,6 @@ the V (|linewise-visual|). -REVERSING SORTING ORDER *netrw-r* *netrw-reverse* {{{2 - -One may toggle between normal and reverse sorting order by pressing the -"r" key. - -Related topics: |netrw-s| -Associated setting variable: |g:netrw_sort_direction| - - SELECTING SORTING STYLE *netrw-s* *netrw-sort* {{{2 One may select the sorting style by name, time, or (file) size. The "s" map @@ -2469,9 +2722,9 @@ P5. My times come up oddly in local browsing Does your system's strftime() accept the "%c" to yield dates - such as "Sun Apr 27 11:49:23 1997"? If not, do a "man strftime" - and find out what option should be used. Then put it into - your |.vimrc|: > + such as "Sun Apr 27 11:49:23 1997"? If not, do a + "man strftime" and find out what option should be used. Then + put it into your |.vimrc|: > let g:netrw_timefmt= "%X" (where X is the option) < @@ -2604,7 +2857,7 @@ *netrw-p11* P11. I want to have two windows; a thin one on the left and my editing - window on the right. How can I do this? + window on the right. How may I accomplish this? * Put the following line in your <.vimrc>: let g:netrw_altv = 1 @@ -2650,30 +2903,68 @@ "let g:netrw_sftp_cmd = "d:\\dev\\putty\\PSFTP.exe" "let g:netrw_scp_cmd = "d:\\dev\\putty\\PSCP.exe" < - + *netrw-p14* + P14. I'd would like to speed up writes using Nwrite and scp/ssh + style connections. How? (Thomer M. Gil) + + Try using ssh's ControlMaster and ControlPath (see the ssh_config + man page) to share multiple ssh connections over a single network + connection. That cuts out the cryptographic handshake on each + file write, sometimes speeding it up by an order of magnitude. + (see http://thomer.com/howtos/netrw_ssh.html) + (included by permission) + + Add the following to your ~/.ssh/config: > + + # you change "*" to the hostname you care about + Host * + ControlMaster auto + ControlPath /tmp/%r@%h:%p + +< Then create an ssh connection to the host and leave it running: > + + ssh -N host.domain.com + +< Now remotely open a file with Vim's Netrw and enjoy the + zippiness: > + + vim scp://host.domain.com//home/user/.bashrc +< + *netrw-p15* + P15. How may I use a double-click instead of netrw's usual single click + to open a file or directory? (Ben Fritz) + + First, disable netrw's mapping with > + let g:netrw_mousemaps= 0 +< and then create a netrw buffer only mapping in + $HOME/.vim/after/ftplugin/netrw.vim: > + nmap <2-leftmouse> +< Note that setting g:netrw_mousemaps to zero will turn off + all netrw's mouse mappings, not just the one. + (see |g:netrw_mousemaps|) ============================================================================== 11. Debugging Netrw Itself *netrw-debug* {{{1 -The script is typically available as: +The script is typically available as something like: > - /usr/local/share/vim/vim6x/plugin/netrwPlugin.vim - /usr/local/share/vim/vim6x/autoload/netrw.vim -< -or- > /usr/local/share/vim/vim7x/plugin/netrwPlugin.vim /usr/local/share/vim/vim7x/autoload/netrw.vim +< -or- > + /usr/local/share/vim/vim6x/plugin/netrwPlugin.vim + /usr/local/share/vim/vim6x/autoload/netrw.vim < which is loaded automatically at startup (assuming :set nocp). 1. Get the script, available as: - http://mysite.verizon.net/astronaut/vim/index.html#DECHO + http://www.drchip.org/astronaut/vim/index.html#DECHO or http://vim.sourceforge.net/scripts/script.php?script_id=120 It now comes as a "vimball"; if you're using vim 7.0 or earlier, you'll need to update vimball, too. See - http://mysite.verizon.net/astronaut/vim/index.html#VIMBALL + http://www.drchip.org/astronaut/vim/index.html#VIMBALL 2. Edit the file by typing: > @@ -2706,821 +2997,145 @@ ============================================================================== 12. History *netrw-history* {{{1 - v140: Jul 27, 2010 * (Lech Lorens) unexpected change of window - v139: May 14, 2010 * when viewing remote directory listings and - changing listing style, going to tree listing - mode was issuing two rather useless messages - about the buffer name. They have now been - silenced. - * (Jean Johner) with "behave mswin", clicking - on a filename in wide mode opened a new file - with a missing first letter - * (Britton Kerin) wanted netrw listings to be - buflisted; the |g:netrw_bufsettings| option - permits that. - Jun 18, 2010 * (Jan Steffens) added support for xz compression - Jun 23, 2010 * vimdiff dir1 dir2 now works - Jul 27, 2010 * (John Orr) pointed out that the intended maparg - test for gx was actually testing for g rather - than gx. Fixed. - v138: May 01, 2010 * added the bomb setting to the Save-Set-Restore - option handling (for Tony M) - May 14, 2010 * (Bram Moolenaar) netrw optionally sets cursorline - (and sometimes cursorcolumn) for its display. - This option setting was leaking through with - remote file handling. - v137: Dec 28, 2009 * modified the preview window handling for - vertically split windows. The preview - window will take up all but g:netrw_winsize - columns of the original window; those - g:netrw_winsize columns will be used for - the netrw listing. - * (Simon Dambe) removed "~" from - |g:netrw_glob_escape| under Windows - * (Bram Moolenaar) modified test for status bar - click with leftmouse. Moved code to - s:NetrwLeftmouse(). - Feb 24, 2010 * (for Jean Johner) added insert-mode maps; one - can get into insert mode with netrw via - ctrl-o :e . - Mar 15, 2010 * (Dominique Pellé) Directory with backslashes such - as foo\bar were not being entered/left properly - Mar 15, 2010 * Using :Explore .. and causing two FocusGained - events caused the directory to change. Fixed. - Mar 22, 2010 * Last fix caused problems for *//pat and */filepat - searches. - Mar 30, 2010 * With :set hidden and changing listing styles 8 - times, the tree listing buffer was being marked - as modified upon exit. Fixed. - v136: Jan 14, 2009 * extended |g:Netrw_funcref| to also handle lists - of function references - Jan 14, 2009 * (reported by Marvin Renich) with spell check - enabled, some filenamess will still being - displayed as spelling errors. - Apr 13, 2009 * (Björn Winckler) writing a file using - remote scp caused syntax highlighting problem. - Solution: avoid syntax/syntax.vim's - au Filetype * syntax setting autocommand by - checking that the current buffer has the - netrw filetype before attempting a doau - in s:NetrwSafeOptions(). - Apr 14, 2009 * (asgeo1) suggested the "T" map (|netrw-T|) - Apr 14, 2009 * marking wasn't working on executable and - other special filenames - Apr 20, 2009 * (Dennis Benzinger) files opened via http have - their syntax filetype auto-detected - Jun 19, 2009 * (Yukihiro Nakadaira) help document improvements - Jul 22, 2009 * g:netrw_browse_split will honor the - |'equalalways'| setting. - Jul 29, 2009 * implemented "I" mapping to toggle banner - (this is experimental and still being debugged) - Sep 19, 2009 * (Mike McEwan) writes via ftp now send both - g:netrw_ftpmode and g:netrw_ftpextracmd (if the - latter exists) - Dec 02, 2009 * netrw uses vimgrep several places; it now uses - "noautocmd vimgrep" (should be speedier). - Dec 03, 2009 * changed back to using -source instead of -dump - for elinks-using commands. (requested by James - Vega and Karsten Hopp) - v135: Oct 29, 2008 * using |simplify()| on directory names - (supporting handling ".."s in directory names) - Oct 31, 2008 * added special file highlighting for core dumps - under Unix/Linux. The default sorting sequence - now also gives core dumps priority. - Nov 10, 2008 * uses a call to netrw#Nread() instead of Nread - to avoid having to use fnameescape() - * fixed a tree redrawing problem (open directory, - open subdir, close subdir, close dir) - Nov 19, 2008 * sprinkled some histdel("/",-1)s through the code - in an attempt to prevent netrw from changing - the search history. - Jan 02, 2009 * |g:Netrw_funcref| included - Jan 05, 2009 * Explore */ **/ *// **// all clear explorer - variables - Jan 05, 2009 * (Panagiotis Louridas) extended s:WinPath() - to remove cygdrive from non-cygwin Windows - paths. Improved the determination as to - whether or not to do so. - Jan 13, 2009 * included contains=@NoSpell in every syntax - group for syntax/netrw.vim . - v134: Sep 30, 2008 * (Sander Marechal) provided a bugfix involving - the use of the |netrw-t| command with a remote - directory. - Sep 30, 2008 * using "x" on a remote jpg was failing; fixed. - Oct 03, 2008 * bookmarks now go on a list and are stored to - the first directory on the |'runtimepath'| in - the hopes of making their retention reliable. - History now also goes to that directory. - Oct 07, 2008 * Included check that vim 7.0 or later is in use. - Oct 07, 2008 * Improved |g:netrw_retmap| handling. - Oct 12, 2008 * Based upon Sébastien Migniot's suggestion, if - cadaver isn't available then netrw will try to - use curl for the dav://... protocol. - Oct 13, 2008 * added @*/ to netrw buffers' |'iskeyword'|setting - This lets mf (|netrw-mf|) mark directories, links - and executables. - Oct 13, 2008 * avoids a second NetrwBrowse() refresh when - g:netrw_fastbrowse is <= 1 (slow, medium speed) - Oct 22, 2008 * |g:netrw_http_xcmd| may now be overridden - independently of |g:netrw_http_cmd|. - Oct 23, 2008 * [N] added to the various Explore commands to - let users specify the width/height of new - explorer windows, overriding |g:netrw_winsize|. - v133: Aug 10, 2008 * NetReadFixup() for win95 was missing some "a:"s - Aug 12, 2008 * (Jan Minář) an error condition in NetrwMethod() - wasn't being used, resulting in "b:netrw_fname - undefined" errors - Aug 12, 2008 * (François Ingeirest) asked that "hi link" be - changed to hi default link in the netrw syntax - files. - Aug 12, 2008 * using s:NetrwUnmarkList() more often. Filenames - were being left on the global list when removed - from the buffer-local lists. - Aug 14, 2008 * (Joshua Clayton) an errant extra ")" was left in - the rcp-handling portion of NetRead(). - Sep 03, 2008 * added |'cursorline'| highlighting to thin, long, - and tree displays. - v132: Aug 06, 2008 * Fixed marked file-based obtain - Aug 08, 2008 * sourcing a file via ftp from a netrw-generated - buffer (or any buffer with |'nobl'|) left an - empty no-name buffer in its wake. Fixed. - v130: Jul 31, 2008 * trying out elinks/links for http://host/ - requests. One problem: in-page links - (such as with ...#LABEL) are not supported - * verified that Bram's modified netrwPlugin works - Aug 01, 2008 * fixed a bug: when sourcing a file via ftp, the - "filter window" was left behind. - v129: Jul 31, 2008 * bug found in non-mouse enabled vim and some - local maps - v128: Jul 30, 2008 * much work done in using shellescape() and - fnameescape() - v126: Jun 30, 2008 * after having gone to a remote directory, - was no longer taking one to the correct - entry in the help (|netrw-quickhelp|). Fixed. - Jul 01, 2008 * extracting the last filename from a wide listing - missed the last letter when |'virtualedit'| not - enabled. - Jul 01, 2008 * vim foo/bar was creating [Scratch] buffers, - where bar was also a directory - Jul 01, 2008 * numerous additional changes were made to netrw - to use fnameescape() and shellescape() instead - of escape(). Not all changes have been tested - as yet... - Jul 01, 2008 * (James Vega reported) some problems with - :NetrwSettings (due to no longer used setting - variables). - Jul 07, 2008 * Additional numerous changes to support security; - shellescape(arg,1), etc. - v125: Apr 07, 2008 * (Cristian Rigamonti) CR provides a patch; he - noted that gx was failing since its call to - netrw#NetBrowseX() wasn't updated to - netrw#NetrwBrowseX(). - * (Stanis Trendelenburg) ST provides a patch to - supports davs: (dav + ssl) - * (Rick Choi) noted that directory names comprised - of three digits were not being displayed by - the internal browser. Fixed. - * (Erik Falor) provided a patch to handle problems - with changing directory and |'acd'| option. - * (James Vega, Teemu Likonen) noted that netrw - wasn't handling multi-byte filenames/directories - correctly. Fixed. - * (Rick) found problem with g:netrw_maxfilenamelen - being overridden. - * (James Vega) pointed out that netrw was - misidentifying all files in a symbolically linked - directory as being symbolically linked - themselves. This particular problem was fixed; - however, there are now situations where - symbolically linked files will not be detected. - Really need an internal vim function to do this - identification. - Apr 17, 2008 * When g:netrw_keepdir==0, current directory - doesn't necessarily equal b:netrw_curdir - initially. Problem is due to the patch directly - above. - * Fixed qf to handle case where b:netrw_curdir - isn't the same as the current directory under - linux/macosx. - * New: |netrw-mg| (apply vimgrep to marked files) - May 05, 2008 * (Rick) pointed out that a "setlocal ts=32" was - interfering with g:netrw_maxfilenamelen - May 05, 2008 * (James Vega) a file inside a linked directory - was showing up as a symbolic link itself. - May 22, 2008 * symbolic links, fifos, and sockets are now - indicated by a trailing @, |, or =, respectively. - Jun 06, 2008 * Removed numerous bugs from the marked file - move and copy. Tested these changes under - Unix only thus far. - * :Rexplore returns to the screen position in the - netrw listing from whence the file was edited - v124: Apr 02, 2008 * (Adrian Rollett) change the line supporting the - "x" action for mac to use g:netrw_shq - v123: Feb 27, 2008 * Marked files now keeps a "global" marked file - list. The global marked file list is used to - support tag processing and vimdiff'ing - (|netrw-md| |netrw-mt|) - * Been insuring that mm and mc works with various - combinations of local and remote directories - * (Stefan Bittner) http://.../ should always have - filetype "html" -- fixed. - * (Stefan Bittner) a "?" in a http://.../ request - wasn't being handled correctly. Fixed by - removing ? from default |g:netrw_tmpfile_escape|. - * (Nico Weber) % codes in http://.../ requests - weren't being handled correctly. Fixed by - including % in default |g:netrw_fname_escape|. - * (Stefan Bittner) attempts to update Buffers.Refresh - were failing because locale use changed the menu - names. I implemented a workaround. - v122: Feb 12, 2008 * bugfix - first sorting sequence match now has - priority - Feb 14, 2008 * bugfix - sorting sequence was effectively ignoring - sequencing priority of anything following '*' - * toggling a marked file was showing incorrect list - (list was correct, but displayed matches weren't) - * |g:netrw_special_syntax| implemented - v121: Feb 11, 2008 * Bram M reported that :e file ... :e . would not - retain the alternate file. Fixed -- I hope! - * bugfix -- apparently v120 broke an explicit - :Explore dirname - v120: Jan 21, 2008 * |netrw-mt| changed to allow for target selection - based on whether or not word under cursor is a - directory or file, or if cursor is in banner - area. - * |netrw-mh| included (hiding by marked-file suffix) - * functions moved about a bit (improved - categorization) - * executable files now displayed with trailing (*) - * symbolically linked files now displayed with - trailing (@) - * Somewhen, s:NetrwMarkFileMove() got damaged. It - * is now restored (missing an endif, for example). - * |netrw-mu| implemented (unmarking marked files) - * many bugs have been removed from the marked file - system (tnx to Mark S. for feedback) - * |netrw-ms| implemented (sourcing marked files) - * fixed use of P with tree listing style - * multiple tree listing now supported - * ./ suppressed - * changed q -> qb (query bookmarks) - * implemented |netrw-qf| - * Explore now has four special list-generation - modes: */filepat **/filepat - *//pattern **//pattern - * gh (|netrw-gh|) is a shortcut for toggling the - hiding of files and directories beginning with a - dot - v119: Jan 10, 2008 * When g:netrw_keepdir is false, - NetrwOptionsRestore() had a problem - (Bill McCarthy) - Jan 11, 2008 * Netrw now shows symbolic links with a trailing - "@" and special highlighting. - Jan 15, 2008 * Changed g:netrw_noretmap -> |g:netrw_retmap|. - Changed: disabled by default at Bram's - preference. - v118: Jan 02, 2008 * Fixed a problem with Windows; - :Explore c:/path/ would not work, - but :Explore c:/path would. - * Fixed a bug in s:NetrwOptionRestore() - lcd's - argument wasn't being properly escaped so it - wouldn't handle spaces in directory names. - (Gary Johnson) - v117: Jan 02, 2008 * Fixed a problem with P; had to include - a b:netrw_curdir bypass (Bram Moolenaar) - v116: Nov 27, 2007 * netrw#LocalBrowseCheck() has &ft=="netrw" - check to prevent doing a directory listing - (was getting unexpected directory refreshes - in the middle of some function calls) - * NetrwOptionRestore moved after e! filename - in order to retain user options for editing - in s:NetrwBrowseChgDir() - Dec 12, 2007 * Bug fix -- netrw does a better job of retaining - user options when editing files under the aegis - of the browser - v115: Oct 04, 2007 * Erik Remmelzwaal pointed out that the use of - shellslash in s:GetTempfile() was incorrect - Oct 11, 2007 * Tracked down and eliminated a bug with editing - remote *.tar.gz and *.tar.bz2 files - Oct 11, 2007 * g:netrw_localmovecmd wasn't being initialized - properly, and g:netrw_localcopycmd was being - overwritten. - Oct 12, 2007 * Placed all :Rexplore and <2-leftmouse> setup - in a new support function (s:SetRexDir()). - Oct 15, 2007 * new: g:netrw_browse_split == 4; means - based selection will use previous window - Oct 20, 2007 * also checks on |'shellxquote'| to set g:netrw_shq - Oct 24, 2007 * Explore handles path/**/filename - Oct 27, 2007 * sourcing remote files often didn't work with ftp, - turns out that b:netrw_method was undefined, so - s:SaveBufVars and s:RestoreBufVars() fixed it. - v114: Sep 28, 2007 * mT, the map that invokes tags, has been improved - to support use of remote tags files. - Oct 02, 2007 * changed Netrw menu to use more submenus - v113: Sep 07, 2007 * worked out why the cursor position wasn't being - saved and restored as intended after doing such - things as deleting and renaming files. - Sep 11, 2007 * Fixed bug which effectively disabled and - maps - Sep 18, 2007 * there used to be one NetrwOptionRestore() call at - the end of the s:NetrwBrowseChgDir() function; - they're now at the end of every if..elseif..else - block. The edit-a-file one is not quite at the end - of its block; instead, it's just before the edit. - Restores user options, then this new placement - allows ftplugins, autocmds, etc to change settings - (ex. ftplugin/cpp.vim sets cindent). - Sep 19, 2007 * changed all strlen() calls to use s:Strlen(), a - function which handles utf-8 wide characters - correctly. - Sep 20, 2007 * (Nico Weber) the "x" command has been extended - to Mac's OS/X (macunix); it now uses open to - handle |netrw-x| browsing with special files. - Sep 22, 2007 * Added g:netrw_noretmap to netrw at Tony M's - request. - * Included path to NetrwRemoteRmFile() - v112: Aug 18, 2007 * added mx (|netrw-mx|) for executing arbitrary - commands on marked files - Aug 22, 2007 * more option save/restore work for - s:NetrwBrowseChgDir(); s:NetrwOptionSave() - and s:NetrwOptionRestore() now take a parameter - specifying the type of variables to be used for - saving and restoring (either "w:" or "s:") - Sep 04, 2007 * added the :NetrwClean[!] command - v111: Jul 25, 2007 * using Windows but not using Cygwin, netrw does a - "file bufname" where the bufname uses /s - instead of \s; Vim "fixes" it by changing the - bufname to use \s anyway. This meant that - NetrwGetBuffer() didn't find the appropriately - named buffer, and so would generate a new - buffer listing; hence the cursor would appear - to have been moved when doing a preview. - * added <2-leftmouse> map to return to netrw's - browser display - Aug 16, 2007 * added the mark-file system, including - maps for mf mp mt mz and mu. Modifications - made to maps for a D O and R to support - marked files. - v110: May 10, 2007 * added [ and ] maps to NetrwTreeListing - May 25, 2007 * |g:netrw_preview| included - May 29, 2007 * modified netrw#NetBrowseX to consistently use - g:netrw_shq instead of hardcoded quotes, - and modified the snippet that sets up redir - so Windows machines use "nul" instead of - "/dev/null". - Jun 01, 2007 * fixed bug -- NetGetBuffer() wasn't always - recognizing a buffer name match when it should, - thus resulting in [Scratch] buffers. - Jun 04, 2007 * Gary Johnson found a bugfix for the "c" mapping - when the directory is to be made current but - the name contains spaces. - v109: Mar 26, 2007 * if a directory name includes a "$" character, - Explore() will use expand() in an attempt to - decipher the name. - May 07, 2007 * g:netrw_use_errorwindow now allows one to - have error messages go to a reliable window - or to use a less reliable but recallable - echoerr method - May 07, 2007 * g:netrw_scpport and g:netrw_sshport support - use of -P and -p, respectively, to set port - for scp/ssh. - v108: Jan 03, 2007 * included preview map (|netrw-p|), supporting - remote browsing - * netrw can now source remote files - Jan 26, 2007 * Colton Jamieson noted that remote directory - browsing did not support alternate port - selection. This feature has now been extended - to apply to all remote browsing commands via ssh. - (list, remove/delete, rename) - Jan 31, 2007 * Luis Florit reported that @* was an invalid - register. The @* register is now only saved and - restored if |'guioptions'| contains "a". - Feb 02, 2007 * Fixed a bug that cropped up when writing files - via scp using cygwin - Feb 08, 2007 * tree listing mode managed to stop working again; - fixed again! - Feb 15, 2007 * Guido Van Hoecke reported that netrw didn't - handle browsing well with M$ ftp servers. He even - set up a temporary account for me to test with - (thanks!). Netrw now can browse M$ ftp servers. - v107: Oct 12, 2006 * bypassed the autowrite option - Oct 24, 2006 * handles automatic decompression of *.gz and *.bz2 - files - Nov 03, 2006 * Explore will highlight matching files when - **/pattern is used (and if the |'hls'| option - is set) - Nov 09, 2006 * a debugging line, when enabled, was inadvertently - bringing up help instead of simply reporting on - list contents - Nov 21, 2006 * tree listing improved (cursor remains put) - Nov 27, 2006 * fixed b:netrw_curdir bug when repeated "i"s were - pressed. - Dec 15, 2006 * considerable qty of changes, mostly to share more - code between local and remote browsing. Includes - support for tree-style listing for both remote - and local browsing. - Dec 15, 2006 * Included Peter Bengtsson's modifications to - support the Amiga. - v106: Sep 21, 2006 * removed old v:version<700 code as netrw now - requires vim 7.0 - * worked around a bug where register * was - overwritten during local browsing - v104: Sep 05, 2006 * as suggested by Rodolfo Borges, :Explore and - variants will position the cursor on the file - just having been edited - * changed default |g:netrw_sort_sequence| order - * changed b, Nb to simply mb (see |netrw-mb|) - * changed B, NB to simply gb (see |netrw-gb|) - * tree listing style (see |g:netrw_liststyle|) - * attempts to retain the alternate file - v103: Jul 26, 2006 * used Yakov Lerner's tip#1289 to improve netrw - error message display - * wide listings didn't handle files with backslashes - in their names properly. A symptom was an - inability to open files. - Aug 09, 2006 * included "t" mapping for opening tabbed windows, - both for remote and local browsing - * changed netrw_longlist to netrw_liststyle - Aug 15, 2006 * fixed one of the NB maps - Aug 22, 2006 * changed *Explore commands to use -nargs=* instead - of -nargs=?. Allows both -complete=dir _and_ the - starstar arguments to work (-nargs=? seems to - require one or the other). - Aug 23, 2006 * copied all w:.. variables across splits to - new windows - Aug 25, 2006 * when g:netrw_browsex_viewer was '-' - (see |g:netrw_browsex_viewer|) it wasn't causing - netrwFileHandlers#Invoke() to be called as it - was expected to. (tnx Steve Dugaro) - Aug 29, 2006 * changed NetBrowseX() to use "setlocal ... noswf" - instead of "set ... noswf" (tnx Benji Fisher) - Aug 31, 2006 * tabs and fastbrowse<=1 didn't work together. - v102: Jun 15, 2006 * chgd netrwPlugin to call netrw#LocalBrowseCheck() - * bugfix: g:netrw_keepdir==0 had stopped working - Jul 06, 2006 * bugfix: NetOptionSave/Restore now saves/restores - the unnamed register (|registers|) - Jul 07, 2006 * |g:netrw_menu| support included - Jul 13, 2006 * :Texplore command implemented - Jul 17, 2006 * NetSplit and (Local|Net)BrowseChgDir() were both - splitting windows. This affected o, v, and - g:netrw_browse_split. - Jul 20, 2006 * works around wildignore setting (was causing - netrw's local browser not to list wildignore'd - files) - Jul 24, 2006 * acts as a for selecting a file - acts as a for deleting a file - v100: May 14, 2006 * when using Windows and shell==cmd.exe, the - default for g:netrw_ignorenetrc is now 1 - * bugfix: unwanted ^Ms now removed - (affected shell==cmd.exe - Windows) - * added Bookmarks and History to the menu - * an error message about non-existing - w:netrw_longlist was appearing during attempts to - Explore (fixed) - * g:netrw_shq now available to make netrw use - specified style of quotes for commands - May 29, 2006 * user NFH_*() functions were inadvertently being - ignored - * fixed a Windows non-cygwin ftp handling problem. - * hiding pattern candidate separators included some - characters it shouldn't have (tnx to Osei Poku) - Jun 01, 2006 * for browsing, netrw was supposed to use "dir" - instead of "ls -lF" when using - ftp+non-cygwin+windows. Fixed. - * an inadvertently left-in-place debugging statement - was preventing use of the "x" key with browsing. - Jun 05, 2006 * g:netrw_nogx available to prevent making the gx - map (see |g:netrw_nogx|) - * bugfix, Explore wouldn't change directory - properly (vim ., :Explore subdirname) - Jun 06, 2006 * moved history to 2nd line in Netrw menu - * fixed delete for unix-based systems - Jun 07, 2006 * x key now works for windows-noncygwin-ftp - Jun 08, 2006 * Explore */pat and **//pat now wraps - v99: May 09, 2006 * g:netrw_browse_split=3 for opening files in new - tabs implemented. - May 12, 2006 * deletes temporary file at end of NetRead() - * visual mode based Obtain implemented - * added -complete=dir to the various Explore - commands - v98: May 02, 2006 * the "p" key didn't work properly when the browsing - directory name had spaces in it. - v97: May 01, 2006 * exists("&acd") now used to determine if - the 'acd' option exists - * "obtain" now works again under Windows - v96: * bugfix - the |'acd'| option is not always defined - but is now bypassed only when it is - v95: * bugfix - Hiding mode worked correctly (don't show - any file matching any of the g:netrw_hide - patterns), but showing mode was showing only those - files that didn't match any of the g:netrw_hide - patterns. Instead, it now shows all files that - match any of the g:netrw_hide patterns (the - difference between a logical and and logical or). - v94: * bugfix - a Decho() had a missing quote; only - affects things when debugging was enabled. - v93: * bugfix - removed FocusGained event from causing a - slow-browser refresh for Windows - v92: * :Explore **//pattern implemented - (**/filepattern was already taken) - v91: * :Explore */pattern implemented - * |'acd'| option bypassed - v90: * mark ', as suggested by Yegappan Lakshmanan, used - to help guarantee entry into the jump list when - appropriate. - * and are no longer defined until a - :Explore **/pattern is used (if the user already - has a map for them). They will be defined for new - browser windows from that point forward. - v89: * A , , :Nexplore, or a :Pexplore - without having first done an :Explore **/pattern - (see |netrw-starstar|) caused - a lot of unhelpful error messages to appear - v88: * moved DrChip.Netrw menu to Netrw. Now has - priority 80 by default. - g:NetrwTopLvlMenu == "Netrw" and can be changed - by the user to suit. The priority is given by - g:NetrwMenuPriority. - * Changed filetype for browser displays from - netrwlist to netrw. - v87: * bug fix -- menus were partially disappearing - v85: * bug fix -- missing an endif - * bug fix -- handles spaces in names and directories - when using ftp-based browsing - v83: * disabled stop-acd handling; the change in directory - handling may allow acd to be used again. - * D was refusing to delete remote files/directories - in wide listing mode. - v81: * FocusGained also used to refresh/wipe local browser - directory buffers - * (bugfix) netrw was leaving [Scratch] buffers behind - when the user had the "hidden" option set. The - 'hidden' option is now bypassed. - v80: * ShellCmdPost event used in conjunction with - g:netrw_fastbrowse to refresh/wipe local browser - directory buffers. - v79: * directories are now displayed with nowrap - * (bugfix) if the column width was smaller than the - largest file's name, then netrw would hang when - using wide-listing mode - fixed - * g:netrw_fastbrowse introduced - v78: * progress has been made on allowing spaces inside - directory names for remote work (reading, writing, - browsing). (scp) - v77: * Mikolaj Machowski fixed a bug in a substitute cmd - * g:netrw_browsex_viewer implemented - * Mikolaj Machowski pointed out that gnome-open is - often executable under KDE systems, although it is - effectively not functional. NetBrowseX now looks - for "kicker" as a running process to determine if - KDE is actually running. - * Explorer's O functionality was inadvertently left - out. Netrw now does the same thing, but with the - "P" key. - * added g:netrw_browse_split option - * fixed a bug where the directory contained a "." but - the file didn't (was treating the dirname from "." - onwards as a suffix) - v76: * "directory is missing" error message now restores - echo highlighting - v75: * file://... now conforms to RFC2396 (thanks to - S. Zacchiroli) - * if the binary option is set, then NetWrite() will - only write the whole file (line numbers don't make - sense with this). Supports writing of tar and zip - files. - v74: * bugfix (vim, then :Explore) now works - * ctrl-L keeps cursor at same screen location (both - local and remote browsing) - * netrw now can read remote zip and tar files - * Obtain now uses WinXP ftp+.netrc successfully - v73: * bugfix -- scp://host/path/file was getting named - incorrectly - * netrw detects use of earlier-than-7.0 version of - vim and issues a pertinent error message. - * netrwSettings.vim is now uses autoloading. Only - is needed as a pure plugin - (ie. always loaded). - v72: * bugfix -- formerly, one could prevent the loading - of netrw by "let g:loaded_netrw=1"; when - autoloading became supported, this feature was - lost. It is now restored. - v71: * bugfix -- made some "set nomodifiable"s into - setlocal variants (allows :e somenewfile to be - modifiable as usual) - * NetrwSettings calls a netrw function, thereby - assuring that netrw has loaded. However, if netrw - does not load for whatever reason, then - NetrwSettings will now issue a warning message. - * For what reason I don't recall, when wget and fetch - are both not present, and an attempt to read a - http://... url is made, netrw exited. It now only - returns. - * When ch=1, on the second and subsequent uses of - browsing Netrw would issue a blank line to clear - the echo'd messages. This caused an annoying - "Hit-Enter" prompt; now a blank line message - is echo'd only if &ch>1. - v70: * when using |netrw-O|, the "Obtaining filename" - message is now shown using |hl-User9|. If User9 - has not been defined, netrw itself will define it. - v69: * Bugfix: win95/98 machines were experiencing a - "E121: Undefined variable: g:netrw_win95ftp" - message - v68: * double-click-leftmouse selects word under mouse - v67: * Passwords which contain blanks will now be - surrounded by double-quotes automatically (Yongwei) - v66: * Netrw now seems to work with a few more Windows - situations - * O now obtains a file: remote browsing - file -> local copy, locally browsing - file -> current directory (see :pwd) - * i now cycles between thin, long, and wide listing - styles - * NB and Nb are maps that are always available; - corresponding B and b maps are only available when - not using wide listing in order to allow them to - be used for motions - v65: * Browser functions now use NetOptionSave/Restore; in - particular, netrw now works around the report - setting - v64: * Bugfix - browsing a "/" directory (Unix) yielded - buffers named "[Scratch]" instead of "/" - * Bugfix - remote browsing with ftp was omitting - the ./ and ../ - v63: * netrw now takes advantage of autoload (needs 7.0) - * Bugfix - using r (to reverse sort) working again - v62: * Bugfix - spaces allowed again in directory names - with g:netrw_keepdir=0. In fact, I've tested netrw - with most ANSI punctuation marks for directory - names. - * Bugfix - NetrwSettings gave errors when - g:netrw_silent had not be set. - v61: * Document upgrade -- netrw variable-based settings - all should have tags. Supports NetrwSettings cmd. - * Several important variables are window-oriented. - Netrw has to transfer these across a window split. - See s:BufWinVars() and s:UseBufWinVars(). - v60: * When using the i map to switch between long and - short listings, netrw will now keep cursor on same - line - * "Match # of #" now uses status line - * :Explore **/*.c will now work from a - non-netrw-browser window - * :Explore **/patterns can now be run in separate - browser windows - * active banner (hit will cause various things - to happen) - v59: * bugfix -- another keepalt work-around installed - (for vim6.3) - * "Match # of #" for Explore **/pattern matches - v58: * Explore and relatives can now handle - **/somefilepattern (v7) - * Nexplore and Pexplore introduced (v7). shift-down - and shift-up cursor keys will invoke Nexplore and - Pexplore, respectively. - * bug fixed with o and v - * autochdir only worked around for vim when it has - been compiled with either - |+netbeans_intg| or |+sun_workshop| - * Under Windows, all directories and files were - being preceded with a "/" when local browsing. - Fixed. - * When: syntax highlighting is off, laststatus=2, and - remote browsing is used, sometimes the laststatus - highlighting bleeds into the entire display. Work - around - do an extra redraw in that case. - * Bugfix: when g:netrw_keepdir=0, due to re-use of - buffers, netrw didn't change the directory when it - should've - * Bugfix: D and R commands work again - v57: * Explore and relatives can now handle RO files - * reverse sort restored with vim7's sort command - * g:netrw_keepdir now being used to keep the current - directory unchanged as intended (sense change) - * vim 6.3 still supported - v56: * LocalBrowse now saves autochdir setting, unsets it, - and restores it before returning. - * using vim's rename() instead of system + - local_rename variable - * avoids changing directory when g:netrw_keepdir is - false - v55: * -bar used with :Explore :Sexplore etc to allow - multiple commands to be separated by |s - * browser listings now use the "nowrap" option - * browser: some unuseful error messages now - suppressed - v54: * For backwards compatibility, Explore and Sexplore - have been implemented. In addition, Hexplore and - Vexplore commands are available, too. - * used instead of in the - transparency support (BufReadCmd, FileReadCmd, - FileWriteCmd) - * ***netrw*** prepended to various error messages - netrw may emit - * g:netrw_port used instead of b:netrw_port for scp - * any leading [:#] is removed from port numbers - v53: * backslashes as well as slashes placed in various - patterns (ex. g:netrw_sort_sequence) to better - support Windows - v52: * nonumber'ing now set for browsing buffers - * when the hiding list hid all files, error messages - ensued. Fixed - * when browsing, swf is set, but directory is not - set, when netrw was attempting to restore options, - vim wanted to save a swapfile to a local directory - using an url-style path. Fixed - v51: * cygwin detection now automated - (using windows and &shell is bash) - * customizable browser "file" rejection patterns - * directory history - * :[range]w url now supported (ie. netrw uses a - FileWriteCmd event) - * error messages have a "Press to continue" to - allow them to be seen - * directory browser displays no longer bother the - swapfile - * u/U commands to go up and down the history stack - * history stack may be saved with viminfo with it's - "!" option - * bugfixes associated with unwanted [No Files] - entries - v50: * directories now displayed using buftype=nofile; - should keep the directory names as-is - * attempts to remove empty "[No File]" buffers - leftover from :file ..name.. commands - * bugfix: a "caps-lock" editing difficulty left in - v49 was fixed - * syntax highlighting for "Showing:" the hiding list - included - * bookmarks can now be retained if "!" is in the - viminfo option - v49: * will use ftp for http://.../ browsing - v48: * One may use ftp to do remote host file browsing - * (windows and !cygwin) remote browsing with ftp can - now use the "dir" command internally to provide - listings - * g:netrw_keepdir now allows one to keep the initial - current directory as the current directory - (normally the local file browser makes the - currently viewed directory the current directory) - * g:netrw_alto and g:netrw_altv now support - alternate placement of windows started with o or v - * Nread ? and Nwrite ? now uses echomsg (instead of - echo) so :messages can repeat showing the help - * bugfix: avoids problems with partial matches of - directory names to prior buffers with longer names - * one can suppress error messages with g:netrw_quiet - ctrl-h used - * instead of h for editing hiding list one - may edit the sorting sequence with the S map, which - now allows confirmation of deletion with - [y(es) n(o) a(ll) q(uit)] - * the "x" map now handles special file viewing with: - (windows) rundll32 url.dll (gnome) gnome-open (kde) - kfmclient If none of these are on the executable - path, then netrwFileHandlers.vim is used. - * directory bookmarking during both local and remote - browsing implemented - * one may view all, use the hiding list to suppress, - or use the hiding list to show-only remote and - local file/directory listings - * improved unusual file and directory name handling - preview window support - v47: * now handles local browsing. - v46: * now handles remote browsing - * g:netrw_silent (if 1) will cause all transfers to - be silent - v45: * made the [user@]hostname:path form a bit more - restrictive to better handle errors in using - protocols (e.g. scp:usr@host:file was being - recognized as an rcp request) - v44: * changed from "rsync -a" to just "rsync" - * somehow an editing error messed up the test to - recognize use of the fetch method for NetRead. - * more debugging statements included - v43: * moved "Explanation" comments to help - file as "Network Reference" (|netrw-ref|) - * now uses Dfunc() Decho() and Dret() for - debugging - * removed superfluous NetRestorePosn() calls - v42: * now does BufReadPre and BufReadPost events on - file:///* and file://localhost/* - v41: * installed file:///* and file://localhost/* handling - v40: * prevents redraw when a protocol error occurs so - that the user may see it - v39: * sftp support - v38: * Now uses NetRestorePosn() calls with Nread/Nwrite - commands - * Temporary files now removed via bwipe! instead of - bwipe (thanks to Dave Roberts) - v37: * Claar's modifications which test if ftp is - successful, otherwise give an error message - * After a read, the alternate file was pointing to - the temp file. The temp file buffer is now wiped - out. - * removed silent from transfer methods so user can - see what's happening + v149: Apr 18, 2013 * in wide listing format, now have maps for + w and b to move to next/previous file + Apr 26, 2013 * one may now copy files in the same + directory; netrw will issue requests for + what names the files should be copied under + Apr 29, 2013 * Trying Benzinger's problem again. Seems + that commenting out the BufEnter and + installing VimEnter (only) works. Weird + problem! (tree listing, vim -O Dir1 Dir2) + May 01, 2013 * :Explore ftp://... wasn't working. Fixed. + May 02, 2013 * introduced |g:netrw_bannerbackslash| as + requested by Paul Domaskis. + May 18, 2013 * More fixes for windows (not cygwin) + v148: Apr 16, 2013 * changed Netrw's Style menu to allow direct + choice of listing style, hiding style, and + sorting style + v147: Nov 24, 2012 * (James McCoy) Even with g:netrw_dirhistmax + at zero, the .vim/ directory would be + created to support history/bookmarks. I've + gone over netrw to suppress history and + bookmarking when g:netrw_dirhistmax is zero. + For instance, the menus will display + (disabled) when attempts to use + bookmarks/history are made. + Nov 29, 2012 * (Kim Jang-hwan) reported that with + g:Align_xstrlen set to 3 that the cursor was + moved (linewise) after invocation. This + problem also afflicted netrw. + (see |g:netrw_xstrlen|) Fixed. + Jan 21, 2013 * (mattn) provided a patch to insert some + endifs needed with the code implementing + |netrw-O|. + Jan 24, 2013 * (John Szakmeister) found that remote file + editing resulted in filetype options being + overwritten by NetrwOptionRestore(). I + moved filetype detect from NetrwGetFile() + to NetrwOptionRestore. + Feb 17, 2013 * (Yukhiro Nakadaira) provided a patch + correcting some syntax errors. + Feb 28, 2013 * (Ingo Karkat) provided a patch preventing + receipt of an |E95| when revisiting a + file://... style url. + Mar 18, 2013 * (Gary Johnson) pointed out that changing + cedit to caused problems with visincr; + the cedit setting is now bypassed in netrw too. + Apr 02, 2013 * (Paul Domaskis) reported an undefined + variable error (s:didstarstar) was + occurring. It is now defined at + initialization. + * included additional sanity checking for the + marked file functions. + * included |netrw-qF| and special "j" option + handling for |netrw-mg| + Apr 12, 2013 * |netrw-u| and |netrw-U| now handle counts + * the former mapping for "T" has been removed; + in its place are new maps, |netrw-Tb| and |netrw-Th|. + * the menu now supports a "Targets" entry for + easier target selection. (see |netrw-mt|) + * (Paul Domaskis) reported some problems with + moving/copying files under Windows' gvim + (ie. not cygwin). Fixed. + * (Paul Mueller) provided a patch to get + start and rundll working via |netrw-gx| + by bypassing the user's |'shellslash'| option. + v146: Oct 20, 2012 * (David Kotchan) reported that under Windows, + directories named with unusual characters + such as "#" or "$" were not being listed + properly. + * (Kenny Lee) reported that the buffer list + was being populated by netrw buffers. + Netrw will now |:bwipe| netrw buffers + upon editing a file if g:netrw_fastbrowse + is zero and its not in tree listing style. + * fixed a bug with s:NetrwInit() that + prevented initialization with |Lists| and + |Dictionaries|. + * |netrw-mu| now unmarks marked-file lists + v145: Apr 05, 2012 * moved some command from a g:netrw_local_... + format to g:netwr_local... format + * included some NOTE level messages about + commands that aren't executable + * |g:netrw_errorlvl| (default: NOTE=0) + option introduced + May 18, 2012 * (Ilya Dogolazky) a scenario where a + |g:netrw_fastbrowse| of zero did not + have a local directory refreshed fixed. + Jul 10, 2012 * (Donatas) |netrw-gb| wasn't working due + to an incorrectly used variable. + Aug 09, 2012 * (Bart Baker) netrw was doubling + of entries after a split. + * (code by Takahiro Yoshihara) implemented + |g:netrw_dynamic_maxfilenamelen| + Aug 31, 2012 * (Andrew Wong) netrw refresh overwriting + the yank buffer. + v144: Mar 12, 2012 * when |CTRL-W_s| or |CTRL-W_v| are used, + or their wincmd equivalents, on a netrw + buffer, the netrw's w: variables were + not copied over. Fixed. + Mar 13, 2012 * nbcd_curpos_{bufnr('%')} was commented + out, and was mistakenly used during + RestorePosn. Unfortunately, I'm not + sure why it was commented out, so this + "fix" may re-introduce an earlier problem. + Mar 21, 2012 * included s:rexposn internally to make + :Rex return the cursor to the same pos'n + upon restoration of netrw buffer + Mar 27, 2012 * (sjbesse) s:NetrwGetFile() needs to remove + "/" from the netrw buffer's usual |'isk'| + in order to allow "filetype detect" to work + properly for scripts. + v143: Jun 01, 2011 * |g:netrw_winsize| will accept a negative + number; the absolute value of it will then + be used to specify lines/columns instead of + a percentage. + Jul 05, 2011 * the "d" map now supports mkdir via ftp + See |netrw-d| and |g:netrw_remote_mkdir| + Jul 11, 2011 * Changed Explore!, Sexplore!, and Vexplore + to use a percentage of |winwidth()| instead + of a percentage of |winheight()|. + Jul 11, 2011 * included support for https://... I'm just + beginning to test this, however. + Aug 01, 2011 * changed RestoreOptions to also restore + cursor position in netrw buffers. + Aug 12, 2011 * added a note about "%" to the balloon + Aug 30, 2011 * if |g:netrw_nobeval| exists, then balloon + evaluation is suppressed. + Aug 31, 2011 * (Benjamin R Haskell) provided a patch that + implements non-standard port handling for + files opened via the remote browser. + Aug 31, 2011 * Fixed a **//pattern Explorer bug + Sep 15, 2011 * (reported by Francesco Campana) netrw + now permits the "@" to be part of the + user id (if there's an @ that appears + to the right). + Nov 21, 2011 * New option: |g:netrw_ftp_options| + Dec 07, 2011 * (James Sinclair) provided a fix handling + attempts to use a uid and password when + they weren't defined. This affected + NetWrite (NetRead already had that fix). ============================================================================== diff -Naur vim73.orig/runtime/doc/pi_paren.txt vim73/runtime/doc/pi_paren.txt --- vim73.orig/runtime/doc/pi_paren.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/pi_paren.txt 2013-06-07 17:07:09.485648255 +0000 @@ -1,4 +1,4 @@ -*pi_paren.txt* For Vim version 7.3. Last change: 2008 Jun 16 +*pi_paren.txt* For Vim version 7.3. Last change: 2013 May 08 VIM REFERENCE MANUAL by Bram Moolenaar @@ -46,7 +46,10 @@ closed folds. - 'synmaxcol' times 2 bytes before or after the cursor to avoid a delay in a long line with syntax highlighting. - +- A timeout of 300 msec (60 msec in Insert mode). This can be changed with the + g:matchparen_timeout and g:matchparen_insert_timeout variables and their + buffer-local equivalents b:matchparen_timeout and + b:matchparen_insert_timeout. If you would like the |%| command to work better, the matchit plugin can be used, see |matchit-install|. This plugin also helps to skip matches in diff -Naur vim73.orig/runtime/doc/pi_tar.txt vim73/runtime/doc/pi_tar.txt --- vim73.orig/runtime/doc/pi_tar.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/pi_tar.txt 2013-06-07 17:07:09.528981465 +0000 @@ -1,14 +1,21 @@ -*pi_tar.txt* For Vim version 7.3. Last change: 2010 Aug 09 +*pi_tar.txt* For Vim version 7.3. Last change: 2013 Apr 17 +====================+ | Tar File Interface | +====================+ -Author: Charles E. Campbell, Jr. +Author: Charles E. Campbell (remove NOSPAM from Campbell's email first) -Copyright 2005-2010: The GPL (gnu public license) applies to *tar-copyright* - tar.vim, tarPlugin.vim, and pi_tar.txt. - No warranty, express or implied. Use At-Your-Own-Risk. +Copyright 2005-2012: *tar-copyright* + The VIM LICENSE (see |copyright|) applies to the files in this + package, including tarPlugin.vim, tar.vim, and pi_tar.txt. Like + anything else that's except use "tar.vim" instead of "VIM". Like + anything else that's free, tar.vim and its associated files are + provided *as is* and comes with no warranty of any kind, either + expressed or implied. No guarantees of merchantability. No + guarantees of suitability for any purpose. By using this plugin, you + agree that in no event will the copyright holder be liable for any + damages resulting from the use of this software. Use at your own risk! ============================================================================== 1. Contents *tar* *tar-contents* @@ -43,6 +50,21 @@ *g:tar_extractcmd* , which by default is > "tar -xf" < + *:TarDiff* + DIFFERENCING SUPPORT~ + + :TarDiff [filename] + + This command will attempt to show the differences between the tarball + version of a file and the associated file on the system. In order to + find that file on the system, the script uses the path associated with + the file mentioned in the tarball. If the current directory is not + correct for that path, :TarDiff will fail to find the associated file. + + If the [filename] is given, that that filename (and path) will be used + to specify the associated file. + + PREVENTING LOADING~ If for some reason you do not wish to use vim to examine tar'd files, @@ -83,8 +105,13 @@ 4. History *tar-history* + v28 Jun 23, 2011 * a few more decompression options (tbz tb2 txz) + v27 May 31, 2011 * moved cygwin detection before g:tar_copycmd handling + * inserted additional |:keepj| modifiers + * changed silent to sil! (|:silent|) v26 Aug 09, 2010 * uses buffer-local instead of window variables to hold tarfile name + * inserted keepj before 0d to protect jump list v25 Jun 19, 2010 * (Jan Steffens) added support for xz compression v24 Apr 07, 2009 * :Untarvim command implemented Sep 28, 2009 * Added lzma support diff -Naur vim73.orig/runtime/doc/pi_vimball.txt vim73/runtime/doc/pi_vimball.txt --- vim73.orig/runtime/doc/pi_vimball.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/pi_vimball.txt 2013-06-07 17:07:09.545648084 +0000 @@ -1,4 +1,4 @@ -*pi_vimball.txt* For Vim version 7.3. Last change: 2010 Apr 12 +*pi_vimball.txt* For Vim version 7.3. Last change: 2012 Jan 17 ---------------- Vimball Archiver @@ -6,16 +6,22 @@ Author: Charles E. Campbell, Jr. (remove NOSPAM from Campbell's email first) -Copyright: (c) 2004-2009 by Charles E. Campbell, Jr. *Vimball-copyright* - The VIM LICENSE applies to Vimball.vim, and Vimball.txt - (see |copyright|) except use "Vimball" instead of "Vim". - No warranty, express or implied. - Use At-Your-Own-Risk! +Copyright: (c) 2004-2012 by Charles E. Campbell, Jr. *Vimball-copyright* + The VIM LICENSE (see |copyright|) applies to the files in this + package, including vimballPlugin.vim, vimball.vim, and pi_vimball.txt. + except use "vimball" instead of "VIM". Like anything else that's free, + vimball.vim and its associated files are provided *as is* and comes with + no warranty of any kind, either expressed or implied. No guarantees + of merchantability. No guarantees of suitability for any purpose. By + using this plugin, you agree that in no event will the copyright + holder be liable for any damages resulting from the use of this + software. Use at your own risk! ============================================================================== 1. Contents *vba* *vimball* *vimball-contents* 1. Contents......................................: |vimball-contents| + 2. Vimball Introduction..........................: |vimball-intro| 3. Vimball Manual................................: |vimball-manual| MkVimball.....................................: |:MkVimball| UseVimball....................................: |:UseVimball| @@ -176,6 +182,24 @@ ============================================================================== 4. Vimball History *vimball-history* {{{1 + 34 : Sep 22, 2011 * "UseVimball path" now supports a non-full path by + prepending the current directory to it. + 33 : Apr 02, 2011 * Gave priority to *.vmb over *.vba + * Changed silent! to sil! (shorter) + * Safed |'swf'| setting (during vimball extraction, + its now turned off) + 32 : May 19, 2010 * (Christian Brabrandt) :so someplugin.vba and + :so someplugin.vba.gz (and the other supported + compression types) now works + * (Jan Steffens) added support for xz compression + * fenc extraction was erroneously picking up the + end of the line number when no file encoding + was present. Fixed. + * By request, beginning the switchover from the vba + extension to vmb. Currently both are supported; + MkVimball, however, now will create *.vmb files. + Feb 11, 2011 * motoyakurotsu reported an error with vimball's + handling of zero-length files 30 : Dec 08, 2008 * fnameescape() inserted to protect error messaging using corrupted filenames from causing problems @@ -199,6 +223,8 @@ causing problems as reported by Zhang Shuhan 24 : Nov 15, 2007 * g:vimball_path_escape used by s:Path() to prevent certain characters from causing trouble + (defunct: |fnameescape()| and |shellescape()| + now used instead) 22 : Mar 21, 2007 * uses setlocal instead of set during BufEnter 21 : Nov 27, 2006 * (tnx to Bill McCarthy) vimball had a header handling problem and it now changes \s to /s diff -Naur vim73.orig/runtime/doc/pi_zip.txt vim73/runtime/doc/pi_zip.txt --- vim73.orig/runtime/doc/pi_zip.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/pi_zip.txt 2013-06-07 17:07:09.555648055 +0000 @@ -1,30 +1,31 @@ -*pi_zip.txt* For Vim version 7.3. Last change: 2010 Apr 12 +*pi_zip.txt* For Vim version 7.3. Last change: 2013 Apr 17 +====================+ | Zip File Interface | +====================+ -Author: Charles E. Campbell, Jr. +Author: Charles E. Campbell (remove NOSPAM from Campbell's email first) -Copyright: Copyright (C) 2005-2009 Charles E Campbell, Jr *zip-copyright* - Permission is hereby granted to use and distribute this code, - with or without modifications, provided that this copyright - notice is copied with it. Like anything else that's free, - zip.vim, zipPlugin.vim, and pi_zip.txt are provided *as is* - and it comes with no warranty of any kind, either expressed or - implied. By using this plugin, you agree that in no event will - the copyright holder be liable for any damages resulting from - the use of this software. +Copyright: Copyright (C) 2005-2012 Charles E Campbell *zip-copyright* + The VIM LICENSE (see |copyright|) applies to the files in this + package, including zipPlugin.vim, zip.vim, and pi_zip.vim. except use + "zip.vim" instead of "VIM". Like anything else that's free, zip.vim + and its associated files are provided *as is* and comes with no + warranty of any kind, either expressed or implied. No guarantees of + merchantability. No guarantees of suitability for any purpose. By + using this plugin, you agree that in no event will the copyright + holder be liable for any damages resulting from the use of this + software. Use at your own risk! ============================================================================== -1. Contents *zip* *zip-contents* +1. Contents *zip* *zip-contents* 1. Contents................................................|zip-contents| 2. Usage...................................................|zip-usage| 3. Additional Extensions...................................|zip-extension| 4. History.................................................|zip-history| ============================================================================== -2. Usage *zip-usage* *zip-manual* +2. Usage *zip-usage* *zip-manual* When one edits a *.zip file, this plugin will handle displaying a contents page. Select a file to edit by moving the cursor atop @@ -64,17 +65,16 @@ If for some reason you do not wish to use vim to examine zipped files, you may put the following two variables into your <.vimrc> to prevent - the tar plugin from loading: > + the zip plugin from loading: > let g:loaded_zipPlugin= 1 let g:loaded_zip = 1 < -< ============================================================================== 3. Additional Extensions *zip-extension* - Apparently there are a number of archivers who generate zip files that + Apparently there are a number of archivers which generate zip files that don't use the .zip extension (.jar, .xpi, etc). To handle such files, place a line in your <.vimrc> file: > @@ -84,7 +84,18 @@ should be treated as zip files. ============================================================================== -4. History *zip-history* {{{1 +4. History *zip-history* {{{1 + v26 Nov 15, 2012 * (Jason Spiro) provided a lot of new extensions that + are synonyms for .zip + v25 Jun 27, 2011 * using keepj with unzip -Z + (consistent with the -p variant) + * (Ben Staniford) now uses + has("win32unix") && executable("cygpath") + before converting to cygwin-style paths + v24 Jun 21, 2010 * (Cédric Bosdonnat) unzip seems to need its filenames + fnameescape'd as well as shellquote'd + * (Motoya Kurotsu) inserted keepj before 0d to protect + jump list v17 May 09, 2008 * arno caught a security bug v15 Sep 07, 2007 * &shq now used if not the empty string for g:zip_shq v14 May 07, 2007 * using b:zipfile instead of w:zipfile to avoid problem diff -Naur vim73.orig/runtime/doc/quickfix.txt vim73/runtime/doc/quickfix.txt --- vim73.orig/runtime/doc/quickfix.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/quickfix.txt 2013-06-07 17:07:09.592314617 +0000 @@ -1,4 +1,4 @@ -*quickfix.txt* For Vim version 7.3. Last change: 2010 Jul 20 +*quickfix.txt* For Vim version 7.3. Last change: 2013 Mar 07 VIM REFERENCE MANUAL by Bram Moolenaar @@ -215,28 +215,29 @@ *:cex* *:cexpr* *E777* :cex[pr][!] {expr} Create a quickfix list using the result of {expr} and - jump to the first error. If {expr} is a String, then - each new-line terminated line in the String is - processed using 'errorformat' and the result is added - to the quickfix list. If {expr} is a List, then each - String item in the list is processed and added to the - quickfix list. Non String items in the List are - ignored. See |:cc| - for [!]. + jump to the first error. + If {expr} is a String, then each new-line terminated + line in the String is processed using the global value + of 'errorformat' and the result is added to the + quickfix list. + If {expr} is a List, then each String item in the list + is processed and added to the quickfix list. Non + String items in the List are ignored. + See |:cc| for [!]. Examples: > :cexpr system('grep -n xyz *') :cexpr getline(1, '$') < *:lex* *:lexpr* -:lex[pr][!] {expr} Same as ":cexpr", except the location list for the +:lex[pr][!] {expr} Same as |:cexpr|, except the location list for the current window is used instead of the quickfix list. *:cgete* *:cgetexpr* :cgete[xpr] {expr} Create a quickfix list using the result of {expr}. - Just like ":cexpr", but don't jump to the first error. + Just like |:cexpr|, but don't jump to the first error. *:lgete* *:lgetexpr* -:lgete[xpr] {expr} Same as ":cgetexpr", except the location list for the +:lgete[xpr] {expr} Same as |:cgetexpr|, except the location list for the current window is used instead of the quickfix list. *:cad* *:caddexpr* @@ -546,13 +547,23 @@ modifier is used the buffers are kept loaded. This makes following searches in the same files a lot faster. +Note that |:copen| (or |:lopen| for |:lgrep|) may be used to open a buffer +containing the search results in linked form. The |:silent| command may be +used to suppress the default full screen grep output. The ":grep!" form of +the |:grep| command doesn't jump to the first match automatically. These +commands can be combined to create a NewGrep command: > + + command! -nargs=+ NewGrep execute 'silent grep! ' | copen 42 + 5.1 using Vim's internal grep *:vim* *:vimgrep* *E682* *E683* :vim[grep][!] /{pattern}/[g][j] {file} ... Search for {pattern} in the files {file} ... and set - the error list to the matches. + the error list to the matches. Files matching + 'wildignore' are ignored; files in 'suffixes' are + searched last. Without the 'g' flag each line is added only once. With 'g' every match is added. @@ -563,6 +574,8 @@ 'ignorecase' applies. To overrule it put |/\c| in the pattern to ignore case or |/\C| to match case. 'smartcase' is not used. + If {pattern} is empty (e.g. // is specified), the last + used search pattern is used. |last-pattern| When a number is put before the command this is used as the maximum number of matches to find. Use @@ -904,8 +917,8 @@ %n error number (finds a number) %m error message (finds a string) %r matches the "rest" of a single-line file message %O/P/Q - %p pointer line (finds a sequence of '-', '.' or ' ' and - uses the length for the column number) + %p pointer line (finds a sequence of '-', '.', ' ' or + tabs and uses the length for the column number) %*{conv} any scanf non-assignable conversion %% the single '%' character %s search text (finds a string) diff -Naur vim73.orig/runtime/doc/quickref.txt vim73/runtime/doc/quickref.txt --- vim73.orig/runtime/doc/quickref.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/quickref.txt 2013-06-07 17:07:09.622314532 +0000 @@ -1,4 +1,4 @@ -*quickref.txt* For Vim version 7.3. Last change: 2010 Jul 24 +*quickref.txt* For Vim version 7.3. Last change: 2013 May 20 VIM REFERENCE MANUAL by Bram Moolenaar @@ -7,7 +7,7 @@ *quickref* *Contents* tag subject tag subject ~ -|Q_ct| list of help files |Q_re| Repeating commands +|Q_ct| list of help files |Q_re| Repeating commands |Q_lr| motion: Left-right |Q_km| Key mapping |Q_ud| motion: Up-down |Q_ab| Abbreviations |Q_tm| motion: Text object |Q_op| Options @@ -27,7 +27,7 @@ |Q_co| change: Complex |Q_bu| Buffer list commands |Q_vi| Visual mode |Q_sy| Syntax highlighting |Q_to| Text objects |Q_gu| GUI commands - |Q_fo| Folding + |Q_fo| Folding ------------------------------------------------------------------------------ N is used to indicate an optional count that can be given before the command. @@ -186,7 +186,7 @@ |:marks| :marks print the active marks |CTRL-O| N CTRL-O go to Nth older position in jump list |CTRL-I| N CTRL-I go to Nth newer position in jump list -|:ju| :ju[mps] print the jump list +|:ju| :ju[mps] print the jump list ------------------------------------------------------------------------------ *Q_vm* Various motions @@ -204,30 +204,30 @@ ------------------------------------------------------------------------------ *Q_ta* Using tags -|:ta| :ta[g][!] {tag} jump to tag {tag} -|:ta| :[count]ta[g][!] jump to [count]'th newer tag in tag list +|:ta| :ta[g][!] {tag} jump to tag {tag} +|:ta| :[count]ta[g][!] jump to [count]'th newer tag in tag list |CTRL-]| CTRL-] jump to the tag under cursor, unless changes have been made -|:ts| :ts[elect][!] [tag] list matching tags and select one to jump to +|:ts| :ts[elect][!] [tag] list matching tags and select one to jump to |:tjump| :tj[ump][!] [tag] jump to tag [tag] or select from list when there are multiple matches -|:ltag| :lt[ag][!] [tag] jump to tag [tag] and add matching tags to the +|:ltag| :lt[ag][!] [tag] jump to tag [tag] and add matching tags to the location list -|:tags| :tags print tag list +|:tags| :tags print tag list |CTRL-T| N CTRL-T jump back from Nth older tag in tag list -|:po| :[count]po[p][!] jump back from [count]'th older tag in tag list +|:po| :[count]po[p][!] jump back from [count]'th older tag in tag list |:tnext| :[count]tn[ext][!] jump to [count]'th next matching tag |:tp| :[count]tp[revious][!] jump to [count]'th previous matching tag -|:tr| :[count]tr[ewind][!] jump to [count]'th matching tag -|:tl| :tl[ast][!] jump to last matching tag +|:tr| :[count]tr[ewind][!] jump to [count]'th matching tag +|:tl| :tl[ast][!] jump to last matching tag -|:ptag| :pt[ag] {tag} open a preview window to show tag {tag} -|CTRL-W_}| CTRL-W } like CTRL-] but show tag in preview window +|:ptag| :pt[ag] {tag} open a preview window to show tag {tag} +|CTRL-W_}| CTRL-W } like CTRL-] but show tag in preview window |:pts| :pts[elect] like ":tselect" but show tag in preview window |:ptjump| :ptj[ump] like ":tjump" but show tag in preview window |:pclose| :pc[lose] close tag preview window -|CTRL-W_z| CTRL-W z close tag preview window +|CTRL-W_z| CTRL-W z close tag preview window ------------------------------------------------------------------------------ *Q_sc* Scrolling @@ -260,7 +260,7 @@ |:startreplace| :startr[eplace][!] start Replace mode, at EOL when [!] used in Visual block mode: -|v_b_I| I insert the same text in front of all the selected lines +|v_b_I| I insert the same text in front of all the selected lines |v_b_A| A append the same text after all the selected lines ------------------------------------------------------------------------------ *Q_ai* Insert mode keys @@ -334,16 +334,16 @@ *Q_de* Deleting text |x| N x delete N characters under and after the cursor -|| N delete N characters under and after the cursor +|| N delete N characters under and after the cursor |X| N X delete N characters before the cursor |d| N d{motion} delete the text that is moved over with {motion} -|v_d| {visual}d delete the highlighted text +|v_d| {visual}d delete the highlighted text |dd| N dd delete N lines |D| N D delete to the end of the line (and N-1 more lines) |J| N J join N-1 lines (delete s) -|v_J| {visual}J join the highlighted lines +|v_J| {visual}J join the highlighted lines |gJ| N gJ like "J", but without inserting spaces -|v_gJ| {visual}gJ like "{visual}J", but without inserting spaces +|v_gJ| {visual}gJ like "{visual}J", but without inserting spaces |:d| :[range]d [x] delete [range] lines [into register x] ------------------------------------------------------------------------------ *Q_cm* Copying and moving text @@ -369,7 +369,7 @@ |R| N R enter Replace mode (repeat the entered text N times) |gR| N gR enter virtual Replace mode: Like Replace mode but without affecting layout -|v_b_r| {visual}r{char} +|v_b_r| {visual}r{char} in Visual block mode: Replace each char of the selected text with {char} @@ -447,13 +447,13 @@ |visual-index| list of Visual mode commands. -|v| v start highlighting characters } move cursor and use -|V| V start highlighting linewise } operator to affect +|v| v start highlighting characters } move cursor and use +|V| V start highlighting linewise } operator to affect |CTRL-V| CTRL-V start highlighting blockwise } highlighted text -|v_o| o exchange cursor position with start of highlighting -|gv| gv start highlighting on previous visual area -|v_v| v highlight characters or stop highlighting -|v_V| V highlight linewise or stop highlighting +|v_o| o exchange cursor position with start of highlighting +|gv| gv start highlighting on previous visual area +|v_v| v highlight characters or stop highlighting +|v_V| V highlight linewise or stop highlighting |v_CTRL-V| CTRL-V highlight blockwise or stop highlighting ------------------------------------------------------------------------------ *Q_to* Text objects (only in Visual mode or after an operator) @@ -509,8 +509,8 @@ ------------------------------------------------------------------------------ *Q_km* Key mapping -|:map| :ma[p] {lhs} {rhs} map {lhs} to {rhs} in Normal and Visual mode -|:map!| :ma[p]! {lhs} {rhs} map {lhs} to {rhs} in Insert and Command-line +|:map| :ma[p] {lhs} {rhs} map {lhs} to {rhs} in Normal and Visual mode +|:map!| :ma[p]! {lhs} {rhs} map {lhs} to {rhs} in Insert and Command-line mode |:noremap| :no[remap][!] {lhs} {rhs} same as ":map", no remapping for this {rhs} @@ -522,19 +522,19 @@ Normal and Visual mode |:map_l!| :ma[p]! [lhs] list mappings (starting with [lhs]) for Insert and Command-line mode -|:cmap| :cmap/:cunmap/:cnoremap +|:cmap| :cmap/:cunmap/:cnoremap like ":map!"/":unmap!"/":noremap!" but for Command-line mode only -|:imap| :imap/:iunmap/:inoremap +|:imap| :imap/:iunmap/:inoremap like ":map!"/":unmap!"/":noremap!" but for Insert mode only -|:nmap| :nmap/:nunmap/:nnoremap +|:nmap| :nmap/:nunmap/:nnoremap like ":map"/":unmap"/":noremap" but for Normal mode only -|:vmap| :vmap/:vunmap/:vnoremap +|:vmap| :vmap/:vunmap/:vnoremap like ":map"/":unmap"/":noremap" but for Visual mode only -|:omap| :omap/:ounmap/:onoremap +|:omap| :omap/:ounmap/:onoremap like ":map"/":unmap"/":noremap" but only for when an operator is pending |:mapc| :mapc[lear] remove mappings for Normal and Visual mode @@ -657,6 +657,7 @@ 'cscopepathcomp' 'cspc' how many components of the path to show 'cscopeprg' 'csprg' command to execute cscope 'cscopequickfix' 'csqf' use quickfix window for cscope results +'cscoperelative' 'csre' Use cscope.out path basename as prefix 'cscopetag' 'cst' use cscope for tag commands 'cscopetagorder' 'csto' determines ":cstag" search order 'cscopeverbose' 'csverb' give messages when adding a cscope database @@ -690,6 +691,7 @@ 'fileencodings' 'fencs' automatically detected character encodings 'fileformat' 'ff' file format used for file I/O 'fileformats' 'ffs' automatically detected values for 'fileformat' +'fileignorecase' 'fic' ignore case when using file names 'filetype' 'ft' type of file, used for autocommands 'fillchars' 'fcs' characters to use for displaying special items 'fkmap' 'fk' Farsi keyboard mapping @@ -800,7 +802,7 @@ 'omnifunc' 'ofu' function for filetype-specific completion 'opendevice' 'odev' allow reading/writing devices on MS-Windows 'operatorfunc' 'opfunc' function to be called for |g@| operator -'osfiletype' 'oft' operating system-specific filetype information +'osfiletype' 'oft' no longer supported 'paragraphs' 'para' nroff macros that separate paragraphs 'paste' allow pasting text 'pastetoggle' 'pt' key code that causes 'paste' to toggle @@ -822,6 +824,7 @@ 'quoteescape' 'qe' escape characters used in a string 'readonly' 'ro' disallow writing the buffer 'redrawtime' 'rdt' timeout for 'hlsearch' and |:match| highlighting +'regexpengine' 're' default regexp engine to use 'relativenumber' 'rnu' show relative line number in front of each line 'remap' allow mappings to work recursively 'report' threshold for reporting nr. of lines changed @@ -850,6 +853,7 @@ 'shellslash' 'ssl' use forward slash for shell file names 'shelltemp' 'stmp' whether to use a temp file for shell commands 'shelltype' 'st' Amiga: influences how to use a shell +'shellxescape' 'sxe' characters to escape when 'shellxquote' is ( 'shellxquote' 'sxq' like 'shellquote', but include redirection 'shiftround' 'sr' round indent to multiple of shiftwidth 'shiftwidth' 'sw' number of spaces to use for (auto)indent step @@ -934,6 +938,7 @@ 'wildchar' 'wc' command-line character for wildcard expansion 'wildcharm' 'wcm' like 'wildchar' but also works when mapped 'wildignore' 'wig' files matching these patterns are not completed +'wildignorecase' 'wic' ignore case when completing file names 'wildmenu' 'wmnu' use menu for command line completion 'wildmode' 'wim' mode for 'wildchar' command-line expansion 'wildoptions' 'wop' specifies how command line completion is done @@ -955,9 +960,9 @@ ------------------------------------------------------------------------------ *Q_ur* Undo/Redo commands -|u| N u undo last N changes +|u| N u undo last N changes |CTRL-R| N CTRL-R redo last N undone changes -|U| U restore last changed line +|U| U restore last changed line ------------------------------------------------------------------------------ *Q_et* External commands @@ -1008,7 +1013,7 @@ C4350, etc.) |:normal| :norm[al][!] {commands} execute Normal mode commands -|Q| Q switch to "Ex" mode +|Q| Q switch to "Ex" mode |:redir| :redir >{file} redirect messages to {file} |:silent| :silent[!] {command} execute {command} silently @@ -1084,18 +1089,18 @@ ------------------------------------------------------------------------------ *Q_ex* Special Ex characters -|:bar| | separates two commands (not for ":global" and ":!") +|:bar| | separates two commands (not for ":global" and ":!") |:quote| " begins comment -|:_%| % current file name (only where a file name is expected) -|:_#| #[num] alternate file name [num] (only where a file name is +|:_%| % current file name (only where a file name is expected) +|:_#| #[num] alternate file name [num] (only where a file name is expected) Note: The next seven are typed literally; these are not special keys! -|:| buffer number, for use in an autocommand (only where a +|:| buffer number, for use in an autocommand (only where a file name is expected) -|:| file name, for user in an autocommand (only where a +|:| file name, for use in an autocommand (only where a file name is expected) -|:| what matched with the pattern, for use in an +|:| what matched with the pattern, for use in an autocommand (only where a file name is expected) |:| word under the cursor (only where a file name is expected) @@ -1168,18 +1173,18 @@ Without !: Fail if changes have been made to the current buffer. With !: Discard any changes to the current buffer. |:edit_f| :e[dit][!] {file} edit {file} -|:edit| :e[dit][!] reload the current file -|:enew| :ene[w][!] edit a new, unnamed buffer +|:edit| :e[dit][!] reload the current file +|:enew| :ene[w][!] edit a new, unnamed buffer |:find| :fin[d][!] {file} find {file} in 'path' and edit it -|CTRL-^| N CTRL-^ edit alternate file N (equivalent to ":e #N") -|gf| gf or ]f edit the file whose name is under the cursor -|:pwd| :pwd print the current directory name -|:cd| :cd [path] change the current directory to [path] -|:cd-| :cd - back to previous current directory -|:file| :f[ile] print the current file name and the cursor +|CTRL-^| N CTRL-^ edit alternate file N (equivalent to ":e #N") +|gf| gf or ]f edit the file whose name is under the cursor +|:pwd| :pwd print the current directory name +|:cd| :cd [path] change the current directory to [path] +|:cd-| :cd - back to previous current directory +|:file| :f[ile] print the current file name and the cursor position -|:file| :f[ile] {name} set the current file name to {name} +|:file| :f[ile] {name} set the current file name to {name} |:files| :files show alternate file names ------------------------------------------------------------------------------ *Q_fl* Using the argument list |argument-list| @@ -1195,12 +1200,12 @@ in current window in new window ~ |:argument| :argu[ment] N :sar[gument] N edit file N -|:next| :n[ext] :sn[ext] edit next file +|:next| :n[ext] :sn[ext] edit next file |:next_f| :n[ext] {arglist} :sn[ext] {arglist} define new arg list and edit first file -|:Next| :N[ext] :sN[ext] edit previous file +|:Next| :N[ext] :sN[ext] edit previous file |:first| :fir[st] :sfir[st] edit first file -|:last| :la[st] :sla[st] edit last file +|:last| :la[st] :sla[st] edit last file ------------------------------------------------------------------------------ *Q_wq* Writing and quitting @@ -1377,7 +1382,7 @@ set foldmethod=indent folding by indent set foldmethod=expr folding by 'foldexpr' set foldmethod=syntax folding by syntax regions - set foldmethod=marker folding by 'foldmarkers' + set foldmethod=marker folding by 'foldmarker' |zf| zf{motion} operator: Define a fold manually |:fold| :{range}fold define a fold for {range} lines diff -Naur vim73.orig/runtime/doc/quotes.txt vim73/runtime/doc/quotes.txt --- vim73.orig/runtime/doc/quotes.txt 2010-08-15 12:23:21.000000000 +0000 +++ vim73/runtime/doc/quotes.txt 2013-06-07 17:07:09.642314475 +0000 @@ -1,4 +1,4 @@ -*quotes.txt* For Vim version 7.3. Last change: 2006 Apr 24 +*quotes.txt* For Vim version 7.3. Last change: 2010 Nov 03 VIM REFERENCE MANUAL by Bram Moolenaar @@ -260,15 +260,16 @@ In summary: - __ ___ _ _ _ ___ _____ - \ \ / (_)_ __ ___ (_)___ | | | |/ _ \_ _| - \ \ / /| | '_ ` _ \ | / __| | |_| | | | || | - \ V / | | | | | | | | \__ \ | _ | |_| || | - \_/ |_|_| |_| |_| |_|___/ |_| |_|\___/ |_| - ____ _____ _ _ _____ _____ _ _ - / ___|_ _| | | | ___| ___| | | - \___ \ | | | | | | |_ | |_ | | | - ___) || | | |_| | _| | _| |_|_| - |____/ |_| \___/|_| |_| (_|_) (Tony Nugent, Australia) + __ ___ _ _ _ ___ _____ ` + \ \ / (_)_ __ ___ (_)___ | | | |/ _ \_ _| ` + \ \ / /| | '_ ` _ \ | / __| | |_| | | | || | ` + \ V / | | | | | | | | \__ \ | _ | |_| || | ` + \_/ |_|_| |_| |_| |_|___/ |_| |_|\___/ |_| ` + ____ _____ _ _ _____ _____ _ _ ` + / ___|_ _| | | | ___| ___| | | ` + \___ \ | | | | | | |_ | |_ | | | ` + ___) || | | |_| | _| | _| |_|_| ` + |____/ |_| \___/|_| |_| (_|_) (Tony Nugent, Australia) ` + vim:tw=78:ts=8:ft=help:norl: diff -Naur vim73.orig/runtime/doc/repeat.txt vim73/runtime/doc/repeat.txt --- vim73.orig/runtime/doc/repeat.txt 2010-08-15 12:23:22.000000000 +0000 +++ vim73/runtime/doc/repeat.txt 2013-06-07 17:07:09.672314389 +0000 @@ -1,4 +1,4 @@ -*repeat.txt* For Vim version 7.3. Last change: 2009 Nov 04 +*repeat.txt* For Vim version 7.3. Last change: 2012 Mar 23 VIM REFERENCE MANUAL by Bram Moolenaar @@ -102,25 +102,29 @@ q{0-9a-zA-Z"} Record typed characters into register {0-9a-zA-Z"} (uppercase to append). The 'q' command is disabled while executing a register, and it doesn't work inside - a mapping. {Vi: no recording} + a mapping and |:normal|. {Vi: no recording} q Stops recording. (Implementation note: The 'q' that stops recording is not stored in the register, unless it was the result of a mapping) {Vi: no recording} *@* -@{0-9a-z".=*} Execute the contents of register {0-9a-z".=*} [count] +@{0-9a-z".=*+} Execute the contents of register {0-9a-z".=*+} [count] times. Note that register '%' (name of the current file) and '#' (name of the alternate file) cannot be - used. For "@=" you are prompted to enter an - expression. The result of the expression is then - executed. See also |@:|. {Vi: only named registers} + used. + The register is executed like a mapping, that means + that the difference between 'wildchar' and 'wildcharm' + applies. + For "@=" you are prompted to enter an expression. The + result of the expression is then executed. + See also |@:|. {Vi: only named registers} *@@* *E748* @@ Repeat the previous @{0-9a-z":*} [count] times. -:[addr]*{0-9a-z".=} *:@* *:star* -:[addr]@{0-9a-z".=*} Execute the contents of register {0-9a-z".=*} as an Ex +:[addr]*{0-9a-z".=+} *:@* *:star* +:[addr]@{0-9a-z".=*+} Execute the contents of register {0-9a-z".=*+} as an Ex command. First set cursor at line [addr] (default is current line). When the last line in the register does not have a it will be added automatically when diff -Naur vim73.orig/runtime/doc/sign.txt vim73/runtime/doc/sign.txt --- vim73.orig/runtime/doc/sign.txt 2010-08-15 12:23:22.000000000 +0000 +++ vim73/runtime/doc/sign.txt 2013-06-07 17:07:09.742314189 +0000 @@ -1,4 +1,4 @@ -*sign.txt* For Vim version 7.3. Last change: 2010 May 07 +*sign.txt* For Vim version 7.3. Last change: 2012 Jul 10 VIM REFERENCE MANUAL by Gordon Prieur @@ -70,12 +70,13 @@ :sign define {name} {argument}... Define a new sign or set attributes for an existing sign. The {name} can either be a number (all digits) or a name - starting with a non-digit. + starting with a non-digit. Leading digits are ignored, thus + "0012", "012" and "12" are considered the same name. About 120 different signs can be defined. Accepted arguments: - icon={pixmap} + icon={bitmap} Define the file name where the bitmap can be found. Should be a full path. The bitmap should fit in the place of two characters. This is not checked. If the bitmap is too big it @@ -85,6 +86,8 @@ GTK 1 pixmap (.xpm) GTK 2 many Motif pixmap (.xpm) + Win32 .bmp, .ico, .cur + pixmap (.xpm) |+xpm_w32| linehl={group} Highlighting group used for the whole line the sign is placed @@ -150,8 +153,14 @@ Remove the previously placed sign {id} from file {fname}. See remark above about {fname} |:sign-fname|. +:sign unplace * file={fname} + Remove all placed signs in file {fname}. + :sign unplace {id} buffer={nr} - Same, but use buffer {nr}. + Remove the previously placed sign {id} from buffer {nr}. + +:sign unplace * buffer={nr} + Remove all placed signs in buffer {nr}. :sign unplace {id} Remove the previously placed sign {id} from all files it diff -Naur vim73.orig/runtime/doc/spell.txt vim73/runtime/doc/spell.txt --- vim73.orig/runtime/doc/spell.txt 2010-08-15 12:23:22.000000000 +0000 +++ vim73/runtime/doc/spell.txt 2013-06-07 17:07:09.755647484 +0000 @@ -1,4 +1,4 @@ -*spell.txt* For Vim version 7.3. Last change: 2010 Apr 11 +*spell.txt* For Vim version 7.3. Last change: 2011 May 25 VIM REFERENCE MANUAL by Bram Moolenaar @@ -335,6 +335,9 @@ |spell-mkspell| about how to create a spell file. Converting a spell file with "iconv" will NOT work! +Note: on VMS ".{enc}.spl" is changed to "_{enc}.spl" to avoid trouble with +filenames. + *spell-sug-file* *E781* If there is a file with exactly the same name as the ".spl" file but ending in ".sug", that file will be used for giving better suggestions. It isn't loaded @@ -519,7 +522,7 @@ Up to eight regions can be combined. *E754* *E755* The REP and SAL items of the first .aff file where they appear are used. |spell-REP| |spell-SAL| - + *E845* This command uses a lot of memory, required to find the optimal word tree (Polish, Italian and Hungarian require several hundred Mbyte). The final result will @@ -1241,6 +1244,7 @@ Optionally this may be followed by: * the group appears zero or more times, e.g., sm*e + the group appears one or more times, e.g., c+ + ? the group appears zero times or once, e.g., x? This is similar to the regexp pattern syntax (but not the same!). A few examples with the sequence of word flags they require: @@ -1248,6 +1252,7 @@ COMPOUNDRULE yz yz COMPOUNDRULE x+z xz xxz xxxz etc. COMPOUNDRULE yx+ yx yxx yxxx etc. + COMPOUNDRULE xy?z xz xyz COMPOUNDRULE [abc]z az bz cz COMPOUNDRULE [abc]+z az aaz abaz bz baz bcbz cz caz cbaz etc. diff -Naur vim73.orig/runtime/doc/starting.txt vim73/runtime/doc/starting.txt --- vim73.orig/runtime/doc/starting.txt 2010-08-15 12:23:22.000000000 +0000 +++ vim73/runtime/doc/starting.txt 2013-06-07 17:07:09.798980694 +0000 @@ -1,4 +1,4 @@ -*starting.txt* For Vim version 7.3. Last change: 2009 Dec 31 +*starting.txt* For Vim version 7.3. Last change: 2013 May 29 VIM REFERENCE MANUAL by Bram Moolenaar @@ -95,14 +95,14 @@ (normally not installed) view vim -R Start in read-only mode (see |-R|). *view* gvim vim -g Start the GUI (see |gui|). *gvim* -gex vim -eg Start the GUI in Ex mode. *gex* -gview vim -Rg Start the GUI in read-only mode. *gview* +gex vim -eg Start the GUI in Ex mode. *gex* +gview vim -Rg Start the GUI in read-only mode. *gview* rvim vim -Z Like "vim", but in restricted mode (see |-Z|) *rvim* -rview vim -RZ Like "view", but in restricted mode. *rview* -rgvim vim -gZ Like "gvim", but in restricted mode. *rgvim* -rgview vim -RgZ Like "gview", but in restricted mode. *rgview* +rview vim -RZ Like "view", but in restricted mode. *rview* +rgvim vim -gZ Like "gvim", but in restricted mode. *rgvim* +rgview vim -RgZ Like "gview", but in restricted mode. *rgview* evim vim -y Easy Vim: set 'insertmode' (see |-y|) *evim* -eview vim -yR Like "evim" in read-only mode *eview* +eview vim -yR Like "evim" in read-only mode *eview* vimdiff vim -d Start in diff mode |diff-mode| gvimdiff vim -gd Start in diff mode |diff-mode| @@ -244,11 +244,12 @@ -Z Restricted mode. All commands that make use of an external shell are disabled. This includes suspending with CTRL-Z, ":sh", filtering, the system() function, backtick expansion, - etc. + delete(), rename(), mkdir(), writefile(), libcall(), etc. {not in Vi} *-g* --g Start Vim in GUI mode. See |gui|. {not in Vi} +-g Start Vim in GUI mode. See |gui|. For the opposite see |-v|. + {not in Vi} *-v* -v Start Ex in Vi mode. Only makes a difference when the @@ -424,12 +425,7 @@ "-d con:30/10/600/150". But you can also use it to start editing on another device, e.g., AUX:. {not in Vi} *-f* --f Amiga: Do not restart Vim to open a new window. This - option should be used when Vim is started by a program that - will wait for the edit session to finish (e.g., mail or - readnews). See |amiga-window|. - - GUI: Do not disconnect from the program that started Vim. +-f GUI: Do not disconnect from the program that started Vim. 'f' stands for "foreground". If omitted, the GUI forks a new process and exits the current one. "-f" should be used when gvim is started by a program that will wait for the edit @@ -437,8 +433,18 @@ never to fork, include 'f' in 'guioptions' in your |gvimrc|. Careful: You can use "-gf" to start the GUI in the foreground, but "-fg" is used to specify the foreground color. |gui-fork| + + Amiga: Do not restart Vim to open a new window. This + option should be used when Vim is started by a program that + will wait for the edit session to finish (e.g., mail or + readnews). See |amiga-window|. + + MS-Windows: This option is not supported. However, when + running Vim with an installed vim.bat or gvim.bat file it + works. {not in Vi} + *--nofork* --nofork GUI: Do not fork. Same as |-f|. *-u* *E282* @@ -869,6 +875,7 @@ 12. Execute startup commands If a "-t" flag was given to Vim, the tag is jumped to. The commands given with the |-c| and |+cmd| arguments are executed. + The starting flag is reset, has("vim_starting") will now return zero. If the 'insertmode' option is set, Insert mode is entered. The |VimEnter| autocommands are executed. diff -Naur vim73.orig/runtime/doc/syntax.txt vim73/runtime/doc/syntax.txt --- vim73.orig/runtime/doc/syntax.txt 2010-08-15 12:23:22.000000000 +0000 +++ vim73/runtime/doc/syntax.txt 2013-06-07 17:07:09.818980637 +0000 @@ -1,4 +1,4 @@ -*syntax.txt* For Vim version 7.3. Last change: 2010 Aug 10 +*syntax.txt* For Vim version 7.3. Last change: 2013 Jun 06 VIM REFERENCE MANUAL by Bram Moolenaar @@ -37,6 +37,7 @@ 15. Highlighting tags |tag-highlight| 16. Window-local syntax |:ownsyntax| 17. Color xterms |xterm-color| +18. When syntax is slow |:syntime| {Vi does not have any of these commands} @@ -199,7 +200,8 @@ If you don't like a distributed syntax file, or you have downloaded a new version, follow the same steps as for |mysyntaxfile| above. Just make sure that you write the syntax file in a directory that is early in 'runtimepath'. -Vim will only load the first syntax file found. +Vim will only load the first syntax file found, assuming that it sets +b:current_syntax. NAMING CONVENTIONS *group-name* *{group-name}* *E669* *W18* @@ -379,140 +381,342 @@ This is not a syntax file itself, but a script that converts the current window into HTML. Vim opens a new window in which it builds the HTML file. +After you save the resulting file, you can view it with any browser. The +colors should be exactly the same as you see them in Vim. You can jump to +specific lines by adding (for example) #L123 or #123 to the end of the URL in +your browser's address bar (#123 only with javascript support). And with +|g:html_dynamic_folds| enabled, you can show or hide the text that is folded +in Vim. + You are not supposed to set the 'filetype' or 'syntax' option to "2html"! Source the script to convert the current file: > :runtime! syntax/2html.vim < - *:TOhtml* -Or use the ":TOhtml" user command. It is defined in a standard plugin. -":TOhtml" also works with a range and in a Visual area: > - - :10,40TOhtml - -Warning: This is slow! The script must process every character of every line. -Because it is so slow, by default a progress bar is displayed in the -statusline for each step that usually takes a long time. If you don't like -seeing this progress bar, you can disable it and get a very minor speed -improvement with: > - - let g:html_no_progress = 1 - -":TOhtml" has another special feature: if the window is in diff mode, it will -generate HTML that shows all the related windows. This can be disabled by -setting the g:html_diff_one_file variable: > - - let g:html_diff_one_file = 1 +Many variables affect the output of 2html.vim; see below. Any of the on/off +options listed below can be enabled or disabled by setting them explicitly to +the desired value, or restored to their default by removing the variable using +|:unlet|. -After you save the resulting file, you can view it with any browser. The -colors should be exactly the same as you see them in Vim. +Remarks: +- Some truly ancient browsers may not show the background colors. +- From most browsers you can also print the file (in color)! +- The latest TOhtml may actually work with older versions of Vim, but some + features such as conceal support will not function, and the colors may be + incorrect for an old Vim without GUI support compiled in. +Here is an example how to run the script over all .c and .h files from a +Unix shell: > + for f in *.[ch]; do gvim -f +"syn on" +"run! syntax/2html.vim" +"wq" +"q" $f; done +< + *g:html_start_line* *g:html_end_line* To restrict the conversion to a range of lines, use a range with the |:TOhtml| -command, or set "g:html_start_line" and "g:html_end_line" to the first and -last line to be converted. Example, using the last set Visual area: > +command below, or set "g:html_start_line" and "g:html_end_line" to the first +and last line to be converted. Example, using the last set Visual area: > :let g:html_start_line = line("'<") :let g:html_end_line = line("'>") + :runtime! syntax/2html.vim +< + *:TOhtml* +:[range]TOhtml The ":TOhtml" command is defined in a standard plugin. + This command will source |2html.vim| for you. When a + range is given, set |g:html_start_line| and + |g:html_end_line| to the start and end of the range, + respectively. Default range is the entire buffer. + + If the current window is part of a |diff|, unless + |g:html_diff_one_file| is set, :TOhtml will convert + all windows which are part of the diff in the current + tab and place them side-by-side in a
element + in the generated HTML. When this happens you can jump + to lines in specific windows with (for example) #W1L42 + for line 42 in the first diffed window, or #W3L87 for + line 87 in the third. Omitting the window ID will + default to the first window if javascript is enabled. + + Examples: > + + :10,40TOhtml " convert lines 10-40 to html + :'<,'>TOhtml " convert current/last visual selection + :TOhtml " convert entire buffer +< + *g:html_diff_one_file* +Default: 0. +When 0, all windows involved in a |diff| in the current tab page are converted +to HTML and placed side-by-side in a
element. +When 1, only the current buffer is converted. +Example: > + + let g:html_diff_one_file = 1 +< + *g:html_whole_filler* +Default: 0. +When 0, if |g:html_diff_one_file| is 1, a sequence of more than 3 filler lines +is displayed as three lines with the middle line mentioning the total number +of inserted lines. +When 1, always display all inserted lines as if |g:html_diff_one_file| were +not set. +> + :let g:html_whole_filler = 1 +< + *TOhtml-performance* *g:html_no_progress* +Default: 0. +When 0, display a progress bar in the statusline for each major step in the +2html.vim conversion process. +When 1, do not display the progress bar. This offers a minor speed improvement +but you won't have any idea how much longer the conversion might take; for big +files it can take a long time! +Example: > -The lines are numbered according to 'number' option and the Number -highlighting. You can force lines to be numbered in the HTML output by -setting "html_number_lines" to non-zero value: > + let g:html_no_progress = 1 +< +You can obtain better performance improvements by also instructing Vim to not +run interactively, so that too much time is not taken to redraw as the script +moves through the buffer, switches windows, and the like: > + + vim -E -s -c "let g:html_no_progress=1" -c "syntax on" -c "set ft=c" -c "runtime syntax/2html.vim" -cwqa myfile.c +< +Note that the -s flag prevents loading your .vimrc and any plugins, so you +need to explicitly source/enable anything that will affect the HTML +conversion. See |-E| and |-s-ex| for details. It is probably best to create a +script to replace all the -c commands and use it with the -u flag instead of +specifying each command separately. + + *g:html_number_lines* +Default: current 'number' setting. +When 0, buffer text is displayed in the generated HTML without line numbering. +When 1, a column of line numbers is added to the generated HTML with the same +highlighting as the line number column in Vim (|hl-LineNr|). +Force line numbers even if 'number' is not set: > :let g:html_number_lines = 1 -Force to omit the line numbers by using a zero value: > +Force to omit the line numbers: > :let g:html_number_lines = 0 Go back to the default to use 'number' by deleting the variable: > :unlet g:html_number_lines - -By default, valid HTML 4.01 using cascading style sheets (CSS1) is generated. -If you need to generate markup for really old browsers or some other user -agent that lacks basic CSS support, use: > +< + *g:html_use_css* +Default: 1. +When 1, generate valid HTML 4.01 markup with CSS1 styling, supported in all +modern browsers and most old browsers. +When 0, generate tags and similar outdated markup. This is not +recommended but it may work better in really old browsers, email clients, +forum posts, and similar situations where basic CSS support is unavailable. +Example: > :let g:html_use_css = 0 +< + *g:html_ignore_conceal* +Default: 0. +When 0, concealed text is removed from the HTML and replaced with a character +from |:syn-cchar| or 'listchars' as appropriate, depending on the current +value of 'conceallevel'. +When 1, include all text from the buffer in the generated HTML, even if it is +|conceal|ed. -Concealed text is removed from the HTML and replaced with the appropriate -character from |:syn-cchar| or 'listchars' depending on the current value of -'conceallevel'. If you always want to display all text in your document, -either set 'conceallevel' to zero before invoking 2html, or use: > +Either of the following commands will ensure that all text in the buffer is +included in the generated HTML (unless it is folded): > :let g:html_ignore_conceal = 1 - -Similarly, closed folds are put in the HTML as they are displayed. If you -don't want this, use the |zR| command before invoking 2html, or use: > + :setl conceallevel=0 +< + *g:html_ignore_folding* +Default: 0. +When 0, text in a closed fold is replaced by the text shown for the fold in +Vim (|fold-foldtext|). See |g:html_dynamic_folds| if you also want to allow +the user to expand the fold as in Vim to see the text inside. +When 1, include all text from the buffer in the generated HTML; whether the +text is in a fold has no impact at all. |g:html_dynamic_folds| has no effect. + +Either of these commands will ensure that all text in the buffer is included +in the generated HTML (unless it is concealed): > + zR :let g:html_ignore_folding = 1 +< + *g:html_dynamic_folds* +Default: 0. +When 0, text in a closed fold is not included at all in the generated HTML. +When 1, generate javascript to open a fold and show the text within, just like +in Vim. -You may want to generate HTML that includes all the data within the folds, and -allow the user to view the folded data similar to how they would in Vim. To -generate this dynamic fold information, use: > - :let g:html_dynamic_folds = 1 +Setting this variable to 1 causes 2html.vim to always use CSS for styling, +regardless of what |g:html_use_css| is set to. -Using html_dynamic_folds will imply html_use_css, because it would be far too -difficult to do it for old browsers. However, html_ignore_folding overrides -html_dynamic_folds. - -Using html_dynamic_folds will default to generating a foldcolumn in the html -similar to Vim's foldcolumn, that will use javascript to open and close the -folds in the HTML document. The width of this foldcolumn starts at the current -setting of |'foldcolumn'| but grows to fit the greatest foldlevel in your -document. If you do not want to show a foldcolumn at all, use: > +This variable is ignored when |g:html_ignore_folding| is set. +> + :let g:html_dynamic_folds = 1 +< + *g:html_no_foldcolumn* +Default: 0. +When 0, if |g:html_dynamic_folds| is 1, generate a column of text similar to +Vim's foldcolumn (|fold-foldcolumn|) the user can click on to toggle folds +open or closed. The minimum width of the generated text column is the current +'foldcolumn' setting. +When 1, do not generate this column; instead, hovering the mouse cursor over +folded text will open the fold as if |g:html_hover_unfold| were set. +> :let g:html_no_foldcolumn = 1 - -Using this option, there will be no foldcolumn available to open the folds in -the HTML. For this reason, another option is provided: html_hover_unfold. -Enabling this option will use CSS 2.0 to allow a user to open a fold by -hovering the mouse pointer over it. Note that old browsers (notably Internet -Explorer 6) will not support this feature. Browser-specific markup for IE6 is -included to fall back to the normal CSS1 code so that the folds show up -correctly for this browser, but they will not be openable without a -foldcolumn. Note that using html_hover_unfold will allow modern browsers with -disabled javascript to view closed folds. To use this option, use: > +< + *TOhtml-uncopyable-text* *g:html_prevent_copy* +Default: empty string. +This option prevents certain regions of the generated HTML from being copied, +when you select all text in document rendered in a browser and copy it. Useful +for allowing users to copy-paste only the source text even if a fold column or +line numbers are shown in the generated content. Specify regions to be +affected in this way as follows: + f: fold column + n: line numbers (also within fold text) + t: fold text + d: diff filler + +Example, to make the fold column and line numbers uncopyable: > + :let g:html_prevent_copy = "fn" +< +This feature is currently implemented by inserting read-only elements +into the markup to contain the uncopyable areas. This does not work well in +all cases. When pasting to some applications which understand HTML, the + elements also get pasted. But plain-text paste destinations should +always work. + + *g:html_no_invalid* +Default: 0. +When 0, if |g:html_prevent_copy| is non-empty, an invalid attribute is +intentionally inserted into the element for the uncopyable areas. This +increases the number of applications you can paste to without also pasting the + elements. Specifically, Microsoft Word will not paste the +elements if they contain this invalid attribute. +When 1, no invalid markup is ever intentionally inserted, and the generated +page should validate. However, be careful pasting into Microsoft Word when +|g:html_prevent_copy| is non-empty; it can be hard to get rid of the +elements which get pasted. + + *g:html_hover_unfold* +Default: 0. +When 0, the only way to open a fold generated by 2html.vim with +|g:html_dynamic_folds| set, is to click on the generated fold column. +When 1, use CSS 2.0 to allow the user to open a fold by moving the mouse +cursor over the displayed fold text. This is useful to allow users with +disabled javascript to view the folded text. + +Note that old browsers (notably Internet Explorer 6) will not support this +feature. Browser-specific markup for IE6 is included to fall back to the +normal CSS1 styling so that the folds show up correctly for this browser, but +they will not be openable without a foldcolumn. +> :let g:html_hover_unfold = 1 - -Setting html_no_foldcolumn with html_dynamic_folds will automatically set -html_hover_unfold, because otherwise the folds wouldn't be dynamic. - -By default "
" and "
" is used around the text. This makes it show -up as you see it in Vim, but without wrapping. If you prefer wrapping, at the -risk of making some things look a bit different, use: > +< + *TOhtml-wrap-text* *g:html_pre_wrap* +Default: current 'wrap' setting. +When 0, if |g:html_no_pre| is 0 or unset, the text in the generated HTML does +not wrap at the edge of the browser window. +When 1, if |g:html_use_css| is 1, the CSS 2.0 "white-space:pre-wrap" value is +used, causing the text to wrap at whitespace at the edge of the browser +window. +Explicitly enable text wrapping: > + :let g:html_pre_wrap = 1 +Explicitly disable wrapping: > + :let g:html_pre_wrap = 0 +Go back to default, determine wrapping from 'wrap' setting: > + :unlet g:html_pre_wrap +< + *g:html_no_pre* +Default: 0. +When 0, buffer text in the generated HTML is surrounded by
...
+tags. Series of whitespace is shown as in Vim without special markup, and tab +characters can be included literally (see |g:html_expand_tabs|). +When 1 (not recommended), the
 tags are omitted, and a plain 
is +used instead. Whitespace is replaced by a series of   character +references, and
is used to end each line. This is another way to allow +text in the generated HTML is wrap (see |g:html_pre_wrap|) which also works in +old browsers, but may cause noticeable differences between Vim's display and +the rendered page generated by 2html.vim. +> :let g:html_no_pre = 1 -This will use
at the end of each line and use " " for repeated -spaces. - -The current value of 'encoding' is used to specify the charset of the HTML -file. This only works for those values of 'encoding' that have an equivalent -HTML charset name. To overrule this set g:html_use_encoding to the name of -the charset to be used: > - :let g:html_use_encoding = "foobar" -To omit the line that specifies the charset, set g:html_use_encoding to an -empty string: > +< + *g:html_expand_tabs* +Default: 1 if 'tabstop' is 8, 'expandtab' is 0, and no fold column or line + numbers occur in the generated HTML; + 0 otherwise. +When 0, characters in the buffer text are replaced with an appropriate +number of space characters, or   references if |g:html_no_pre| is 1. +When 1, if |g:html_no_pre| is 0 or unset, characters in the buffer text +are included as-is in the generated HTML. This is useful for when you want to +allow copy and paste from a browser without losing the actual whitespace in +the source document. Note that this can easily break text alignment and +indentation in the HTML, unless set by default. + +Force |2html.vim| to keep characters: > + :let g:html_expand_tabs = 0 +< +Force tabs to be expanded: > + :let g:html_expand_tabs = 1 +< + *TOhtml-encoding-detect* *TOhtml-encoding* +It is highly recommended to set your desired encoding with +|g:html_use_encoding| for any content which will be placed on a web server. + +If you do not specify an encoding, |2html.vim| uses the preferred IANA name +for the current value of 'fileencoding' if set, or 'encoding' if not. +'encoding' is always used for certain 'buftype' values. 'fileencoding' will be +set to match the chosen document encoding. + +Automatic detection works for the encodings mentioned specifically by name in +|encoding-names|, but TOhtml will only automatically use those encodings with +wide browser support. However, you can override this to support specific +encodings that may not be automatically detected by default (see options +below). See http://www.iana.org/assignments/character-sets for the IANA names. + +Note, by default all Unicode encodings are converted to UTF-8 with no BOM in +the generated HTML, as recommended by W3C: + + http://www.w3.org/International/questions/qa-choosing-encodings + http://www.w3.org/International/questions/qa-byte-order-mark + + *g:html_use_encoding* +Default: none, uses IANA name for current 'fileencoding' as above. +To overrule all automatic charset detection, set g:html_use_encoding to the +name of the charset to be used. It is recommended to set this variable to +something widely supported, like UTF-8, for anything you will be hosting on a +webserver: > + :let g:html_use_encoding = "UTF-8" +You can also use this option to omit the line that specifies the charset +entirely, by setting g:html_use_encoding to an empty string (NOT recommended): > :let g:html_use_encoding = "" -To go back to the automatic mechanism, delete the g:html_use_encoding +To go back to the automatic mechanism, delete the |g:html_use_encoding| variable: > :unlet g:html_use_encoding < -For diff mode a sequence of more than 3 filler lines is displayed as three -lines with the middle line mentioning the total number of inserted lines. If -you prefer to see all the inserted lines use: > - :let g:html_whole_filler = 1 -And to go back to displaying up to three lines again: > - :unlet g:html_whole_filler -< - *convert-to-XML* *convert-to-XHTML* -An alternative is to have the script generate XHTML (XML compliant HTML). To -do this set the "html_use_xhtml" variable: > + *g:html_encoding_override* +Default: none, autoload/tohtml.vim contains default conversions for encodings + mentioned by name at |encoding-names|. +This option allows |2html.vim| to detect the correct 'fileencoding' when you +specify an encoding with |g:html_use_encoding| which is not in the default +list of conversions. + +This is a dictionary of charset-encoding pairs that will replace existing +pairs automatically detected by TOhtml, or supplement with new pairs. + +Detect the HTML charset "windows-1252" as the encoding "8bit-cp1252": > + :let g:html_encoding_override = {'windows-1252': '8bit-cp1252'} +< + *g:html_charset_override* +Default: none, autoload/tohtml.vim contains default conversions for encodings + mentioned by name at |encoding-names| and which have wide + browser support. +This option allows |2html.vim| to detect the HTML charset for any +'fileencoding' or 'encoding' which is not detected automatically. You can also +use it to override specific existing encoding-charset pairs. For example, +TOhtml will by default use UTF-8 for all Unicode/UCS encodings. To use UTF-16 +and UTF-32 instead, use: > + :let g:html_charset_override = {'ucs-4': 'UTF-32', 'utf-16': 'UTF-16'} + +Note that documents encoded in either UTF-32 or UTF-16 have known +compatibility problems with some major browsers. + + *convert-to-XML* *convert-to-XHTML* *g:html_use_xhtml* +Default: 0. +When 0, generate standard HTML 4.01 (strict when possible). +When 1, generate XHTML 1.0 instead (XML compliant HTML). +> :let g:html_use_xhtml = 1 - -Any of these options can be enabled or disabled by setting them explicitly to -the desired value, or restored to their default by removing the variable using -|:unlet|. - -Remarks: -- This only works in a version with GUI support. If the GUI is not actually - running (possible for X11) it still works, but not very well (the colors - may be wrong). -- Some truly ancient browsers may not show the background colors. -- From most browsers you can also print the file (in color)! - -Here is an example how to run the script over all .c and .h files from a -Unix shell: > - for f in *.[ch]; do gvim -f +"syn on" +"run! syntax/2html.vim" +"wq" +"q" $f; done < ABEL *abel.vim* *ft-abel-syntax* @@ -589,7 +793,11 @@ asmsyntax=nasm Replace "nasm" with the name of the real assembly syntax. This line must be one of the first five lines in the file. No non-white text must be -immediately before or after this text. +immediately before or after this text. Note that specifying asmsyntax=foo is +equivalent to setting ft=foo in a |modeline|, and that in case of a conflict +between the two settings the one from the modeline will take precedence (in +particular, if you have ft=asm in the modeline, you will get the GNU syntax +highlighting regardless of what is specified as asmsyntax). The syntax type can always be overruled for a specific buffer by setting the b:asmsyntax variable: > @@ -694,10 +902,12 @@ c_ansi_typedefs ... but do standard ANSI types c_ansi_constants ... but do standard ANSI constants c_no_utf don't highlight \u and \U in strings -c_syntax_for_h use C syntax for *.h files, instead of C++ +c_syntax_for_h for *.h files use C syntax instead of C++ and use objc + syntax instead of objcpp c_no_if0 don't highlight "#if 0" blocks as comments c_no_cformat don't highlight %-formats in strings c_no_c99 don't highlight C99 standard items +c_no_c11 don't highlight C11 standard items When 'foldmethod' is set to "syntax" then /* */ comments and { } blocks will become a fold. If you don't want comments to become a fold use: > @@ -798,6 +1008,14 @@ The ColdFusion syntax file is based on the HTML syntax file. +CPP *cpp.vim* *ft-cpp-syntax* + +Most of things are same as |ft-c-syntax|. + +Variable Highlight ~ +cpp_no_c11 don't highlight C++11 standard items + + CSH *csh.vim* *ft-csh-syntax* This covers the shell named "csh". Note that on some systems tcsh is actually @@ -806,13 +1024,13 @@ Detecting whether a file is csh or tcsh is notoriously hard. Some systems symlink /bin/csh to /bin/tcsh, making it almost impossible to distinguish between csh and tcsh. In case VIM guesses wrong you can set the -"filetype_csh" variable. For using csh: > - - :let filetype_csh = "csh" +"filetype_csh" variable. For using csh: *g:filetype_csh* +> + :let g:filetype_csh = "csh" For using tcsh: > - :let filetype_csh = "tcsh" + :let g:filetype_csh = "tcsh" Any script with a tcsh extension or a standard tcsh filename (.tcshrc, tcsh.tcshrc, tcsh.login) will have filetype tcsh. All other tcsh/csh scripts @@ -872,8 +1090,8 @@ DOCBOOK *docbk.vim* *ft-docbk-syntax* *docbook* -DOCBOOK XML *docbkxml.vim* *ft-docbkxml-syntax* -DOCBOOK SGML *docbksgml.vim* *ft-docbksgml-syntax* +DOCBOOK XML *docbkxml.vim* *ft-docbkxml-syntax* +DOCBOOK SGML *docbksgml.vim* *ft-docbksgml-syntax* There are two types of DocBook files: SGML and XML. To specify what type you are using the "b:docbk_type" variable should be set. Vim does this for you @@ -889,6 +1107,10 @@ or: > :set filetype=docbkxml +You can specify the DocBook version: > + :let docbk_ver = 3 +When not set 4 is used. + DOSBATCH *dosbatch.vim* *ft-dosbatch-syntax* @@ -925,9 +1147,9 @@ or > // vim:syntax=c.doxygen -It can also be done automatically for C, C++, C# and IDL files by setting the -global or buffer-local variable load_doxygen_syntax. This is done by adding -the following to your .vimrc. > +It can also be done automatically for C, C++, C#, IDL and PHP files by setting +the global or buffer-local variable load_doxygen_syntax. This is done by +adding the following to your .vimrc. > :let g:load_doxygen_syntax=1 There are a couple of variables that have an effect on syntax highlighting, and @@ -1026,22 +1248,24 @@ ERLANG *erlang.vim* *ft-erlang-syntax* -The erlang highlighting supports Erlang (ERicsson LANGuage). -Erlang is case sensitive and default extension is ".erl". +Erlang is a functional programming language developed by Ericsson. Files with +the following extensions are recognized as Erlang files: erl, hrl, yaws. -If you want to disable keywords highlighting, put in your .vimrc: > - :let erlang_keywords = 1 -If you want to disable built-in-functions highlighting, put in your -.vimrc file: > - :let erlang_functions = 1 -If you want to disable special characters highlighting, put in -your .vimrc: > - :let erlang_characters = 1 +The BIFs (built-in functions) are highlighted by default. To disable this, +put the following line in your vimrc: > + + :let g:erlang_highlight_bifs = 0 + +To enable highlighting some special atoms, put this in your vimrc: > + + :let g:erlang_highlight_special_atoms = 1 FLEXWIKI *flexwiki.vim* *ft-flexwiki-syntax* FlexWiki is an ASP.NET-based wiki package available at http://www.flexwiki.com +NOTE: this site currently doesn't work, on Wikipedia is mentioned that +development stopped in 2009. Syntax highlighting is available for the most common elements of FlexWiki syntax. The associated ftplugin script sets some buffer-local options to make @@ -1093,14 +1317,12 @@ FORTRAN *fortran.vim* *ft-fortran-syntax* Default highlighting and dialect ~ -Highlighting appropriate for f95 (Fortran 95) is used by default. This choice -should be appropriate for most users most of the time because Fortran 95 is a -superset of Fortran 90 and almost a superset of Fortran 77. Support for -Fortran 2003 and Fortran 2008 features has been introduced and is -automatically available in the default (f95) highlighting. +Highlighting appropriate for Fortran 2008 is used by default. This choice +should be appropriate for most users most of the time because Fortran 2008 is +almost a superset of previous versions (Fortran 2003, 95, 90, and 77). Fortran source code form ~ -Fortran 9x code can be in either fixed or free source form. Note that the +Fortran code can be in either fixed or free source form. Note that the syntax highlighting will not be correct if the form is incorrectly set. When you create a new fortran file, the syntax script assumes fixed source @@ -1181,52 +1403,54 @@ construct. Non-default fortran dialects ~ -The syntax script supports five Fortran dialects: f95, f90, f77, the Lahey -subset elf90, and the Imagine1 subset F. - -If you use f77 with extensions, even common ones like do/enddo loops, do/while -loops and free source form that are supported by most f77 compilers including -g77 (GNU Fortran), then you will probably find the default highlighting -satisfactory. However, if you use strict f77 with no extensions, not even free -source form or the MIL STD 1753 extensions, then the advantages of setting the -dialect to f77 are that names such as SUM are recognized as user variable -names and not highlighted as f9x intrinsic functions, that obsolete constructs -such as ASSIGN statements are not highlighted as todo items, and that fixed -source form will be assumed. - -If you use elf90 or F, the advantage of setting the dialect appropriately is -that f90 features excluded from these dialects will be highlighted as todo -items and that free source form will be assumed as required for these -dialects. - -The dialect can be selected by setting the variable fortran_dialect. The -permissible values of fortran_dialect are case-sensitive and must be "f95", -"f90", "f77", "elf" or "F". Invalid values of fortran_dialect are ignored. - -If all your fortran files use the same dialect, set fortran_dialect in your -.vimrc prior to your syntax on statement. If the dialect depends upon the file -extension, then it is most convenient to set it in a ftplugin file. For more -information on ftplugin files, see |ftplugin|. For example, if all your -fortran files with an .f90 extension are written in the elf subset, your -ftplugin file should contain the code > +The syntax script supports two Fortran dialects: f08 and F. You will probably +find the default highlighting (f08) satisfactory. A few legacy constructs +deleted or declared obsolescent in the 2008 standard are highlighted as todo +items. + +If you use F, the advantage of setting the dialect appropriately is that +other legacy features excluded from F will be highlighted as todo items and +that free source form will be assumed. + +The dialect can be selected in various ways. If all your fortran files use +the same dialect, set the global variable fortran_dialect in your .vimrc prior +to your syntax on statement. The case-sensitive, permissible values of +fortran_dialect are "f08" or "F". Invalid values of fortran_dialect are +ignored. + +If the dialect depends upon the file extension, then it is most convenient to +set a buffer-local variable in a ftplugin file. For more information on +ftplugin files, see |ftplugin|. For example, if all your fortran files with +an .f90 extension are written in the F subset, your ftplugin file should +contain the code > let s:extfname = expand("%:e") if s:extfname ==? "f90" - let fortran_dialect="elf" + let b:fortran_dialect="F" else - unlet! fortran_dialect + unlet! b:fortran_dialect endif Note that this will work only if the "filetype plugin indent on" command precedes the "syntax on" command in your .vimrc file. Finer control is necessary if the file extension does not uniquely identify -the dialect. You can override the default dialect, on a file-by-file basis, by -including a comment with the directive "fortran_dialect=xx" (where xx=f77 or -elf or F or f90 or f95) in one of the first three lines in your file. For -example, your older .f files may be written in extended f77 but your newer -ones may be F codes, and you would identify the latter by including in the -first three lines of those files a Fortran comment of the form > +the dialect. You can override the default dialect, on a file-by-file basis, +by including a comment with the directive "fortran_dialect=xx" (where xx=F or +f08) in one of the first three lines in your file. For example, your older .f +files may be legacy code but your newer ones may be F codes, and you would +identify the latter by including in the first three lines of those files a +Fortran comment of the form > ! fortran_dialect=F -F overrides elf if both directives are present. + +For previous versions of the syntax, you may have set fortran_dialect to the +now-obsolete values "f77", "f90", "f95", or "elf". Such settings will be +silently handled as "f08". Users of "elf" may wish to experiment with "F" +instead. + +The syntax/fortran.vim script contains embedded comments that tell you how to +comment and/or uncomment some lines to (a) activate recognition of some +non-standard, vendor-supplied intrinsics and (b) to prevent features deleted +or declared obsolescent in the 2008 standard from being highlighted as todo +items. Limitations ~ Parenthesis checking does not catch too few closing parentheses. Hollerith @@ -1541,11 +1765,6 @@ strings, strings, boolean constants and types (this, super) respectively. I have opted to chose another background for those statements. -In order to help you write code that can be easily ported between Java and -C++, all C++ keywords can be marked as an error in a Java program. To -have this add this line in your .vimrc file: > - :let java_allow_cpp_keywords = 0 - Javadoc is a program that takes special comments out of Java program files and creates HTML pages. The standard configuration will highlight this HTML code similarly to HTML files (see |html.vim|). You can even add Javascript @@ -1684,19 +1903,10 @@ LUA *lua.vim* *ft-lua-syntax* -This syntax file may be used for Lua 4.0, Lua 5.0 or Lua 5.1 (the latter is +The Lua syntax file can be used for versions 4.0, 5.0, 5.1 and 5.2 (5.2 is the default). You can select one of these versions using the global variables lua_version and lua_subversion. For example, to activate Lua -4.0 syntax highlighting, use this command: > - - :let lua_version = 4 - -If you are using Lua 5.0, use these commands: > - - :let lua_version = 5 - :let lua_subversion = 0 - -To restore highlighting for Lua 5.1: > +5.1 syntax highlighting, set the variables like this: :let lua_version = 5 :let lua_subversion = 1 @@ -1868,7 +2078,7 @@ than you intend to have in your final document. For this reason, the common practice is to insert a carriage return immediately after all punctuation marks. If you want to have "even" text in your final processed output, you -need to maintaining regular spacing in the input text. To mark both trailing +need to maintain regular spacing in the input text. To mark both trailing spaces and two or more spaces after a punctuation as an error, use: > :let nroff_space_errors = 1 @@ -2085,7 +2295,7 @@ let php_parent_error_close = 1 -For skipping an php end tag, if there exists an open ( or [ without a closing +For skipping a php end tag, if there exists an open ( or [ without a closing one: > let php_parent_error_open = 1 @@ -2247,24 +2457,33 @@ PYTHON *python.vim* *ft-python-syntax* -There are four options to control Python syntax highlighting. +There are six options to control Python syntax highlighting. For highlighted numbers: > - :let python_highlight_numbers = 1 + :let python_no_number_highlight = 1 For highlighted builtin functions: > - :let python_highlight_builtins = 1 + :let python_no_builtin_highlight = 1 For highlighted standard exceptions: > - :let python_highlight_exceptions = 1 + :let python_no_exception_highlight = 1 -For highlighted trailing whitespace and mix of spaces and tabs: - :let python_highlight_space_errors = 1 +For highlighted doctests and code inside: > + :let python_no_doctest_highlight = 1 +or > + :let python_no_doctest_code_highlight = 1 +(first option implies second one). + +For highlighted trailing whitespace and mix of spaces and tabs: > + :let python_space_error_highlight = 1 If you want all possible Python highlighting (the same as setting the -preceding three options): > +preceding last option and unsetting all other ones): > :let python_highlight_all = 1 +Note: only existence of these options matter, not their value. You can replace + 1 above with anything. + QUAKE *quake.vim* *ft-quake-syntax* @@ -2300,6 +2519,12 @@ later, and part earlier) adds. +RESTRUCTURED TEXT *rst.vim* *ft-rst-syntax* + +You may set what syntax definitions should be used for code blocks via + let rst_syntax_code_list = ['vim', 'lisp', ...] + + REXX *rexx.vim* *ft-rexx-syntax* If you notice highlighting errors while scrolling backwards, which are fixed @@ -2310,6 +2535,12 @@ displayed line. The default value is 10. The disadvantage of using a larger number is that redrawing can become slow. +Vim tries to guess what type a ".r" file is. If it can't be detected (from +comment lines), the default is "r". To make the default rexx add this line to +your .vimrc: *g:filetype_r* +> + :let g:filetype_r = "r" + RUBY *ruby.vim* *ft-ruby-syntax* @@ -2537,8 +2768,41 @@ The default is to use the twice sh_minlines. Set it to a smaller number to speed up displaying. The disadvantage is that highlight errors may appear. + *g:sh_isk* *g:sh_noisk* +The shell languages appear to let "." be part of words, commands, etc; +consequently it should be in the isk for sh.vim. As of v116 of syntax/sh.vim, +syntax/sh.vim will append the "." to |'iskeyword'| by default; you may control +this behavior with: > + let g:sh_isk = '..whatever characters you want as part of iskeyword' + let g:sh_noisk= 1 " otherwise, if this exists, the isk will NOT chg +< + *sh-embed* *sh-awk* + Sh: EMBEDDING LANGUAGES~ + +You may wish to embed languages into sh. I'll give an example courtesy of +Lorance Stinson on how to do this with awk as an example. Put the following +file into $HOME/.vim/after/syntax/sh/awkembed.vim: > + + " AWK Embedding: {{{1 + " ============== + " Shamelessly ripped from aspperl.vim by Aaron Hope. + if exists("b:current_syntax") + unlet b:current_syntax + endif + syn include @AWKScript syntax/awk.vim + syn region AWKScriptCode matchgroup=AWKCommand start=+[=\\]\@+ skip=+\\$+ end=+[=\\]\@ + awk '...awk code here...' +be highlighted using the awk highlighting syntax. Clearly this may be +extended to other languages. -SPEEDUP (AspenTech plant simulator) *spup.vim* *ft-spup-syntax* + +SPEEDUP *spup.vim* *ft-spup-syntax* +(AspenTech plant simulator) The Speedup syntax file has some options: @@ -2621,6 +2885,8 @@ in your <.vimrc>, and :set fdm=syntax. I suggest doing the latter via a modeline at the end of your LaTeX file: > % vim: fdm=syntax +If your system becomes too slow, then you might wish to look into > + http://vim.wikia.com/wiki/Keep_folds_closed_while_inserting_text < *tex-nospell* Tex: Don't Want Spell Checking In Comments? ~ @@ -2629,7 +2895,14 @@ prefer that spell checking be disabled in comments in LaTeX files. To do this, put the following in your <.vimrc>: > let g:tex_comment_nospell= 1 -< +The comment lines > + % nospell{ + ... + % nospell} +will suppress spell checking between them. These comment lines spelling +control are known to be fragile; for example, don't include any of the section +commands (\part, \chapter, \section, \paragraph, etc) inside nospell blocks +or interleave environments (such as math) across nospell blocks. *tex-verb* Tex: Want Spell Checking in Verbatim Zones?~ @@ -2661,6 +2934,38 @@ increase them. This primarily affects synchronizing (i.e. just what group, if any, is the text at the top of the screen supposed to be in?). +Another cause of slow highlighting is due to syntax-driven folding; see +|tex-folding| for a way around this. + + *g:tex_fast* + +Finally, if syntax highlighting is still too slow, you may set > + + :let g:tex_fast= "" + +in your .vimrc. Used this way, the g:tex_fast variable causes the syntax +highlighting script to avoid defining any regions and associated +synchronization. The result will be much faster syntax highlighting; the +price: you will no longer have as much highlighting or any syntax-based +folding, and you will be missing syntax-based error checking. + +You may decide that some syntax is acceptable; you may use the following table +selectively to enable just some syntax highlighting: > + + b : allow bold and italic syntax + c : allow texComment syntax + m : allow texMatcher syntax (ie. {...} and [...]) + M : allow texMath syntax + p : allow parts, chapter, section, etc syntax + r : allow texRefZone syntax (nocite, bibliography, label, pageref, eqref) + s : allow superscript/subscript regions + S : allow texStyle syntax + v : allow verbatim syntax + V : allow texNewEnv and texNewCmd syntax +< +As an example, let g:tex_fast= "M" will allow math-associated highlighting +but suppress all the other region-based syntax highlighting. + *tex-morecommands* *tex-package* Tex: Want To Highlight More Commands? ~ @@ -2669,7 +2974,9 @@ package you'll often wish that the distributed syntax/tex.vim would support it. However, clearly this is impractical. So please consider using the techniques in |mysyntaxfile-add| to extend or modify the highlighting provided -by syntax/tex.vim. +by syntax/tex.vim. Please consider uploading any extensions that you write, +which typically would go in $HOME/after/syntax/tex/[pkgname].vim, to +http://vim.sf.net/. *tex-error* Tex: Excessive Error Highlighting? ~ @@ -2731,6 +3038,7 @@ following sets of characters: > a = accents/ligatures + b = bold and italic d = delimiters m = math symbols g = Greek @@ -2739,6 +3047,18 @@ By leaving one or more of these out, the associated conceal-character substitution will not be made. + *g:tex_isk* + Tex: Controlling What's In A Keyword~ + +(La)Tex keywords normally use the characters 0-9,a-z,A-Z,192-255 only +but the "_" is the only one that causes problems. So, by default, +syntax/tex.vim overrides the usual |'iskeyword'| setting (using |:setlocal|) +with one that works for LaTeX. + +However, one may override this iskeyword re-setting by setting the +variable, g:tex_isk, in one's .vimrc to whatever one wishes and +it will be used instead. + TF *tf.vim* *ft-tf-syntax* @@ -2792,7 +3112,7 @@ g:vimsyn_folding =~ 'P' : fold python script g:vimsyn_folding =~ 'r' : fold ruby script g:vimsyn_folding =~ 't' : fold tcl script - +< *g:vimsyn_noerror* Not all error highlighting that syntax/vim.vim does may be correct; VimL is a difficult language to highlight correctly. A way to suppress error @@ -3174,6 +3494,9 @@ :hi par1 ctermfg=red guifg=red :hi par2 ctermfg=blue guifg=blue :hi par3 ctermfg=darkgreen guifg=darkgreen +< + *E849* +The maximum number of syntax groups is 19999. ============================================================================== 6. :syntax arguments *:syn-arguments* @@ -3218,11 +3541,12 @@ in this way when they have their own highlighting via "matchgroup" cchar *:syn-cchar* - + *E844* The "cchar" argument defines the character shown in place of the item when it is concealed (setting "cchar" only makes sense when the conceal argument is given.) If "cchar" is not set then the default conceal -character defined in the 'listchars' option is used. Example: > +character defined in the 'listchars' option is used. The character cannot be +a control character such as Tab. Example: > :syntax match Entity "&" conceal cchar=& See |hl-Conceal| for highlighting. @@ -3536,7 +3860,7 @@ e end of the matched pattern e+{nr} end of the matched pattern plus {nr} chars to the right e-{nr} end of the matched pattern plus {nr} chars to the left -{nr} (for "lc" only): start matching {nr} chars to the left +{nr} (for "lc" only): start matching {nr} chars right of the start Examples: "ms=s+1", "hs=e-2", "lc=3". @@ -3633,10 +3957,10 @@ These extra regular expression items are available in region patterns: - */\z(* */\z(\)* *E50* *E52* - \z(\) Marks the sub-expression as "external", meaning that it is can - be accessed from another pattern match. Currently only usable - in defining a syntax region start pattern. + */\z(* */\z(\)* *E50* *E52* *E879* + \z(\) Marks the sub-expression as "external", meaning that it can be + accessed from another pattern match. Currently only usable in + defining a syntax region start pattern. */\z1* */\z2* */\z3* */\z4* */\z5* \z1 ... \z9 */\z6* */\z7* */\z8* */\z9* *E66* *E67* @@ -3711,6 +4035,9 @@ :syntax match Stuff "( aaa bbb )" contains=@BigGroup :syntax cluster BigGroup remove=B " no effect, since B isn't in BigGroup :syntax cluster SmallGroup remove=B " now bbb isn't matched within Stuff +< + *E848* +The maximum number of clusters is 9767. ============================================================================== 9. Including syntax files *:syn-include* *E397* @@ -3750,6 +4077,9 @@ with his own version, without replacing the file that does the ":syn include". + *E847* +The maximum number of includes is 999. + ============================================================================== 10. Synchronizing *:syn-sync* *E403* *E404* @@ -3803,7 +4133,7 @@ The file will be parsed from the start. This makes syntax highlighting accurate, but can be slow for long files. Vim caches previously parsed text, so that it's only slow when parsing the text for the first time. However, -when making changes some part of the next needs to be parsed again (worst +when making changes some part of the text needs to be parsed again (worst case: to the end of the file). Using "fromstart" is equivalent to using "minlines" with a very large number. @@ -3953,7 +4283,7 @@ :sy[ntax] list {group-name} -To list the syntax groups in one cluster: *E392* > +To list the syntax groups in one cluster: *E392* > :sy[ntax] list @{cluster-name} @@ -4316,6 +4646,9 @@ *hl-LineNr* LineNr Line number for ":number" and ":#" commands, and when 'number' or 'relativenumber' option is set. + *hl-CursorLineNr* +CursorLineNr Like LineNr when 'cursorline' or 'relativenumber' is set for + the cursor line. *hl-MatchParen* MatchParen The character under the cursor or just before it, if it is a paired bracket, and its match. |pi_paren.txt| @@ -4604,7 +4937,7 @@ Once a window has its own syntax, syntax commands executed from other windows on the same buffer (including :syntax clear) have no effect. Conversely, -syntax commands executed from that window do not effect other windows on the +syntax commands executed from that window do not affect other windows on the same buffer. A window with its own syntax reverts to normal behavior when another buffer @@ -4612,7 +4945,7 @@ When splitting the window, the new window will use the original syntax. ============================================================================== -16. Color xterms *xterm-color* *color-xterm* +17. Color xterms *xterm-color* *color-xterm* Most color xterms have only eight colors. If you don't get colors with the default setup, it should work with these lines in your .vimrc: > @@ -4754,4 +5087,63 @@ that Setup / Font / Enable Bold is NOT enabled. (info provided by John Love-Jensen ) + +============================================================================== +18. When syntax is slow *:syntime* + +This is aimed at authors of a syntax file. + +If your syntax causes redrawing to be slow, here are a few hints on making it +faster. To see slowness switch on some features that usually interfere, such +as 'relativenumber' and |folding|. + +Note: this is only available when compiled with the |+profile| feature. +You many need to build Vim with "huge" features. + +To find out what patterns are consuming most time, get an overview with this +sequence: > + :syntime on + [ redraw the text at least once with CTRL-L ] + :syntime report + +This will display a list of syntax patterns that were used, sorted by the time +it took to match them against the text. + +:syntime on Start measuring syntax times. This will add some + overhead to compute the time spent on syntax pattern + matching. + +:syntime off Stop measuring syntax times. + +:syntime clear Set all the counters to zero, restart measuring. + +:syntime report Show the syntax items used since ":syntime on" in the + current window. Use a wider display to see more of + the output. + + The list is sorted by total time. The columns are: + TOTAL Total time in seconds spent on + matching this pattern. + COUNT Number of times the pattern was used. + MATCH Number of times the pattern actually + matched + SLOWEST The longest time for one try. + AVERAGE The average time for one try. + NAME Name of the syntax item. Note that + this is not unique. + PATTERN The pattern being used. + +Pattern matching gets slow when it has to try many alternatives. Try to +include as much literal text as possible to reduce the number of ways a +pattern does NOT match. + +When using the "\@<=" and "\@ map.txt /** map.txt /** intro.txt /** + autocmd.txt /** map.txt /** map.txt /** map.txt /** cmdline.txt /** + cmdline.txt /** intro.txt /** term.txt /** term.txt /** @@ -3395,6 +3425,7 @@ ColorScheme autocmd.txt /*ColorScheme* Command-line cmdline.txt /*Command-line* Command-line-mode cmdline.txt /*Command-line-mode* +CompleteDone autocmd.txt /*CompleteDone* Contents quickref.txt /*Contents* Cscope if_cscop.txt /*Cscope* CursorHold autocmd.txt /*CursorHold* @@ -3420,7 +3451,6 @@ E103 diff.txt /*E103* E104 digraph.txt /*E104* E105 mbyte.txt /*E105* -E106 eval.txt /*E106* E107 eval.txt /*E107* E108 eval.txt /*E108* E109 eval.txt /*E109* @@ -3587,7 +3617,6 @@ E258 remote.txt /*E258* E259 if_cscop.txt /*E259* E26 rileft.txt /*E26* -E260 if_cscop.txt /*E260* E261 if_cscop.txt /*E261* E262 if_cscop.txt /*E262* E263 if_pyth.txt /*E263* @@ -3620,9 +3649,6 @@ E288 mbyte.txt /*E288* E289 mbyte.txt /*E289* E29 change.txt /*E29* -E290 mbyte.txt /*E290* -E291 mbyte.txt /*E291* -E292 mbyte.txt /*E292* E293 message.txt /*E293* E294 message.txt /*E294* E295 message.txt /*E295* @@ -3702,7 +3728,6 @@ E363 options.txt /*E363* E364 eval.txt /*E364* E365 print.txt /*E365* -E366 options.txt /*E366* E367 autocmd.txt /*E367* E368 eval.txt /*E368* E369 pattern.txt /*E369* @@ -3836,7 +3861,6 @@ E486 pattern.txt /*E486* E487 options.txt /*E487* E488 message.txt /*E488* -E489 intro.txt /*E489* E49 message.txt /*E49* E490 fold.txt /*E490* E492 message.txt /*E492* @@ -3919,7 +3943,6 @@ E562 if_cscop.txt /*E562* E563 if_cscop.txt /*E563* E564 if_cscop.txt /*E564* -E565 if_cscop.txt /*E565* E566 if_cscop.txt /*E566* E567 if_cscop.txt /*E567* E568 if_cscop.txt /*E568* @@ -3969,8 +3992,6 @@ E608 eval.txt /*E608* E609 if_cscop.txt /*E609* E61 pattern.txt /*E61* -E610 options.txt /*E610* -E611 options.txt /*E611* E612 sign.txt /*E612* E613 print.txt /*E613* E614 editing.txt /*E614* @@ -4219,10 +4240,49 @@ E835 options.txt /*E835* E836 if_pyth.txt /*E836* E837 if_pyth.txt /*E837* +E838 netbeans.txt /*E838* +E839 insert.txt /*E839* E84 windows.txt /*E84* +E840 insert.txt /*E840* +E841 map.txt /*E841* +E842 cmdline.txt /*E842* +E843 editing.txt /*E843* +E844 syntax.txt /*E844* +E845 spell.txt /*E845* +E846 options.txt /*E846* +E847 syntax.txt /*E847* +E848 syntax.txt /*E848* +E849 syntax.txt /*E849* E85 options.txt /*E85* +E850 change.txt /*E850* +E851 gui_x11.txt /*E851* +E852 gui_x11.txt /*E852* +E853 eval.txt /*E853* +E854 options.txt /*E854* +E855 autocmd.txt /*E855* +E858 eval.txt /*E858* +E859 eval.txt /*E859* E86 windows.txt /*E86* +E860 eval.txt /*E860* +E862 eval.txt /*E862* +E863 if_pyth.txt /*E863* +E864 pattern.txt /*E864* +E865 pattern.txt /*E865* +E866 pattern.txt /*E866* +E867 pattern.txt /*E867* +E868 pattern.txt /*E868* +E869 pattern.txt /*E869* E87 windows.txt /*E87* +E870 pattern.txt /*E870* +E871 pattern.txt /*E871* +E872 pattern.txt /*E872* +E873 pattern.txt /*E873* +E874 pattern.txt /*E874* +E875 pattern.txt /*E875* +E876 pattern.txt /*E876* +E877 pattern.txt /*E877* +E878 pattern.txt /*E878* +E879 syntax.txt /*E879* E88 windows.txt /*E88* E89 message.txt /*E89* E90 message.txt /*E90* @@ -4290,6 +4350,7 @@ Insert insert.txt /*Insert* Insert-mode insert.txt /*Insert-mode* InsertChange autocmd.txt /*InsertChange* +InsertCharPre autocmd.txt /*InsertCharPre* InsertEnter autocmd.txt /*InsertEnter* InsertLeave autocmd.txt /*InsertLeave* J change.txt /*J* @@ -4403,6 +4464,7 @@ QuickFixCmdPost-example quickfix.txt /*QuickFixCmdPost-example* QuickFixCmdPre autocmd.txt /*QuickFixCmdPre* Quickfix quickfix.txt /*Quickfix* +QuitPre autocmd.txt /*QuitPre* R change.txt /*R* RISC-OS os_risc.txt /*RISC-OS* RISCOS os_risc.txt /*RISCOS* @@ -4434,6 +4496,11 @@ T motion.txt /*T* TCL if_tcl.txt /*TCL* TERM starting.txt /*TERM* +TOhtml-encoding syntax.txt /*TOhtml-encoding* +TOhtml-encoding-detect syntax.txt /*TOhtml-encoding-detect* +TOhtml-performance syntax.txt /*TOhtml-performance* +TOhtml-uncopyable-text syntax.txt /*TOhtml-uncopyable-text* +TOhtml-wrap-text syntax.txt /*TOhtml-wrap-text* TSQL ft_sql.txt /*TSQL* TTpro-telnet syntax.txt /*TTpro-telnet* Tab intro.txt /*Tab* @@ -4442,6 +4509,8 @@ Tcl if_tcl.txt /*Tcl* TermChanged autocmd.txt /*TermChanged* TermResponse autocmd.txt /*TermResponse* +TextChanged autocmd.txt /*TextChanged* +TextChangedI autocmd.txt /*TextChangedI* Transact-SQL ft_sql.txt /*Transact-SQL* U undo.txt /*U* UTF-8 mbyte.txt /*UTF-8* @@ -4669,6 +4738,7 @@ alt-input debugger.txt /*alt-input* alternate-file editing.txt /*alternate-file* amiga-window starting.txt /*amiga-window* +and() eval.txt /*and()* anonymous-function eval.txt /*anonymous-function* ant.vim syntax.txt /*ant.vim* ap motion.txt /*ap* @@ -4723,6 +4793,7 @@ autocommand autocmd.txt /*autocommand* autocommand-events autocmd.txt /*autocommand-events* autocommand-pattern autocmd.txt /*autocommand-pattern* +autoformat change.txt /*autoformat* autoload eval.txt /*autoload* autoload-functions eval.txt /*autoload-functions* avoid-hit-enter version5.txt /*avoid-hit-enter* @@ -4730,7 +4801,8 @@ a{ motion.txt /*a{* a} motion.txt /*a}* b motion.txt /*b* -b:changedtick-variable eval.txt /*b:changedtick-variable* +b: eval.txt /*b:* +b:changedtick eval.txt /*b:changedtick* b:changelog_name filetype.txt /*b:changelog_name* b:current_syntax-variable syntax.txt /*b:current_syntax-variable* b:netrw_lastfile pi_netrw.txt /*b:netrw_lastfile* @@ -4771,6 +4843,7 @@ beval_lnum-variable eval.txt /*beval_lnum-variable* beval_text-variable eval.txt /*beval_text-variable* beval_winnr-variable eval.txt /*beval_winnr-variable* +bitwise-function usr_41.txt /*bitwise-function* blockwise-examples visual.txt /*blockwise-examples* blockwise-operators visual.txt /*blockwise-operators* blockwise-register change.txt /*blockwise-register* @@ -4852,6 +4925,8 @@ c_ cmdline.txt /*c_* c_ cmdline.txt /*c_* c_ cmdline.txt /*c_* +c_BS cmdline.txt /*c_BS* +c_CR cmdline.txt /*c_CR* c_CTRL-A cmdline.txt /*c_CTRL-A* c_CTRL-B cmdline.txt /*c_CTRL-B* c_CTRL-C cmdline.txt /*c_CTRL-C* @@ -4884,6 +4959,15 @@ c_CTRL-] cmdline.txt /*c_CTRL-]* c_CTRL-^ cmdline.txt /*c_CTRL-^* c_CTRL-_ cmdline.txt /*c_CTRL-_* +c_Del cmdline.txt /*c_Del* +c_Down cmdline.txt /*c_Down* +c_End cmdline.txt /*c_End* +c_Esc cmdline.txt /*c_Esc* +c_Home cmdline.txt /*c_Home* +c_Insert cmdline.txt /*c_Insert* +c_Left cmdline.txt /*c_Left* +c_Right cmdline.txt /*c_Right* +c_Up cmdline.txt /*c_Up* c_digraph cmdline.txt /*c_digraph* c_wildchar cmdline.txt /*c_wildchar* call() eval.txt /*call()* @@ -4934,12 +5018,55 @@ chill.vim syntax.txt /*chill.vim* cindent() eval.txt /*cindent()* cinkeys-format indent.txt /*cinkeys-format* +cino-# indent.txt /*cino-#* +cino-( indent.txt /*cino-(* +cino-) indent.txt /*cino-)* +cino-+ indent.txt /*cino-+* +cino-/ indent.txt /*cino-\/* +cino-: indent.txt /*cino-:* +cino-= indent.txt /*cino-=* +cino-> indent.txt /*cino->* +cino-C indent.txt /*cino-C* +cino-J indent.txt /*cino-J* +cino-L indent.txt /*cino-L* +cino-M indent.txt /*cino-M* +cino-N indent.txt /*cino-N* +cino-U indent.txt /*cino-U* +cino-W indent.txt /*cino-W* +cino-^ indent.txt /*cino-^* +cino-b indent.txt /*cino-b* +cino-c indent.txt /*cino-c* +cino-e indent.txt /*cino-e* +cino-f indent.txt /*cino-f* +cino-g indent.txt /*cino-g* +cino-h indent.txt /*cino-h* +cino-i indent.txt /*cino-i* +cino-j indent.txt /*cino-j* +cino-k indent.txt /*cino-k* +cino-l indent.txt /*cino-l* +cino-m indent.txt /*cino-m* +cino-n indent.txt /*cino-n* +cino-p indent.txt /*cino-p* +cino-star indent.txt /*cino-star* +cino-t indent.txt /*cino-t* +cino-u indent.txt /*cino-u* +cino-w indent.txt /*cino-w* +cino-{ indent.txt /*cino-{* +cino-} indent.txt /*cino-}* cinoptions-values indent.txt /*cinoptions-values* clear-undo undo.txt /*clear-undo* clearmatches() eval.txt /*clearmatches()* client-server remote.txt /*client-server* clientserver remote.txt /*clientserver* clipboard gui.txt /*clipboard* +clipboard-autoselect options.txt /*clipboard-autoselect* +clipboard-autoselectml options.txt /*clipboard-autoselectml* +clipboard-autoselectplus options.txt /*clipboard-autoselectplus* +clipboard-exclude options.txt /*clipboard-exclude* +clipboard-html options.txt /*clipboard-html* +clipboard-unnamed options.txt /*clipboard-unnamed* +clipboard-unnamedplus options.txt /*clipboard-unnamedplus* +clojure-indent indent.txt /*clojure-indent* cmdarg-variable eval.txt /*cmdarg-variable* cmdbang-variable eval.txt /*cmdbang-variable* cmdline-arguments vi_diff.txt /*cmdline-arguments* @@ -5038,6 +5165,7 @@ cpo-- options.txt /*cpo--* cpo-. options.txt /*cpo-.* cpo-/ options.txt /*cpo-\/* +cpo-; options.txt /*cpo-;* cpo-< options.txt /*cpo-<* cpo-> options.txt /*cpo->* cpo-A options.txt /*cpo-A* @@ -5087,6 +5215,7 @@ cpo-x options.txt /*cpo-x* cpo-y options.txt /*cpo-y* cpo-{ options.txt /*cpo-{* +cpp.vim syntax.txt /*cpp.vim* crash-recovery recover.txt /*crash-recovery* creating-menus gui.txt /*creating-menus* credits intro.txt /*credits* @@ -5107,6 +5236,7 @@ cscopepathcomp if_cscop.txt /*cscopepathcomp* cscopeprg if_cscop.txt /*cscopeprg* cscopequickfix if_cscop.txt /*cscopequickfix* +cscoperelative if_cscop.txt /*cscoperelative* cscopetag if_cscop.txt /*cscopetag* cscopetagorder if_cscop.txt /*cscopetagorder* cscopeverbose if_cscop.txt /*cscopeverbose* @@ -5114,6 +5244,7 @@ cspc if_cscop.txt /*cspc* csprg if_cscop.txt /*csprg* csqf if_cscop.txt /*csqf* +csre if_cscop.txt /*csre* cst if_cscop.txt /*cst* csto if_cscop.txt /*csto* csverb if_cscop.txt /*csverb* @@ -5197,6 +5328,7 @@ develop-spell-suggestions develop.txt /*develop-spell-suggestions* develop.txt develop.txt /*develop.txt* development develop.txt /*development* +dgn motion.txt /*dgn* dh change.txt /*dh* diB motion.txt /*diB* diW motion.txt /*diW* @@ -5220,6 +5352,7 @@ digraph-arg change.txt /*digraph-arg* digraph-encoding digraph.txt /*digraph-encoding* digraph-table digraph.txt /*digraph-table* +digraph-table-mbyte digraph.txt /*digraph-table-mbyte* digraph.txt digraph.txt /*digraph.txt* digraphs digraph.txt /*digraphs* digraphs-changed version6.txt /*digraphs-changed* @@ -5390,6 +5523,11 @@ expr-env-expand eval.txt /*expr-env-expand* expr-function eval.txt /*expr-function* expr-is eval.txt /*expr-is* +expr-is# eval.txt /*expr-is#* +expr-is? eval.txt /*expr-is?* +expr-isnot eval.txt /*expr-isnot* +expr-isnot# eval.txt /*expr-isnot#* +expr-isnot? eval.txt /*expr-isnot?* expr-nesting eval.txt /*expr-nesting* expr-number eval.txt /*expr-number* expr-option eval.txt /*expr-option* @@ -5551,8 +5689,10 @@ ft-changelog-plugin filetype.txt /*ft-changelog-plugin* ft-changelog-syntax syntax.txt /*ft-changelog-syntax* ft-chill-syntax syntax.txt /*ft-chill-syntax* +ft-clojure-indent indent.txt /*ft-clojure-indent* ft-cobol-syntax syntax.txt /*ft-cobol-syntax* ft-coldfusion-syntax syntax.txt /*ft-coldfusion-syntax* +ft-cpp-syntax syntax.txt /*ft-cpp-syntax* ft-csh-syntax syntax.txt /*ft-csh-syntax* ft-css-omni insert.txt /*ft-css-omni* ft-cweb-syntax syntax.txt /*ft-cweb-syntax* @@ -5623,8 +5763,10 @@ ft-python-indent indent.txt /*ft-python-indent* ft-python-syntax syntax.txt /*ft-python-syntax* ft-quake-syntax syntax.txt /*ft-quake-syntax* +ft-r-indent indent.txt /*ft-r-indent* ft-readline-syntax syntax.txt /*ft-readline-syntax* ft-rexx-syntax syntax.txt /*ft-rexx-syntax* +ft-rst-syntax syntax.txt /*ft-rst-syntax* ft-ruby-omni insert.txt /*ft-ruby-omni* ft-ruby-syntax syntax.txt /*ft-ruby-syntax* ft-scheme-syntax syntax.txt /*ft-scheme-syntax* @@ -5688,7 +5830,9 @@ g- undo.txt /*g-* g0 motion.txt /*g0* g8 various.txt /*g8* +g: eval.txt /*g:* g:NetrwTopLvlMenu pi_netrw.txt /*g:NetrwTopLvlMenu* +g:Netrw_corehandler pi_netrw.txt /*g:Netrw_corehandler* g:Netrw_funcref pi_netrw.txt /*g:Netrw_funcref* g:ada#Comment ft_ada.txt /*g:ada#Comment* g:ada#Ctags_Kinds ft_ada.txt /*g:ada#Ctags_Kinds* @@ -5712,12 +5856,20 @@ g:ada_standard_types ft_ada.txt /*g:ada_standard_types* g:ada_with_gnat_project_files ft_ada.txt /*g:ada_with_gnat_project_files* g:ada_withuse_ordinary ft_ada.txt /*g:ada_withuse_ordinary* +g:clojure_align_multiline_strings indent.txt /*g:clojure_align_multiline_strings* +g:clojure_fuzzy_indent indent.txt /*g:clojure_fuzzy_indent* +g:clojure_fuzzy_indent_blacklist indent.txt /*g:clojure_fuzzy_indent_blacklist* +g:clojure_fuzzy_indent_patterns indent.txt /*g:clojure_fuzzy_indent_patterns* +g:clojure_maxlines indent.txt /*g:clojure_maxlines* +g:clojure_special_indent_words indent.txt /*g:clojure_special_indent_words* g:colors_name options.txt /*g:colors_name* g:decada ft_ada.txt /*g:decada* g:decada.Error_Format ft_ada.txt /*g:decada.Error_Format* g:decada.Make() ft_ada.txt /*g:decada.Make()* g:decada.Make_Command ft_ada.txt /*g:decada.Make_Command* g:decada.Unit_Name() ft_ada.txt /*g:decada.Unit_Name()* +g:filetype_csh syntax.txt /*g:filetype_csh* +g:filetype_r syntax.txt /*g:filetype_r* g:gnat ft_ada.txt /*g:gnat* g:gnat.Error_Format ft_ada.txt /*g:gnat.Error_Format* g:gnat.Find() ft_ada.txt /*g:gnat.Find()* @@ -5730,9 +5882,31 @@ g:gnat.Set_Project_File() ft_ada.txt /*g:gnat.Set_Project_File()* g:gnat.Tags() ft_ada.txt /*g:gnat.Tags()* g:gnat.Tags_Command ft_ada.txt /*g:gnat.Tags_Command* +g:html_charset_override syntax.txt /*g:html_charset_override* +g:html_diff_one_file syntax.txt /*g:html_diff_one_file* +g:html_dynamic_folds syntax.txt /*g:html_dynamic_folds* +g:html_encoding_override syntax.txt /*g:html_encoding_override* +g:html_end_line syntax.txt /*g:html_end_line* +g:html_expand_tabs syntax.txt /*g:html_expand_tabs* +g:html_hover_unfold syntax.txt /*g:html_hover_unfold* +g:html_ignore_conceal syntax.txt /*g:html_ignore_conceal* +g:html_ignore_folding syntax.txt /*g:html_ignore_folding* +g:html_no_foldcolumn syntax.txt /*g:html_no_foldcolumn* +g:html_no_invalid syntax.txt /*g:html_no_invalid* +g:html_no_pre syntax.txt /*g:html_no_pre* +g:html_no_progress syntax.txt /*g:html_no_progress* +g:html_number_lines syntax.txt /*g:html_number_lines* +g:html_pre_wrap syntax.txt /*g:html_pre_wrap* +g:html_prevent_copy syntax.txt /*g:html_prevent_copy* +g:html_start_line syntax.txt /*g:html_start_line* +g:html_use_css syntax.txt /*g:html_use_css* +g:html_use_encoding syntax.txt /*g:html_use_encoding* +g:html_use_xhtml syntax.txt /*g:html_use_xhtml* +g:html_whole_filler syntax.txt /*g:html_whole_filler* g:netrw_alto pi_netrw.txt /*g:netrw_alto* g:netrw_altv pi_netrw.txt /*g:netrw_altv* g:netrw_banner pi_netrw.txt /*g:netrw_banner* +g:netrw_bannerbackslash pi_netrw.txt /*g:netrw_bannerbackslash* g:netrw_browse_split pi_netrw.txt /*g:netrw_browse_split* g:netrw_browsex_viewer pi_netrw.txt /*g:netrw_browsex_viewer* g:netrw_bufsettings pi_netrw.txt /*g:netrw_bufsettings* @@ -5740,10 +5914,13 @@ g:netrw_chgwin pi_netrw.txt /*g:netrw_chgwin* g:netrw_compress pi_netrw.txt /*g:netrw_compress* g:netrw_ctags pi_netrw.txt /*g:netrw_ctags* -g:netrw_cursorline pi_netrw.txt /*g:netrw_cursorline* +g:netrw_cursor pi_netrw.txt /*g:netrw_cursor* g:netrw_cygwin pi_netrw.txt /*g:netrw_cygwin* g:netrw_dav_cmd pi_netrw.txt /*g:netrw_dav_cmd* g:netrw_decompress pi_netrw.txt /*g:netrw_decompress* +g:netrw_dirhistmax pi_netrw.txt /*g:netrw_dirhistmax* +g:netrw_dynamic_maxfilenamelen pi_netrw.txt /*g:netrw_dynamic_maxfilenamelen* +g:netrw_errorlvl pi_netrw.txt /*g:netrw_errorlvl* g:netrw_fastbrowse pi_netrw.txt /*g:netrw_fastbrowse* g:netrw_fetch_cmd pi_netrw.txt /*g:netrw_fetch_cmd* g:netrw_fname_escape pi_netrw.txt /*g:netrw_fname_escape* @@ -5751,6 +5928,7 @@ g:netrw_ftp_browse_reject pi_netrw.txt /*g:netrw_ftp_browse_reject* g:netrw_ftp_cmd pi_netrw.txt /*g:netrw_ftp_cmd* g:netrw_ftp_list_cmd pi_netrw.txt /*g:netrw_ftp_list_cmd* +g:netrw_ftp_options pi_netrw.txt /*g:netrw_ftp_options* g:netrw_ftp_sizelist_cmd pi_netrw.txt /*g:netrw_ftp_sizelist_cmd* g:netrw_ftp_timelist_cmd pi_netrw.txt /*g:netrw_ftp_timelist_cmd* g:netrw_ftpextracmd pi_netrw.txt /*g:netrw_ftpextracmd* @@ -5765,17 +5943,19 @@ g:netrw_list_cmd pi_netrw.txt /*g:netrw_list_cmd* g:netrw_list_hide pi_netrw.txt /*g:netrw_list_hide* g:netrw_liststyle pi_netrw.txt /*g:netrw_liststyle* -g:netrw_local_mkdir pi_netrw.txt /*g:netrw_local_mkdir* -g:netrw_local_rmdir pi_netrw.txt /*g:netrw_local_rmdir* g:netrw_localcopycmd pi_netrw.txt /*g:netrw_localcopycmd* +g:netrw_localmkdir pi_netrw.txt /*g:netrw_localmkdir* g:netrw_localmovecmd pi_netrw.txt /*g:netrw_localmovecmd* +g:netrw_localrmdir pi_netrw.txt /*g:netrw_localrmdir* g:netrw_maxfilenamelen pi_netrw.txt /*g:netrw_maxfilenamelen* g:netrw_menu pi_netrw.txt /*g:netrw_menu* g:netrw_mkdir_cmd pi_netrw.txt /*g:netrw_mkdir_cmd* g:netrw_mousemaps pi_netrw.txt /*g:netrw_mousemaps* +g:netrw_nobeval pi_netrw.txt /*g:netrw_nobeval* g:netrw_nogx pi_netrw.txt /*g:netrw_nogx* g:netrw_preview pi_netrw.txt /*g:netrw_preview* g:netrw_rcp_cmd pi_netrw.txt /*g:netrw_rcp_cmd* +g:netrw_remote_mkdir pi_netrw.txt /*g:netrw_remote_mkdir* g:netrw_retmap pi_netrw.txt /*g:netrw_retmap* g:netrw_rm_cmd pi_netrw.txt /*g:netrw_rm_cmd* g:netrw_rmdir_cmd pi_netrw.txt /*g:netrw_rmdir_cmd* @@ -5803,6 +5983,8 @@ g:netrw_win95ftp pi_netrw.txt /*g:netrw_win95ftp* g:netrw_winsize pi_netrw.txt /*g:netrw_winsize* g:netrw_xstrlen pi_netrw.txt /*g:netrw_xstrlen* +g:sh_isk syntax.txt /*g:sh_isk* +g:sh_noisk syntax.txt /*g:sh_noisk* g:syntax_on syntax.txt /*g:syntax_on* g:tar_browseoptions pi_tar.txt /*g:tar_browseoptions* g:tar_cmd pi_tar.txt /*g:tar_cmd* @@ -5813,6 +5995,9 @@ g:tar_secure pi_tar.txt /*g:tar_secure* g:tar_writeoptions pi_tar.txt /*g:tar_writeoptions* g:tex_conceal syntax.txt /*g:tex_conceal* +g:tex_fast syntax.txt /*g:tex_fast* +g:tex_flavor filetype.txt /*g:tex_flavor* +g:tex_isk syntax.txt /*g:tex_isk* g:var eval.txt /*g:var* g:vimball_home pi_vimball.txt /*g:vimball_home* g:vimball_mkdir pi_vimball.txt /*g:vimball_mkdir* @@ -5843,6 +6028,7 @@ gH visual.txt /*gH* gI insert.txt /*gI* gJ change.txt /*gJ* +gN visual.txt /*gN* gP change.txt /*gP* gQ intro.txt /*gQ* gR change.txt /*gR* @@ -5863,6 +6049,7 @@ ga various.txt /*ga* garbagecollect() eval.txt /*garbagecollect()* gd pattern.txt /*gd* +gdb debug.txt /*gdb* ge motion.txt /*ge* get() eval.txt /*get()* get-ms-debuggers debug.txt /*get-ms-debuggers* @@ -5926,6 +6113,7 @@ glvs-plugins pi_getscript.txt /*glvs-plugins* glvs-usage pi_getscript.txt /*glvs-usage* gm motion.txt /*gm* +gn visual.txt /*gn* gnat#Insert_Tags_Header() ft_ada.txt /*gnat#Insert_Tags_Header()* gnat#New() ft_ada.txt /*gnat#New()* gnat-xref ft_ada.txt /*gnat-xref* @@ -5952,6 +6140,7 @@ gu change.txt /*gu* gugu change.txt /*gugu* gui gui.txt /*gui* +gui-IME gui.txt /*gui-IME* gui-clipboard gui_w32.txt /*gui-clipboard* gui-colors syntax.txt /*gui-colors* gui-extras gui.txt /*gui-extras* @@ -6009,6 +6198,7 @@ gui_w32.txt gui_w32.txt /*gui_w32.txt* gui_x11.txt gui_x11.txt /*gui_x11.txt* guifontwide_gtk2 options.txt /*guifontwide_gtk2* +guifontwide_win_mbyte options.txt /*guifontwide_win_mbyte* guioptions_a options.txt /*guioptions_a* guu change.txt /*guu* gv visual.txt /*gv* @@ -6031,6 +6221,7 @@ hangulin.txt hangulin.txt /*hangulin.txt* has() eval.txt /*has()* has-patch eval.txt /*has-patch* +has-python if_pyth.txt /*has-python* has_key() eval.txt /*has_key()* haskell.vim syntax.txt /*haskell.vim* haslocaldir() eval.txt /*haslocaldir()* @@ -6049,6 +6240,7 @@ helphelp helphelp.txt /*helphelp* helphelp.txt helphelp.txt /*helphelp.txt* hex-editing tips.txt /*hex-editing* +hex-number eval.txt /*hex-number* hidden-buffer windows.txt /*hidden-buffer* hidden-changed version5.txt /*hidden-changed* hidden-menus gui.txt /*hidden-menus* @@ -6090,6 +6282,7 @@ hl-CursorColumn syntax.txt /*hl-CursorColumn* hl-CursorIM syntax.txt /*hl-CursorIM* hl-CursorLine syntax.txt /*hl-CursorLine* +hl-CursorLineNr syntax.txt /*hl-CursorLineNr* hl-DiffAdd syntax.txt /*hl-DiffAdd* hl-DiffChange syntax.txt /*hl-DiffChange* hl-DiffDelete syntax.txt /*hl-DiffDelete* @@ -6159,6 +6352,7 @@ i< motion.txt /*i<* i> motion.txt /*i>* iB motion.txt /*iB* +iBus gui.txt /*iBus* iW motion.txt /*iW* i[ motion.txt /*i[* i] motion.txt /*i]* @@ -6354,6 +6548,7 @@ intro intro.txt /*intro* intro.txt intro.txt /*intro.txt* inverse syntax.txt /*inverse* +invert() eval.txt /*invert()* ip motion.txt /*ip* iquote motion.txt /*iquote* is motion.txt /*is* @@ -6405,6 +6600,7 @@ keys() eval.txt /*keys()* known-bugs todo.txt /*known-bugs* l motion.txt /*l* +l: eval.txt /*l:* l:var eval.txt /*l:var* lCursor mbyte.txt /*lCursor* lace.vim syntax.txt /*lace.vim* @@ -6414,6 +6610,13 @@ last-position-jump eval.txt /*last-position-jump* last_buffer_nr() eval.txt /*last_buffer_nr()* lc_time-variable eval.txt /*lc_time-variable* +lcs-conceal options.txt /*lcs-conceal* +lcs-eol options.txt /*lcs-eol* +lcs-extends options.txt /*lcs-extends* +lcs-nbsp options.txt /*lcs-nbsp* +lcs-precedes options.txt /*lcs-precedes* +lcs-tab options.txt /*lcs-tab* +lcs-trail options.txt /*lcs-trail* left-right-motions motion.txt /*left-right-motions* len() eval.txt /*len()* less various.txt /*less* @@ -6464,11 +6667,18 @@ lua if_lua.txt /*lua* lua-buffer if_lua.txt /*lua-buffer* lua-commands if_lua.txt /*lua-commands* +lua-dict if_lua.txt /*lua-dict* +lua-eval if_lua.txt /*lua-eval* +lua-list if_lua.txt /*lua-list* +lua-luaeval if_lua.txt /*lua-luaeval* lua-vim if_lua.txt /*lua-vim* lua-window if_lua.txt /*lua-window* lua.vim syntax.txt /*lua.vim* +luaeval() eval.txt /*luaeval()* m motion.txt /*m* m' motion.txt /*m'* +m< motion.txt /*m<* +m> motion.txt /*m>* m[ motion.txt /*m[* m] motion.txt /*m]* m` motion.txt /*m`* @@ -6525,6 +6735,7 @@ mapmode-v map.txt /*mapmode-v* mapmode-x map.txt /*mapmode-x* mapping map.txt /*mapping* +mapping-functions usr_41.txt /*mapping-functions* mark motion.txt /*mark* mark-functions usr_41.txt /*mark-functions* mark-motions motion.txt /*mark-motions* @@ -6636,6 +6847,7 @@ mzscheme-commands if_mzsch.txt /*mzscheme-commands* mzscheme-dynamic if_mzsch.txt /*mzscheme-dynamic* mzscheme-examples if_mzsch.txt /*mzscheme-examples* +mzscheme-funcref if_mzsch.txt /*mzscheme-funcref* mzscheme-mzeval if_mzsch.txt /*mzscheme-mzeval* mzscheme-sandbox if_mzsch.txt /*mzscheme-sandbox* mzscheme-threads if_mzsch.txt /*mzscheme-threads* @@ -6680,8 +6892,10 @@ netrw-P pi_netrw.txt /*netrw-P* netrw-R pi_netrw.txt /*netrw-R* netrw-S pi_netrw.txt /*netrw-S* -netrw-T pi_netrw.txt /*netrw-T* +netrw-Tb pi_netrw.txt /*netrw-Tb* +netrw-Th pi_netrw.txt /*netrw-Th* netrw-U pi_netrw.txt /*netrw-U* +netrw-X pi_netrw.txt /*netrw-X* netrw-a pi_netrw.txt /*netrw-a* netrw-activate pi_netrw.txt /*netrw-activate* netrw-bookmark pi_netrw.txt /*netrw-bookmark* @@ -6691,6 +6905,7 @@ netrw-browse-maps pi_netrw.txt /*netrw-browse-maps* netrw-browser pi_netrw.txt /*netrw-browser* netrw-browser-options pi_netrw.txt /*netrw-browser-options* +netrw-browser-settings pi_netrw.txt /*netrw-browser-settings* netrw-browser-var pi_netrw.txt /*netrw-browser-var* netrw-browsing pi_netrw.txt /*netrw-browsing* netrw-c pi_netrw.txt /*netrw-c* @@ -6700,6 +6915,7 @@ netrw-contents pi_netrw.txt /*netrw-contents* netrw-copyright pi_netrw.txt /*netrw-copyright* netrw-cr pi_netrw.txt /*netrw-cr* +netrw-createfile pi_netrw.txt /*netrw-createfile* netrw-credits pi_netrw.txt /*netrw-credits* netrw-ctrl-h pi_netrw.txt /*netrw-ctrl-h* netrw-ctrl-l pi_netrw.txt /*netrw-ctrl-l* @@ -6723,7 +6939,9 @@ netrw-ftp pi_netrw.txt /*netrw-ftp* netrw-ftype pi_netrw.txt /*netrw-ftype* netrw-gb pi_netrw.txt /*netrw-gb* +netrw-gd pi_netrw.txt /*netrw-gd* netrw-getftype pi_netrw.txt /*netrw-getftype* +netrw-gf pi_netrw.txt /*netrw-gf* netrw-gh pi_netrw.txt /*netrw-gh* netrw-gp pi_netrw.txt /*netrw-gp* netrw-gx pi_netrw.txt /*netrw-gx* @@ -6736,6 +6954,7 @@ netrw-horiz pi_netrw.txt /*netrw-horiz* netrw-i pi_netrw.txt /*netrw-i* netrw-incompatible pi_netrw.txt /*netrw-incompatible* +netrw-internal-variables pi_netrw.txt /*netrw-internal-variables* netrw-intro-browse pi_netrw.txt /*netrw-intro-browse* netrw-leftmouse pi_netrw.txt /*netrw-leftmouse* netrw-list pi_netrw.txt /*netrw-list* @@ -6743,6 +6962,7 @@ netrw-listhack pi_netrw.txt /*netrw-listhack* netrw-login pi_netrw.txt /*netrw-login* netrw-mB pi_netrw.txt /*netrw-mB* +netrw-mF pi_netrw.txt /*netrw-mF* netrw-mT pi_netrw.txt /*netrw-mT* netrw-mb pi_netrw.txt /*netrw-mb* netrw-mc pi_netrw.txt /*netrw-mc* @@ -6776,6 +6996,8 @@ netrw-p11 pi_netrw.txt /*netrw-p11* netrw-p12 pi_netrw.txt /*netrw-p12* netrw-p13 pi_netrw.txt /*netrw-p13* +netrw-p14 pi_netrw.txt /*netrw-p14* +netrw-p15 pi_netrw.txt /*netrw-p15* netrw-p2 pi_netrw.txt /*netrw-p2* netrw-p3 pi_netrw.txt /*netrw-p3* netrw-p4 pi_netrw.txt /*netrw-p4* @@ -6795,6 +7017,7 @@ netrw-pscp pi_netrw.txt /*netrw-pscp* netrw-psftp pi_netrw.txt /*netrw-psftp* netrw-putty pi_netrw.txt /*netrw-putty* +netrw-qF pi_netrw.txt /*netrw-qF* netrw-qb pi_netrw.txt /*netrw-qb* netrw-qf pi_netrw.txt /*netrw-qf* netrw-quickcom pi_netrw.txt /*netrw-quickcom* @@ -6811,8 +7034,10 @@ netrw-rightmouse pi_netrw.txt /*netrw-rightmouse* netrw-s pi_netrw.txt /*netrw-s* netrw-settings pi_netrw.txt /*netrw-settings* +netrw-settings-window pi_netrw.txt /*netrw-settings-window* netrw-sexplore pi_netrw.txt /*netrw-sexplore* netrw-sort pi_netrw.txt /*netrw-sort* +netrw-sort-sequence pi_netrw.txt /*netrw-sort-sequence* netrw-sortsequence pi_netrw.txt /*netrw-sortsequence* netrw-source pi_netrw.txt /*netrw-source* netrw-ssh-hack pi_netrw.txt /*netrw-ssh-hack* @@ -6824,6 +7049,7 @@ netrw-t pi_netrw.txt /*netrw-t* netrw-texplore pi_netrw.txt /*netrw-texplore* netrw-todo pi_netrw.txt /*netrw-todo* +netrw-trailingslash pi_netrw.txt /*netrw-trailingslash* netrw-transparent pi_netrw.txt /*netrw-transparent* netrw-u pi_netrw.txt /*netrw-u* netrw-updir pi_netrw.txt /*netrw-updir* @@ -6833,6 +7059,8 @@ netrw-var pi_netrw.txt /*netrw-var* netrw-variables pi_netrw.txt /*netrw-variables* netrw-vexplore pi_netrw.txt /*netrw-vexplore* +netrw-windows-netrc pi_netrw.txt /*netrw-windows-netrc* +netrw-windows-s pi_netrw.txt /*netrw-windows-s* netrw-write pi_netrw.txt /*netrw-write* netrw-x pi_netrw.txt /*netrw-x* netrw-xfer pi_netrw.txt /*netrw-xfer* @@ -6933,6 +7161,7 @@ notepad gui_w32.txt /*notepad* nr2char() eval.txt /*nr2char()* nroff.vim syntax.txt /*nroff.vim* +number_relativenumber options.txt /*number_relativenumber* numbered-function eval.txt /*numbered-function* o insert.txt /*o* o_CTRL-V motion.txt /*o_CTRL-V* @@ -6944,7 +7173,8 @@ obtaining-exted netbeans.txt /*obtaining-exted* ocaml.vim syntax.txt /*ocaml.vim* octal eval.txt /*octal* -octal-number options.txt /*octal-number* +octal-nrformats options.txt /*octal-nrformats* +octal-number eval.txt /*octal-number* oldfiles-variable eval.txt /*oldfiles-variable* ole-activation if_ole.txt /*ole-activation* ole-eval if_ole.txt /*ole-eval* @@ -6964,9 +7194,12 @@ option-backslash options.txt /*option-backslash* option-list quickref.txt /*option-list* option-summary options.txt /*option-summary* +option-window options.txt /*option-window* options options.txt /*options* options-changed version5.txt /*options-changed* options.txt options.txt /*options.txt* +optwin options.txt /*optwin* +or() eval.txt /*or()* oracle ft_sql.txt /*oracle* os2 os_os2.txt /*os2* os2ansi os_os2.txt /*os2ansi* @@ -7112,9 +7345,18 @@ pumvisible() eval.txt /*pumvisible()* put change.txt /*put* put-Visual-mode change.txt /*put-Visual-mode* +py3eval() eval.txt /*py3eval()* +pyeval() eval.txt /*pyeval()* python if_pyth.txt /*python* +python-.locked if_pyth.txt /*python-.locked* +python-Dictionary if_pyth.txt /*python-Dictionary* +python-Function if_pyth.txt /*python-Function* +python-List if_pyth.txt /*python-List* +python-bindeval if_pyth.txt /*python-bindeval* +python-bindeval-objects if_pyth.txt /*python-bindeval-objects* python-buffer if_pyth.txt /*python-buffer* python-buffers if_pyth.txt /*python-buffers* +python-chdir if_pyth.txt /*python-chdir* python-command if_pyth.txt /*python-command* python-commands if_pyth.txt /*python-commands* python-current if_pyth.txt /*python-current* @@ -7122,10 +7364,18 @@ python-error if_pyth.txt /*python-error* python-eval if_pyth.txt /*python-eval* python-examples if_pyth.txt /*python-examples* +python-fchdir if_pyth.txt /*python-fchdir* python-input if_pyth.txt /*python-input* +python-options if_pyth.txt /*python-options* python-output if_pyth.txt /*python-output* +python-pyeval if_pyth.txt /*python-pyeval* python-range if_pyth.txt /*python-range* +python-strwidth if_pyth.txt /*python-strwidth* +python-tabpage if_pyth.txt /*python-tabpage* +python-tabpages if_pyth.txt /*python-tabpages* +python-vars if_pyth.txt /*python-vars* python-vim if_pyth.txt /*python-vim* +python-vvars if_pyth.txt /*python-vvars* python-window if_pyth.txt /*python-window* python-windows if_pyth.txt /*python-windows* python.vim syntax.txt /*python.vim* @@ -7246,19 +7496,9 @@ rileft rileft.txt /*rileft* rileft.txt rileft.txt /*rileft.txt* riscos os_risc.txt /*riscos* -riscos-commandline os_risc.txt /*riscos-commandline* -riscos-filetypes os_risc.txt /*riscos-filetypes* -riscos-gui os_risc.txt /*riscos-gui* -riscos-interrupt os_risc.txt /*riscos-interrupt* -riscos-locations os_risc.txt /*riscos-locations* -riscos-memory os_risc.txt /*riscos-memory* -riscos-munging os_risc.txt /*riscos-munging* -riscos-porting os_risc.txt /*riscos-porting* -riscos-remote os_risc.txt /*riscos-remote* -riscos-shell os_risc.txt /*riscos-shell* -riscos-temp-files os_risc.txt /*riscos-temp-files* rot13 change.txt /*rot13* round() eval.txt /*round()* +rst.vim syntax.txt /*rst.vim* rsync pi_netrw.txt /*rsync* ruby if_ruby.txt /*ruby* ruby-buffer if_ruby.txt /*ruby-buffer* @@ -7310,6 +7550,8 @@ save-settings starting.txt /*save-settings* scheme.vim syntax.txt /*scheme.vim* scp pi_netrw.txt /*scp* +screencol() eval.txt /*screencol()* +screenrow() eval.txt /*screenrow()* script usr_41.txt /*script* script-here if_perl.txt /*script-here* script-local map.txt /*script-local* @@ -7374,12 +7616,17 @@ setwinvar() eval.txt /*setwinvar()* sftp pi_netrw.txt /*sftp* sgml.vim syntax.txt /*sgml.vim* +sgr-mouse options.txt /*sgr-mouse* +sh-awk syntax.txt /*sh-awk* +sh-embed syntax.txt /*sh-embed* sh.vim syntax.txt /*sh.vim* +sha256() eval.txt /*sha256()* shell-window tips.txt /*shell-window* shell_error-variable eval.txt /*shell_error-variable* shellescape() eval.txt /*shellescape()* shift intro.txt /*shift* shift-left-right change.txt /*shift-left-right* +shiftwidth() eval.txt /*shiftwidth()* short-name-changed version4.txt /*short-name-changed* showing-menus gui.txt /*showing-menus* sign-commands sign.txt /*sign-commands* @@ -7641,6 +7888,7 @@ system-vimrc starting.txt /*system-vimrc* s~ change.txt /*s~* t motion.txt /*t* +t: eval.txt /*t:* t:var eval.txt /*t:var* t_#2 term.txt /*t_#2* t_#4 term.txt /*t_#4* @@ -7785,6 +8033,7 @@ t_tp version4.txt /*t_tp* t_ts term.txt /*t_ts* t_ts_old version4.txt /*t_ts_old* +t_u7 term.txt /*t_u7* t_ue term.txt /*t_ue* t_undo version4.txt /*t_undo* t_us term.txt /*t_us* @@ -7955,6 +8204,7 @@ try-nesting eval.txt /*try-nesting* tutor usr_01.txt /*tutor* twice if_cscop.txt /*twice* +two-engines pattern.txt /*two-engines* type() eval.txt /*type()* type-mistakes tips.txt /*type-mistakes* typecorr-settings usr_41.txt /*typecorr-settings* @@ -7982,6 +8232,7 @@ unlisted-buffer windows.txt /*unlisted-buffer* up-down-motions motion.txt /*up-down-motions* uppercase change.txt /*uppercase* +urxvt-mouse options.txt /*urxvt-mouse* use-cpo-save usr_41.txt /*use-cpo-save* use-visual-cmds version4.txt /*use-visual-cmds* useful-mappings tips.txt /*useful-mappings* @@ -8034,6 +8285,7 @@ utf-8-typing mbyte.txt /*utf-8-typing* utf8 mbyte.txt /*utf8* v visual.txt /*v* +v: eval.txt /*v:* v:beval_bufnr eval.txt /*v:beval_bufnr* v:beval_col eval.txt /*v:beval_col* v:beval_lnum eval.txt /*v:beval_lnum* @@ -8089,6 +8341,7 @@ v:var eval.txt /*v:var* v:version eval.txt /*v:version* v:warningmsg eval.txt /*v:warningmsg* +v:windowid eval.txt /*v:windowid* v_! change.txt /*v_!* v_$ visual.txt /*v_$* v_: cmdline.txt /*v_:* @@ -8156,11 +8409,13 @@ v_g? change.txt /*v_g?* v_gF editing.txt /*v_gF* v_gJ change.txt /*v_gJ* +v_gN visual.txt /*v_gN* v_gV visual.txt /*v_gV* v_g] tagsrch.txt /*v_g]* v_g_CTRL-G editing.txt /*v_g_CTRL-G* v_g_CTRL-] tagsrch.txt /*v_g_CTRL-]* v_gf editing.txt /*v_gf* +v_gn visual.txt /*v_gn* v_gq change.txt /*v_gq* v_gv visual.txt /*v_gv* v_gw change.txt /*v_gw* @@ -8263,13 +8518,27 @@ vimdiff diff.txt /*vimdiff* vimfiles options.txt /*vimfiles* viminfo starting.txt /*viminfo* +viminfo-! options.txt /*viminfo-!* +viminfo-% options.txt /*viminfo-%* +viminfo-' options.txt /*viminfo-'* +viminfo-/ options.txt /*viminfo-\/* +viminfo-: options.txt /*viminfo-:* +viminfo-< options.txt /*viminfo-<* +viminfo-@ options.txt /*viminfo-@* +viminfo-c options.txt /*viminfo-c* viminfo-encoding starting.txt /*viminfo-encoding* viminfo-errors starting.txt /*viminfo-errors* +viminfo-f options.txt /*viminfo-f* viminfo-file starting.txt /*viminfo-file* viminfo-file-marks starting.txt /*viminfo-file-marks* viminfo-file-name starting.txt /*viminfo-file-name* +viminfo-h options.txt /*viminfo-h* +viminfo-n options.txt /*viminfo-n* +viminfo-quote options.txt /*viminfo-quote* +viminfo-r options.txt /*viminfo-r* viminfo-read starting.txt /*viminfo-read* viminfo-read-write starting.txt /*viminfo-read-write* +viminfo-s options.txt /*viminfo-s* viminfo-write starting.txt /*viminfo-write* vimrc starting.txt /*vimrc* vimrc-filetype usr_05.txt /*vimrc-filetype* @@ -8309,6 +8578,8 @@ vt100-function-keys term.txt /*vt100-function-keys* w motion.txt /*w* w32-clientserver remote.txt /*w32-clientserver* +w32-xpm-support gui_w32.txt /*w32-xpm-support* +w: eval.txt /*w:* w:current_syntax syntax.txt /*w:current_syntax* w:quickfix_title quickfix.txt /*w:quickfix_title* w:var eval.txt /*w:var* @@ -8317,6 +8588,7 @@ whitespace pattern.txt /*whitespace* wildcard editing.txt /*wildcard* wildcards editing.txt /*wildcards* +wildmenumode() eval.txt /*wildmenumode()* win16-!start gui_w16.txt /*win16-!start* win16-clipboard gui_w16.txt /*win16-clipboard* win16-colors gui_w16.txt /*win16-colors* @@ -8363,6 +8635,7 @@ window-size-functions usr_41.txt /*window-size-functions* window-tag windows.txt /*window-tag* window-variable eval.txt /*window-variable* +windowid-variable eval.txt /*windowid-variable* windows windows.txt /*windows* windows-3.1 os_win32.txt /*windows-3.1* windows-intro windows.txt /*windows-intro* @@ -8395,6 +8668,7 @@ write-filetype-plugin usr_41.txt /*write-filetype-plugin* write-library-script usr_41.txt /*write-library-script* write-local-help usr_41.txt /*write-local-help* +write-permissions editing.txt /*write-permissions* write-plugin usr_41.txt /*write-plugin* write-plugin-quickload usr_41.txt /*write-plugin-quickload* write-quit editing.txt /*write-quit* @@ -8417,6 +8691,7 @@ xml-folding syntax.txt /*xml-folding* xml-omni-datafile insert.txt /*xml-omni-datafile* xml.vim syntax.txt /*xml.vim* +xor() eval.txt /*xor()* xpm.vim syntax.txt /*xpm.vim* xterm-8-bit term.txt /*xterm-8-bit* xterm-8bit term.txt /*xterm-8bit* diff -Naur vim73.orig/runtime/doc/tagsrch.txt vim73/runtime/doc/tagsrch.txt --- vim73.orig/runtime/doc/tagsrch.txt 2010-08-15 12:23:22.000000000 +0000 +++ vim73/runtime/doc/tagsrch.txt 2013-06-07 17:07:09.865647170 +0000 @@ -1,4 +1,4 @@ -*tagsrch.txt* For Vim version 7.3. Last change: 2009 Feb 18 +*tagsrch.txt* For Vim version 7.3. Last change: 2011 Oct 28 VIM REFERENCE MANUAL by Bram Moolenaar @@ -115,7 +115,7 @@ The output of ":tags" looks like this: - # TO tag FROM line in file/line + # TO tag FROM line in file/text 1 1 main 1 harddisk2:text/vim/test > 2 2 FuncA 58 i = FuncA(10); 3 1 FuncC 357 harddisk2:text/vim/src/amiga.c @@ -135,7 +135,7 @@ deleting/inserting lines, unless this was done by another program (e.g. another instance of Vim). -For the current file, the "file/line" column shows the text at the position. +For the current file, the "file/text" column shows the text at the position. An indent is removed and a long line is truncated to fit in the window. You can jump to previously used tags with several commands. Some examples: @@ -164,9 +164,9 @@ deleted. This means that an old branch in the call graph is lost. After the commands explained above the tag stack will look like this: - # TO tag FROM line in file - 1 main 1 harddisk2:text/vim/test - 2 FuncB 59 harddisk2:text/vim/src/main.c + # TO tag FROM line in file/text + 1 1 main 1 harddisk2:text/vim/test + 2 1 FuncB 59 harddisk2:text/vim/src/main.c *E73* When you try to use the tag stack while it doesn't contain anything you will @@ -770,12 +770,12 @@ {not in Vi} *:dli* *:dlist* -:[range]dl[ist][!] [/]string[/] +:[range]dli[st][!] [/]string[/] Like "[D" and "]D", but search in [range] lines (default: whole file). See |:search-args| for [/] and [!]. {not in Vi} Note that ":dl" works like ":delete" with the "l" - flag. + register. *[_CTRL-D* [ CTRL-D Jump to the first macro definition that contains the diff -Naur vim73.orig/runtime/doc/term.txt vim73/runtime/doc/term.txt --- vim73.orig/runtime/doc/term.txt 2010-08-15 12:23:22.000000000 +0000 +++ vim73/runtime/doc/term.txt 2013-06-07 17:07:09.872313818 +0000 @@ -1,4 +1,4 @@ -*term.txt* For Vim version 7.3. Last change: 2009 Nov 05 +*term.txt* For Vim version 7.3. Last change: 2013 Mar 13 VIM REFERENCE MANUAL by Bram Moolenaar @@ -294,6 +294,8 @@ |termcap-cursor-shape| t_RV request terminal version string (for xterm) *t_RV* *'t_RV'* |xterm-8bit| |v:termresponse| |'ttymouse'| |xterm-codes| + t_u7 request cursor position (for xterm) *t_u7* *'t_u7'* + see |'ambiwidth'| KEY CODES Note: Use the <> form if possible @@ -326,7 +328,7 @@ t_k8 function key 8 ** *t_k8* *'t_k8'* t_k9 function key 9 ** *t_k9* *'t_k9'* t_k; function key 10 ** *t_k;* *'t_k;'* - t_F1 function key 11 ** *t_F1* *'t_F1'* + t_F1 function key 11 ** *t_F1* *'t_F1'* t_F2 function key 12 ** *t_F2* *'t_F2'* t_F3 function key 13 ** *t_F3* *'t_F3'* t_F4 function key 14 ** *t_F4* *'t_F4'* @@ -356,9 +358,9 @@ t_kI insert key *t_kI* *'t_kI'* t_kD delete key *t_kD* *'t_kD'* t_kb backspace key *t_kb* *'t_kb'* - t_kB back-tab (shift-tab) ** *t_kB* *'t_kB'* + t_kB back-tab (shift-tab) ** *t_kB* *'t_kB'* t_kh home key *t_kh* *'t_kh'* - t_#2 shifted home key ** *t_#2* *'t_#2'* + t_#2 shifted home key ** *t_#2* *'t_#2'* alternate home key ** t_@7 end key *t_@7* *'t_@7'* t_*7 shifted end key ** *t_star7* *'t_star7'* @@ -371,8 +373,8 @@ t_K5 keypad page-down key *t_K5* *'t_K5'* t_K6 keypad plus key ** *t_K6* *'t_K6'* t_K7 keypad minus key ** *t_K7* *'t_K7'* - t_K8 keypad divide ** *t_K8* *'t_K8'* - t_K9 keypad multiply ** *t_K9* *'t_K9'* + t_K8 keypad divide ** *t_K8* *'t_K8'* + t_K9 keypad multiply ** *t_K9* *'t_K9'* t_KA keypad enter key ** *t_KA* *'t_KA'* t_KB keypad decimal point ** *t_KB* *'t_KB'* t_KC keypad 0 ** *t_KC* *'t_KC'* @@ -665,6 +667,7 @@ *xterm-copy-paste* NOTE: In some (older) xterms, it's not possible to move the cursor past column 95. This is an xterm problem, not Vim's. Get a newer xterm |color-xterm|. +Now the limit is 223 columns. Copy/paste in xterm with (current mode NOT included in 'mouse'): 1. Press left mouse button on first letter of text, move mouse pointer to last diff -Naur vim73.orig/runtime/doc/todo.txt vim73/runtime/doc/todo.txt --- vim73.orig/runtime/doc/todo.txt 2010-08-15 12:23:22.000000000 +0000 +++ vim73/runtime/doc/todo.txt 2013-06-07 17:07:09.945646942 +0000 @@ -1,4 +1,4 @@ -*todo.txt* For Vim version 7.3. Last change: 2010 Aug 15 +*todo.txt* For Vim version 7.3. Last change: 2013 Jun 06 VIM REFERENCE MANUAL by Bram Moolenaar @@ -27,65 +27,759 @@ See |develop.txt| for development plans. You can vote for which items should be worked on, but only if you sponsor Vim development. See |sponsor|. +Issues can also be entered online: http://code.google.com/p/vim/issues/list +Updates will be forwarded to the vim_dev maillist. Issues entered there will +not be repeated below, unless there is extra information. + *known-bugs* -------------------- Known bugs and current work ----------------------- -":find e" completion, editing a file in the Vim source directory, 'path' set -to "./proto", does not shorten ./proto/eval.pro, probably because of -./proto/ex_eval.pro. +Make it possible to test the status line: add screenchar(col, row). +Use screen_getbytes(). +Could also add screenattr(col, row), but value is unpredictable. +Functions to read the actual contents of the screen, so that things like +conceal can be tested. (Nazri Ramliy, 2013 Feb 18) + +function() does not work like before. (lilydjwg, 2013 Jun 4) +I guess this is caused by patch 7.3.1058: +"Call of funcref does not succeed in other script." + +--- Python interface + +Python: ":py raw_input('prompt')" doesn't work. (Manu Hack) + +Win32: The Python interface only works with one version of Python, selected at +compile time. Can this be made to work with version 2.1 and 2.2 dynamically? + +Python: Be able to define a Python function that can be called directly from +Vim script. Requires converting the arguments and return value, like with +vim.bindeval(). + +Python SystemExit exception is not handled properly. Patch to catch the +exception and give an error. (Yasuhiro Matsumoto) +Does not work, tests fail. + +Python: crash in test 86 because of int/size_t mixup? (Jun Takimoto, 2013 Jun +6) + +Add a $VIMRUNTIME/python and $VIMRUNTIME/python3 directories? + +--- runtime files + +Alternate html indent file by Andy Wokula, script 2075. + +Syntax file for protocol buffers. (Feng Xiao, 2013 May 9) +Has an ugly copyright notice. +Add statement that it does not conflict with Vim license. + +Patch for JavaScript syntax. (Kevin Locke, 2013 May 9) +Claudio didn't respond yet. + +upstream_dat, usserver_log et al. syntax files. (Rob Owens, 2013 Jun 5) + +--- New regexp engine + +Does not work (yet) with NFA: +- \%u, \%x, \%o, \%d followed by a composing character + +Don't call nfa_regmatch() recursively if the "out" state is not going to be +added anyway. In run log: + > Not adding state 6 to list 4. char -971: NFA_SKIP + +Profiling: + ./vim -s ~/vim/test/alsa.vim + ./vim -s ~/vim/test/todo.vim + ./vim -s ~/vim/test/loop.vim + ./vim -s ~/vim/test/xml.vim + +More test files from the src/pkg/regexp/testdata directory in the Go repo. + +It's very slow compared to the old engine... +Performance tests: +- ~/vim/text/FeiqCfg.xml (file from Netjune) +- ~/vim/text/edl.svg (also XML) +- glts has five tests. (May 25) +- ~/vim/test/veryslow.js display last line (file from Daniel Fetchinson) +- ~/vim/test/slowsearch +- ~/vim/test/rgb.vim +- search for a.*e*exn in the vim executable. Go to last line to use + 'hlsearch'. +- Slow combination of folding and PHP syntax highlighting. Script to + reproduce it. Caused by "syntax sync fromstart" in combination with patch + 7.2.274. (Christian Brabandt, 2010 May 27) Generally, folding with + 'foldmethod' set to "syntax" is slow. Do profiling to find out why. +- It does not use any of the optimizations, such as required start pattern. +- When lists are empty in nfa_regmatch() and match is true, it keeps looping + without doing anything. + +BT engine: After \@> match and failing submatches are not cleared. +See test64. + +--- bug fixes + +:wviminfo does not write old history entries. (Roland Eggner, 2013 Jun 5) +Another message Jun 6. + +Patch to avoid wrong error message for 1.0[0]. (Yasuhiro Matsumoto, 2013 May +1) + +Patch for if_lua. (Luis Carvalho, 2012 Aug 26, update Aug 29, another Aug 30, +then Sep 1, reminder Oct 14) + +Patch for if_perl. (Ike Devolder, May 27) + +Patch to check if 'foldexpr' sets did_emsg. (Christian Brabandt, 2013 Mar 20) + +Patch for 'backupcopy' default behavior for symlinks on Windows. (David Pope, +2012 Mar 21, update Mar 31) +With fix for memory leak: Ken Takata, 2012 Aug 24 +Another update Sep 24. +Also patch from Joerg Bornemann, 2013 Apr 30. + +Undo problem: line not removed as expected when using setline() from Insert +mode. (Israel Chauca, 2010 May 13, more in second msg) +Break undo when CTRL-R = changes the text? Or save more lines? +Patch by Christian Brabandt, 2012 Nov 16. + +Do allow real tags above the !_TAG entries. Undo older patch. Issue 90. + +Matches might be highlighted correctly. Inefficient patch by Christian +Brabandt, 2013 Feb 26. + +Patch to use bold/italic fonts when 'guifontewide' is set. (Ken Takata, 2013 +Mar 31) + +Problem with winfixheight and resizing. (Yukihiro Nakadaira, 2011 Sep 17) +Patch Sep 18. + +Patch for IME problems. Remove hacking code for old IM. (Yukihiro Nakadaira, +2012 Jul 20) + +Patch to fix finding toolbar bitmaps. Issue 129. + +Combining characters are not used when executing a register with :@w. +(William Fugh, 2013 Apr 5, more info from Ben Fritz) +Patch by Christian Brabandt, 2013 Apr 6. Second one. + +MS-Windows ACL support doesn't work well. Patch from Ken Takata, 2012 Aug 29. +Update Aug 31. +Another patch for MingW, 2012 Dec 29. + +Bug in completion menu. (Olivier Teuliere, 2013 Feb 15) +Patch by Christian Brabandt, Feb 16. + +Issue 134: pasting in visual selection in empty buffer. +Patch by Christian Brabandt, 2013 May 22. + +Patch to fix "gn" on single character matches. (Christian Brabandt, 2013 Jun +2) + +'cursorline' is drawn incorrectly in diff mode. Patch by Christian Brabandt, +2012 Apr 2. + +When someone does a silly thing such as setting rows and columns to 65535, +handle the out-of-memory and set them to sane values? (jimmywang, 2013 May 17) + +InsertEnter doesn't prevent the cursor from moving when it goes to another +line. + +":diffoff" does not restore options from before starting diff mode. +Patch by Christian Brabandt, 2013 May 26. + +Can't use multi-byte fill character in custom status line. +Patch by Christian Wellenbrock, 2013 Jun 2. Update Jun 3 (second one). + +Patch to fix glob() and globpath() with escaped special characters. +(Adnan Zafar, 2013 Jun 2, tests Jun 3) + +--- slightly incompatible changes + +Patch to load ~/.vim/vimrc when ~/.vimrc isn't found. (Lech Lorens, 2013 Apr +13) + +It's probably a good idea to make a negative value for 'sts' use the value of +'sw'. Patch by So8res, Oct 3 2012 + +When a buffer-local mapping is used, but a global mapping starts with the same +characters, Vim currently waits for the next typed character to find out if +the global mapping matches. It is probably better to let the local mapping +win and not wait. (discussion with Andy Wokula, 2013 Jan 30) +Patch by Michael Henry, 2013 Jan 30, update Feb 15. + +Patch to store absolute path for cscope. (Christian Brabandt, 2013 May 31) + +---- Fixes to be included before 7.4 above, less important stuff below ---- + +Several syntax file match "^\s*" which may get underlined if that's in the +highlight group. Add a "\zs" after it? + +Go through more coverity reports. + +Discussion about canonicalization of Hebrew. (Ron Aaron, 2011 April 10) + +Checking runtime scripts: Thilo Six, 2012 Jun 6. + +GTK: problem with 'L' in 'guioptions' changing the window width. +(Aaron Cornelius, 2012 Feb 6) + +Javascript file where indent gets stuck on: GalaxyMaster, 2012 May 3. + +The CompleteDone autocommand needs some info passed to it: +- The word that was selected (empty if abandoned complete) +- Type of completion: tag, omnifunc, user func. + +Using ":call foo#d.f()" doesn't autoload the "foo.vim" file. +That is, calling a dictionary function on an autoloaded dict. +Works OK for echo, just not for ":call" and ":call call()". (Ted, 2011 Mar +17) +Patch by Christian Brabandt, 2013 Mar 23. +Not 100% sure this is the right solution. + +Win32: When a directory name contains an exclamation mark, completion doesn't +complete the contents of the directory. No escaping for the "!"? (Jan +Stocker, 2012 Jan 5) + +Patch to support expression argument to sort() instead of a function name. +Yasuhiro Matsumoto, 2013 May 31. +Or should we add a more general mechanism, like lambda functions? + +Problem caused by patch 7.3.638: window->open does not update window +correctly. Issue 91. + +Patch to fix that 'cedit' is recognized after :normal. (Christian Brabandt, +2013 Mar 19, later message) + +Patch to view coverage of the tests. (Nazri Ramliy, 2013 Feb 15) + +Patch to invert characters differently in GTK. (Yukihiro Nakadaira, 2013 May +5) + +Bug with 'cursorline' in diff mode. Line being scrolled into view gets +highlighted as the cursor line. (Alessandro Ivaldi, 2013 Jun 4) + +Patch to add the bufferlist() function. (Yegappan Lakshmanan, 2013 May 5) +May 17: with winlist() and tabpagelist(). +May 19: with local variables. +May 28: with options + +Patch to support 'u' in interactive substitute. (Christian Brabandt, 2012 Sep +28) With tests: Oct 9. + +Patch to allow setting w:quickfix_title via setqflist() and setloclist() +functions. (Christian Brabandt, 2013 May 8, update May 21) +Patch to add getlocstack() / setlocstack(). (Christian Brabandt, 2013 May 14) +Second one. Update May 22. + +Patch to make fold updates much faster. (Christian Brabandt, 2012 Dec) + +Patch for IME handling, adds 'imactivatefunc' and 'imstatusfunc' option. +(Yukihiro Nakadaira, 2012 Aug 16) +Patch to improve IME handling. (Yasuhiro Matsumoto, 2012 Jul 18) + +Issue 54: document behavior of -complete, also expands arg. + +- Add regex for 'paragraphs' and 'sections': 'parare' and 'sectre'. Combine + the two into a regex for searching. (Ned Konz) +Patch by Christian Brabandt, 2013 Apr 20, unfinished. + +Bug: findfile("any", "http://;") returns http://any. (Andrew Pimlott, 2013 May +7) Not sure if that can be fixed, but when using "file://" it should be +possible to check if the file exists. + +v:register is not directly reset to " after a delete command that specifies a +register. It is reset after the next command. (Steve Vermeulen, 2013 Mar 16) + +'ff' is wrong for one-line file without EOL. (Issue 77) -Problem with \NL in Ex script. (Ray Frish, 2010 Aug 10) +Patch to set antialiasing style on Windows. (Ondrej Balaz, 2013 Mar 14) +Needs a different check for CLEARTYPE_QUALITY. + +Issue 72: 'autochdir' causes problems for :vimgrep. + +In the ATTENTION message about an existing swap file, mention the name of the +process that is running. It might actually be some other program, e.g. after +a reboot. + +MS-Windows: Crash opening very long file name starting with "\\". +(Christian Brock, 2012 Jun 29) + +patch to add "combine" flag to syntax commands. (so8res, 2012 Dec 6) + +Syntax update problem in one buffer opened in two windows, bottom window is +not correctly updated. (Paul Harris, 2012 Feb 27) + +Patch to add assignments in cscope. (Uli Meis, Estabrooks, 2012 Sep 1) +Alternate patch by Gary Johnson, Sep 4. + +Patch to add getsid(). (Tyru, 2011 Oct 2) Do we want this? Update Oct 4. +Or use expand('')? + +Patch to make confirm() display colors. (Christian Brabandt, 2012 Nov 9) + +Patch to add functions for signs. (Christian Brabandt, 2013 Jan 27) + +Patch to use directX to draw text on Windows. Adds the 'renderoptions' +option. (Taro Muraoka, 2013 Jan 25, update 2013 Apr 3, May 14) + +Patch to add 'completeselect' option. Specifies how to select a candidate in +insert completion. (Shougo, 2013 May 29) +Update to add to existing 'completeopt'. 2013 May 30 + +Problem with refresh:always in completion. (Tyler Wade, 2013 Mar 17) + +b:undo_ftplugin cannot call a script-local function. (Boris Danilov, 2013 Jan +7) + +Patch for :tabcloseleft, after closing a tab go to left tab. (William Bowers, +2012 Aug 4) + +Patch to improve equivalence classes in regexp patterns. +(Christian Brabandt, 2013 Jan 16, update Jan 17) + +Patch with suggestions for starting.txt. (Tony Mechelynck, 2012 Oct 24) +But use Gnome instead of GTK? + +Patch to make FocusGained and FocusLost work in modern terminals. (Hayaki +Saito, 2013 Apr 24) + +Should be possible to enable/disable matchparen per window or buffer. +Add a check for b:no_match_paren in Highlight_matching_Pair() (Marcin +Szamotulski, 2012 Nov 8) + +Crash in autocmd that unloads buffers in a BufUnload event. (Andrew Pimlott, +2012 Aug 11) Disallow :new when BufUnload is being handled? + +Patch to add ":ldo" and ":cdo", execute commands over quickfix list and +location list. (Yegappan Lakshmanan, 2013 Jun 2) + +MS-Windows resizing problems: +- Windows window on screen positioning: Patch by Yukihiro Nakadaira, 2012 Jun + 20. Uses getWindowRect() instead of GetWindowPlacement() +- Win32: When the taskbar is at the top of the screen creating the tabbar + causes the window to move unnecessarily. (William E. Skeith III, 2012 Jan + 12) Patch: 2012 Jan 13 Needs more work (2012 Feb 2) + +'iminsert' global value set when using ":setlocal iminsert"? (Wu, 2012 Jun 23) + +Patch to append regexp to tag commands to make it possible to select one out +of many matches. (Cody Cutler, 2013 Mar 28) + +Help for 'b:undo_indent'. (Thilo Six, 2012 May 28) +Also question if examples are correct. + +It should be possible to make globpath() return a list instead of a string, +like with glob(). (Greg Novack, 2012 Nov 2) + +The input map for CTRL-O in mswin.vim causes problems after CTRL-X CTRL-O. +Suggestion for another map. (Philip Mat, 2012 Jun 18) +But use "gi" instead of "a". Or use CTRL-\ CTRL-O. + +Patch to support user name completion on MS-Windows. (Yasuhiro Matsumoto, 2012 +Aug 16) + +Have an option for spell checking to not mark any Chinese, Japanese or other +double-width characters as error. Or perhaps all characters above 256. +(Bill Sun) Helps a lot for mixed Asian and latin text. + +When there are no command line arguments ":next" and ":argu" give E163, which +is confusing. Should say "the argument list is empty". + +URXVT: +- will get stuck if byte sequence does not contain the expected semicolon. +- Use urxvt mouse support also in xterm. Explanations: + http://www.midnight-commander.org/ticket/2662 + +MS-Windows: test 17 fails. Analysis by Michael Soyka, 2012 Nov 5. + +Patch to add tests for if_xcmdsrv.c., Jul 8, need some more work. (Brian Burns) +New tests Jul 13. Update Jul 17. Discussion Jul 18. + +When running Vim in silent ex mode, an existing swapfile causes Vim to wait +for a user action without a prompt. (Maarten Billemont, 2012 Feb 3) +Do give the prompt? Quit with an error? + +Patch to list user digraphs. (Christian Brabandt, 2012 Apr 14) + +Patch for input method status. (Hirohito Higashi, 2012 Apr 18) + +Patch to use .png icons for the toolbar on MS-Windows. (Martin Gieseking, 2013 +Apr 18) + +Patch for has('unnamedplus') docs. (Tony Mechelynck, 2011 Sep 27) +And one for gui_x11.txt. + +- Patch for 'breakindent' option: repeat indent for wrapped line. (Vaclav + Smilauer, 2004 Sep 13, fix Oct 31, update 2007 May 30) + Version for latest MacVim: Tobia Conforto, 2009 Nov 23 + More recent version: https://retracile.net/wiki/VimBreakIndent + Posted to vim-dev by Taylor Hedberg, 2011 Nov 25 + Update by Taylor Hedberg, 2013 May 30. + +":cd" doesn't work when current directory path contains "**". +finddir() has the same problem. (Yukihiro Nakadaira, 2012 Jan 10) +Requires a rewrite of the file_file_in_path code. + +Problem with l: dictionary being locked in a function. (ZyX, 2011 Jul 21) + +Should use has("browsefilter") in ftplugins. Requires patch 7.3.593. + +Update for vim2html.pl. (Tyru, 2013 Feb 22) + +Issue 48: foldopen error can't be caught by try/catch + +Patch to sort functions starting with '<' after others. Omit dict functions, +they can't be called. (Yasuhiro Matsumoto, 2011 Oct 11) + +Patch to pass list to or(), and() and xor(). (Yasuhiro Matsumoto, 2012 Feb 8) + +Patch to improve "it" and "at" text object matching. (Christian Brabandt, 2011 +Nov 20) + +Patch to improve GUI find/replace dialog. (Christian Brabandt, 2012 May 26) +Update Jun 2. + +`] moves to character after insert, instead of the last inserted character. +(Yukihiro Nakadaira, 2011 Dec 9) + +Plugin for Modeleasy. (Massimiliano Tripoli, 2011 Nov 29) + +BufWinLeave triggers too late when quitting last window in a tab page. (Lech +Lorens, 2012 Feb 21) + +Patch for 'transparency' option. (Sergiu Dotenco, 2011 Sep 17) +Only for MS-Windows. No documentation. Do we want this? + +Patch to support cursor shape in Cygwin console. (Ben bgold, 2011 Dec 27) + +Patch to support UTF-8 for Hangul. (Shawn Y.H. Kim, 2011 May 1) +Needs more work. Pinged 2012 Jan 4. + +Issue 64: when 'incsearch' is on can't paste LF on command line. + +On MS-Windows a temp dir with a & init causes system() to fail. (Ben Fritz, +2012 Jun 19) + +'cursorline' is displayed too short when there are concealed characters and +'list' is set. (Dennis Preiser) +Patch 7.3.116 was the wrong solution. +Christian Brabandt has another incomplete patch. (2011 Jul 13) + +With concealed text mouse click doesn't put the cursor in the right position. +(Herb Sitz) Fix by Christian Brabandt, 2011 Jun 16. Doesn't work properly, +need to make the change in where RET_WIN_BUF_CHARTABSIZE() is called. + +Syntax region with 'concealends' and a 'cchar' value, 'conceallevel' set to 2, +only one of the two ends gets the cchar displayed. (Brett Stahlman, 2010 Aug +21, Ben Fritz, 2010 Sep 14) + +'cursorline' works on a text line only. Add 'cursorscreenline' for +highlighting the screen line. (Christian Brabandt, 2012 Mar 31) + +Win32: Patch to use task dialogs when available. (Sergiu Dotenco, 2011 Sep 17) +New feature, requires testing. Made some remarks. + +Win32: Patch for alpha-blended icons and toolbar height. (Sergiu Dotenco, 2011 +Sep 17) Asked for feedback from others. + +Win32: Cannot cd into a directory that starts with a space. (Andy Wokula, 2012 +Jan 19) + +Win32: default for 'backupcopy' is wrong for a symbolic link. (mklink one +two). (Benjamin Fritz, 2012 Mar 15) + +Need to escape $HOME on Windows? (ZyX, 2011 Jul 21) + +"2" in 'formatopions' not working in comments. (Christian Corneliussen, 2011 +Oct 26) + +Bug in repeating Visual "u". (Lawrence Kesteloot, 2010 Dec 20) + +Using "p" in Visual mode while specifying the small delete register "- +overwrites the register before it is put. (Marcin Szamotulski, 2012 Nov 23) + +With "unamedplus" in 'clipboard' pasting in Visual mode causes error for empty +register. (Michael Seiwald, 2011 Jun 28) I can't reproduce it. + +In GTK Gvim, setting 'lines' and 'columns' to 99999 causes a crash (Tony +Mechelynck, 2011 Apr 25). Can reproduce the crash sometimes: + gvim -N -u NONE --cmd 'set lines=99999 columns=99999' +(gvim:25968): Gdk-WARNING **: Native Windows wider or taller than 65535 pixels are not supported +The program 'gvim' received an X Window System error. +This probably reflects a bug in the program. +The error was 'RenderBadPicture (invalid Picture parameter)'. + (Details: serial 313 error_code 161 request_code 149 minor_code 8) + (Note to programmers: normally, X errors are reported asynchronously; + that is, you will receive the error a while after causing it. + To debug your program, run it with the --sync command line + option to change this behavior. You can then get a meaningful + backtrace from your debugger if you break on the gdk_x_error() function.) +Check that number of pixels doesn't go above 65535? + +Windows keys not set properly on Windows 7? (cncyber, 2010 Aug 26) + +When using a Vim server, a # in the path causes an error message. +(Jeff Lanzarotta, 2011 Feb 17) + +Setting $HOME on MS-Windows is not very well documented. Suggestion by Ben +Fritz (2011 Oct 27). Bug: E685 error for func_unref(). (ZyX, 2010 Aug 5) -CTRL-] on help tag |/[\n]| doesn't jump to the right place. (Tony Mechelynck, -2010 Aug 8) +Bug: Windows 7 64 bit system freezes when 'clipboard' set to "unnamed" and +doing ":g/test/d". Putting every delete on the clipboard? (Robert Chan, 2011 +Jun 17) + +When there is a ">" in a line that "gq" wraps to the start of the next line, +then the following line will pick it up as a leader. Should get the leader +from the first line, not a wrapped line. (Matt Ackeret, 2012 Feb 27) + +Using ":break" or something else that stops executing commands inside a +":finally" does not rethrow a previously uncaught exception. (ZyX, 2010 Oct +15) + +Vim using lots of memory when joining lines. (John Little, 2010 Dec 3) + +Changes to manpage plugin. (Elias Toivanen, 2011 Jul 25) + +Patch to make "z=" work when 'spell' is off. Does this have nasty side +effects? (Christian Brabandt, 2012 Aug 5) +Would also need to do this for spellbadword() and spellsuggest(). + +Patch for variable tabstops. + +On 64 bit MS-Windows "long" is only 32 bits, but we sometimes need to store a +64 bits value. Change all number options to use nropt_T and define it to the +right type. + +string() can't parse back "inf" and "nan". Fix documentation or fix code? +(ZyX, 2010 Aug 23) + +Make 'formatprg' global-local. (Sung Pae) + +When doing "redir => s:foo" in a script and then "redir END" somewhere else +(e.g. in a function) it can't find s:foo. + +When setqflist() uses a filename that triggers a BufReadCmd autocommand Vim +doesn't jump to the correct line with :cfirst. (ZyX, 2011 Sep 18) + +7 Make "ga" show the digraph for a character, if it exists. +Patch from Christian Brabandt, 2011 Aug 19. -":command Print echo 'print'" works, but ":Print" doesn't. Builtin Print -should be overruled. (Aaron Thoma) +maparg() does not show the " - \]) + \ "}" + \ ]) +endif + +" insert javascript to get IDs from line numbers, and to open a fold before +" jumping to any lines contained therein +call extend(s:lines, [ + \ "", + \ "/* function to open any folds containing a jumped-to line before jumping to it */", + \ "function JumpToLine()", + \ "{", + \ " var lineNum;", + \ " lineNum = window.location.hash;", + \ " lineNum = lineNum.substr(1); /* strip off '#' */", + \ "", + \ " if (lineNum.indexOf('L') == -1) {", + \ " lineNum = 'L'+lineNum;", + \ " }", + \ " lineElem = document.getElementById(lineNum);" + \ ]) +if s:settings.dynamic_folds + call extend(s:lines, [ + \ "", + \ " /* navigate upwards in the DOM tree to open all folds containing the line */", + \ " var node = lineElem;", + \ " while (node && node.id != 'vimCodeElement')", + \ " {", + \ " if (node.className == 'closed-fold')", + \ " {", + \ " node.className = 'open-fold';", + \ " }", + \ " node = node.parentNode;", + \ " }", + \ ]) +endif +call extend(s:lines, [ + \ " /* Always jump to new location even if the line was hidden inside a fold, or", + \ " * we corrected the raw number to a line ID.", + \ " */", + \ " if (lineElem) {", + \ " lineElem.scrollIntoView(true);", + \ " }", + \ " return true;", + \ "}", + \ "if ('onhashchange' in window) {", + \ " window.onhashchange = JumpToLine;", + \ "}" + \ ]) + +" Small text columns like the foldcolumn and line number column need a weird +" hack to work around Webkit's and (in versions prior to 9) IE's lack of support +" for the 'ch' unit without messing up Opera, which also doesn't support it but +" works anyway. +" +" The problem is that without the 'ch' unit, it is not possible to specify a +" size of an in terms of character widths. Only Opera seems to do the +" "sensible" thing and make the sized to fit exactly as many characters +" as specified by its "size" attribute, but the spec actually says "at least +" wide enough to fit 'size' characters", so the other browsers are technically +" correct as well. +" +" Anyway, this leads to two diffculties: +" 1. The foldcolumn is made up of multiple elements side-by-side with +" different sizes, each of which has their own extra padding added. Thus, a +" column made up of one item of size 1 and another of size 2 would not +" necessarily be equal in size to another line's foldcolumn with a single +" item of size 3. +" 2. The extra padding added to the elements adds up to make the +" foldcolumn and line number column too wide, especially in Webkit +" browsers. +" +" So, the full workaround is: +" 1. Define a default size in em, equal to the number of characters in the +" input element, in case javascript is disabled and the browser does not +" support the 'ch' unit. Unfortunately this makes Opera no longer work +" properly without javascript. 1em per character is much too wide but it +" looks better in webkit browsers than unaligned columns. +" 2. Insert the following javascript to run at page load, which checks for the +" width of a single character (in an extraneous page element inserted +" before the page title, and set to hidden) and compares it to the width of +" another extra element with only one character. If the width +" matches, the script does nothing more, but if not, it will figure out the +" fraction of an em unit which would correspond with a ch unit if there +" were one, and set the containing element (
 or 
) to a class with +" pre-defined rules which is closest to that fraction of an em. Rules are +" defined from 0.05 em to 1em per ch. +if !empty(s:settings.prevent_copy) + call extend(s:lines, [ + \ '', + \ '/* simulate a "ch" unit by asking the browser how big a zero character is */', + \ 'function FixCharWidth() {', + \ ' /* get the hidden element which gives the width of a single character */', + \ ' var goodWidth = document.getElementById("oneCharWidth").clientWidth;', + \ ' /* get all input elements, we''ll filter on class later */', + \ ' var inputTags = document.getElementsByTagName("input");', + \ ' var ratio = 5;', + \ ' var inputWidth = document.getElementById("oneInputWidth").clientWidth;', + \ ' var emWidth = document.getElementById("oneEmWidth").clientWidth;', + \ ' if (inputWidth > goodWidth) {', + \ ' while (ratio < 100*goodWidth/emWidth && ratio < 100) {', + \ ' ratio += 5;', + \ ' }', + \ ' document.getElementById("vimCodeElement").className = "em"+ratio;', + \ ' }', + \ '}' + \ ]) endif +" insert script closing tag +call extend(s:lines, [ + \ '', + \ s:settings.use_xhtml ? '//]]>' : '-->', + \ "" + \ ]) + +call extend(s:lines, [""]) +if !empty(s:settings.prevent_copy) + call extend(s:lines, + \ ["", + \ "", + \ "
0
", + \ "
", + \ "
" + \ ]) +else + call extend(s:lines, [""]) +endif if s:settings.no_pre - call extend(s:lines, ["", ""]) + " if we're not using CSS we use a font tag which can't have a div inside + if s:settings.use_css + call extend(s:lines, ["
"]) + endif else - call extend(s:lines, ["", "", "
"])
+  call extend(s:lines, ["
"])
 endif
 
 exe s:orgwin . "wincmd w"
 
-" List of all id's
-let s:idlist = []
+" caches of style data
+" initialize to include line numbers if using them
+if s:settings.number_lines
+  let s:stylelist = { s:LINENR_ID : ".LineNr { " . s:CSS1( s:LINENR_ID ) . "}" }
+else
+  let s:stylelist = {}
+endif
+let s:diffstylelist = {
+      \   s:DIFF_A_ID : ".DiffAdd { " . s:CSS1( s:DIFF_A_ID ) . "}",
+      \   s:DIFF_C_ID : ".DiffChange { " . s:CSS1( s:DIFF_C_ID ) . "}",
+      \   s:DIFF_D_ID : ".DiffDelete { " . s:CSS1( s:DIFF_D_ID ) . "}",
+      \   s:DIFF_T_ID : ".DiffText { " . s:CSS1( s:DIFF_T_ID ) . "}"
+      \ }
 
 " set up progress bar in the status line
 if !s:settings.no_progress
@@ -545,9 +1095,6 @@
       " level, so subtract 2 from index of first non-dash after the dashes
       " in order to get the fold level of the current fold
       let s:level = match(foldtextresult(s:lnum), '+-*\zs[^-]') - 2
-      if s:level+1 > s:foldcolumn
-	let s:foldcolumn = s:level+1
-      endif
       " store fold info for later use
       let s:newfold = {'firstline': s:lnum, 'lastline': foldclosedend(s:lnum), 'level': s:level,'type': "closed-fold"}
       call add(s:allfolds, s:newfold)
@@ -577,9 +1124,6 @@
       " level, so subtract 2 from index of first non-dash after the dashes
       " in order to get the fold level of the current fold
       let s:level = match(foldtextresult(s:lnum), '+-*\zs[^-]') - 2
-      if s:level+1 > s:foldcolumn
-	let s:foldcolumn = s:level+1
-      endif
       let s:newfold = {'firstline': s:lnum, 'lastline': foldclosedend(s:lnum), 'level': s:level,'type': "closed-fold"}
       " only add the fold if we don't already have it
       if empty(s:allfolds) || index(s:allfolds, s:newfold) == -1
@@ -609,6 +1153,74 @@
 
   " close all folds again so we can get the fold text as we go
   silent! %foldclose!
+
+  " Go through and remove folds we don't need to (or cannot) process in the
+  " current conversion range
+  "
+  " If a fold is removed which contains other folds, which are included, we need
+  " to adjust the level of the included folds as used by the conversion logic
+  " (avoiding special cases is good)
+  "
+  " Note any time we remove a fold, either all of the included folds are in it,
+  " or none of them, because we only remove a fold if neither its start nor its
+  " end are within the conversion range.
+  let leveladjust = 0
+  for afold in s:allfolds
+    let removed = 0
+    if exists("g:html_start_line") && exists("g:html_end_line")
+      if afold.firstline < g:html_start_line
+	if afold.lastline <= g:html_end_line && afold.lastline >= g:html_start_line
+	  " if a fold starts before the range to convert but stops within the
+	  " range, we need to include it. Make it start on the first converted
+	  " line.
+	  let afold.firstline = g:html_start_line
+	else
+	  " if the fold lies outside the range or the start and stop enclose
+	  " the entire range, don't bother parsing it
+	  call remove(s:allfolds, index(s:allfolds, afold))
+	  let removed = 1
+	  if afold.lastline > g:html_end_line
+	    let leveladjust += 1
+	  endif
+	endif
+      elseif afold.firstline > g:html_end_line
+	" If the entire fold lies outside the range we need to remove it.
+	call remove(s:allfolds, index(s:allfolds, afold))
+	let removed = 1
+      endif
+    elseif exists("g:html_start_line")
+      if afold.firstline < g:html_start_line
+	" if there is no last line, but there is a first line, the end of the
+	" fold will always lie within the region of interest, so keep it
+	let afold.firstline = g:html_start_line
+      endif
+    elseif exists("g:html_end_line")
+      " if there is no first line we default to the first line in the buffer so
+      " the fold start will always be included if the fold itself is included.
+      " If however the entire fold lies outside the range we need to remove it.
+      if afold.firstline > g:html_end_line
+	call remove(s:allfolds, index(s:allfolds, afold))
+	let removed = 1
+      endif
+    endif
+    if !removed
+      let afold.level -= leveladjust
+      if afold.level+1 > s:foldcolumn
+	let s:foldcolumn = afold.level+1
+      endif
+    endif
+  endfor
+
+  " if we've removed folds containing the conversion range from processing,
+  " getting foldtext as we go won't know to open the removed folds, so the
+  " foldtext would be wrong; open them now.
+  "
+  " Note that only when a start and an end line is specified will a fold
+  " containing the current range ever be removed.
+  while leveladjust > 0
+    exe g:html_start_line."foldopen"
+    let leveladjust -= 1
+  endwhile
 endif
 
 " Now loop over all lines in the original text to convert to html.
@@ -656,6 +1268,13 @@
 
 let s:foldId = 0
 
+if !s:settings.expand_tabs
+  " If keeping tabs, add them to printable characters so we keep them when
+  " formatting text (strtrans() doesn't replace printable chars)
+  let s:old_isprint = &isprint
+  setlocal isprint+=9
+endif
+
 while s:lnum <= s:end
 
   " If there are filler lines for diff mode, show these above the line.
@@ -672,15 +1291,22 @@
 
       if !s:settings.no_pre
 	" HTML line wrapping is off--go ahead and fill to the margin
+	" TODO: what about when CSS wrapping is turned on?
 	let s:new = s:new . repeat(s:difffillchar, &columns - strlen(s:new) - s:margin)
       else
 	let s:new = s:new . repeat(s:difffillchar, 3)
       endif
 
-      let s:new = s:HtmlFormat(s:new, "DiffDelete", "")
+      let s:new = s:HtmlFormat_d(s:new, s:DIFF_D_ID, 0)
       if s:settings.number_lines
-	" Indent if line numbering is on; must be after escaping.
-	let s:new = repeat(s:LeadingSpace, s:margin) . s:new
+	" Indent if line numbering is on. Indent gets style of line number
+	" column.
+	let s:new = s:HtmlFormat_n(repeat(' ', s:margin), s:LINENR_ID, 0, 0) . s:new
+      endif
+      if s:settings.dynamic_folds && !s:settings.no_foldcolumn && s:foldcolumn > 0
+	" Indent for foldcolumn if there is one. Assume it's empty, there should
+	" not be a fold for deleted lines in diff mode.
+	let s:new = s:FoldColumn_fill() . s:new
       endif
       call add(s:lines, s:new.s:HtmlEndline)
 
@@ -693,8 +1319,6 @@
   " Start the line with the line number.
   if s:settings.number_lines
     let s:numcol = repeat(' ', s:margin - 1 - strlen(s:lnum)) . s:lnum . ' '
-  else
-    let s:numcol = ""
   endif
 
   let s:new = ""
@@ -702,14 +1326,14 @@
   if has('folding') && !s:settings.ignore_folding && foldclosed(s:lnum) > -1 && !s:settings.dynamic_folds
     "
     " This is the beginning of a folded block (with no dynamic folding)
-    "
-    let s:new = s:numcol . foldtextresult(s:lnum)
+    let s:new = foldtextresult(s:lnum)
     if !s:settings.no_pre
       " HTML line wrapping is off--go ahead and fill to the margin
       let s:new = s:new . repeat(s:foldfillchar, &columns - strlen(s:new))
     endif
 
-    let s:new = s:HtmlFormat(s:new, "Folded", "")
+    " put numcol in a separate group for sake of unselectable text
+    let s:new = (s:settings.number_lines ? s:HtmlFormat_n(s:numcol, s:FOLDED_ID, 0, s:lnum): "") . s:HtmlFormat_t(s:new, s:FOLDED_ID, 0)
 
     " Skip to the end of the fold
     let s:new_lnum = foldclosedend(s:lnum)
@@ -734,7 +1358,7 @@
 	call remove(s:foldstack, 0)
       endwhile
 
-      " Now insert an opening any new folds that start on this line
+      " Now insert an opening for any new folds that start on this line
       let s:firstfold = 1
       while !empty(s:allfolds) && get(s:allfolds,0).firstline == s:lnum
 	let s:foldId = s:foldId + 1
@@ -751,38 +1375,46 @@
 	if !s:settings.no_foldcolumn
 	  " add fold column that can open the new fold
 	  if s:allfolds[0].level > 1 && s:firstfold
-	    let s:new = s:new . ""
-	    let s:new = s:new . repeat('|', s:allfolds[0].level - 1) . ""
+	    let s:new = s:new . s:FoldColumn_build('|', s:allfolds[0].level - 1, 0, "",
+		  \ 'toggle-open FoldColumn','javascript:toggleFold("fold'.s:foldstack[0].id.'");')
 	  endif
-	  let s:new = s:new . "+"
-	  let s:new = s:new . ""
+	  let s:new = s:new . s:FoldColumn_build(" ", 1, s:foldcolumn - s:allfolds[0].level - 1, "",
+		\ 'toggle-open FoldColumn'. (get(s:allfolds, 1, {'firstline': 0}).firstline == s:lnum ?" toggle-filler" :""),
+		\ 'javascript:toggleFold("fold'.s:foldId.'");')
 
 	  " add fold column that can close the new fold
-	  let s:new = s:new . ""
-	  if s:firstfold
-	    let s:new = s:new . repeat('|', s:allfolds[0].level - 1)
-	  endif
-	  let s:new = s:new . "-"
-	  " only add spaces if we aren't opening another fold on the same line
+	  " only add extra blank space if we aren't opening another fold on the
+	  " same line
 	  if get(s:allfolds, 1, {'firstline': 0}).firstline != s:lnum
-	    let s:new = s:new . repeat(" ", s:foldcolumn - s:allfolds[0].level)
+	    let s:extra_space = s:foldcolumn - s:allfolds[0].level
+	  else
+	    let s:extra_space = 0
+	  endif
+	  if s:firstfold
+	    " the first fold in a line has '|' characters from folds opened in
+	    " previous lines, before the '-' for this fold
+	    let s:new .= s:FoldColumn_build('|', s:allfolds[0].level - 1, s:extra_space, '-',
+		  \ 'toggle-closed FoldColumn', 'javascript:toggleFold("fold'.s:foldId.'");')
+	  else
+	    " any subsequent folds in the line only add a single '-'
+	    let s:new = s:new . s:FoldColumn_build("-", 1, s:extra_space, "",
+		  \ 'toggle-closed FoldColumn', 'javascript:toggleFold("fold'.s:foldId.'");')
 	  endif
-	  let s:new = s:new . ""
 	  let s:firstfold = 0
 	endif
 
-	" add fold text, moving the span ending to the next line so collapsing
-	" of folds works correctly
-	let s:new = s:new . substitute(s:HtmlFormat(s:numcol . foldtextresult(s:lnum), "Folded", ""), '', s:HtmlEndline.'\n\0', '')
+	" Add fold text, moving the span ending to the next line so collapsing
+	" of folds works correctly.
+	" Put numcol in a separate group for sake of unselectable text.
+	let s:new = s:new . (s:settings.number_lines ? s:HtmlFormat_n(s:numcol, s:FOLDED_ID, 0, 0) : "") . substitute(s:HtmlFormat_t(foldtextresult(s:lnum), s:FOLDED_ID, 0), '', s:HtmlEndline.'\n\0', '')
 	let s:new = s:new . ""
 
 	" open the fold now that we have the fold text to allow retrieval of
@@ -802,14 +1434,13 @@
 	  " add the empty foldcolumn for unfolded lines if there is a fold
 	  " column at all
 	  if s:foldcolumn > 0
-	    let s:new = s:new . s:HtmlFormat(repeat(' ', s:foldcolumn), "FoldColumn", "")
+	    let s:new = s:new . s:FoldColumn_fill()
 	  endif
 	else
 	  " add the fold column for folds not on the opening line
 	  if get(s:foldstack, 0).firstline < s:lnum
-	    let s:new = s:new . ""
-	    let s:new = s:new . repeat('|', s:foldstack[0].level)
-	    let s:new = s:new . repeat(' ', s:foldcolumn - s:foldstack[0].level) . ""
+	    let s:new = s:new . s:FoldColumn_build('|', s:foldstack[0].level, s:foldcolumn - s:foldstack[0].level, "",
+		  \ 'FoldColumn', 'javascript:toggleFold("fold'.s:foldstack[0].id.'");')
 	  endif
 	endif
       endif
@@ -817,8 +1448,9 @@
 
     " Now continue with the unfolded line text
     if s:settings.number_lines
-      " TODO: why not use the real highlight name here?
-      let s:new = s:new . s:HtmlFormat(s:numcol, "lnr", "")
+      let s:new = s:new . s:HtmlFormat_n(s:numcol, s:LINENR_ID, 0, s:lnum)
+    else
+      let s:new = s:new . s:HtmlFormat_n("", s:LINENR_ID, 0, s:lnum)
     endif
 
     " Get the diff attribute, if any.
@@ -832,7 +1464,6 @@
 
     " most of the time we won't use the diff_id, initialize to zero
     let s:diff_id = 0
-    let s:diff_id_name = ""
 
     while s:col <= s:len || (s:col == 1 && s:diffattr)
       let s:startcol = s:col " The start column for processing text
@@ -871,47 +1502,45 @@
       endif
 
       if s:settings.ignore_conceal || !s:concealinfo[0]
-	" Expand tabs
+	" Expand tabs if needed
 	let s:expandedtab = strpart(s:line, s:startcol - 1, s:col - s:startcol)
-	let s:offset = 0
-	let s:idx = stridx(s:expandedtab, "\t")
-	while s:idx >= 0
-	  if has("multi_byte_encoding")
-	    if s:startcol + s:idx == 1
-	      let s:i = &ts
-	    else
-	      if s:idx == 0
-		let s:prevc = matchstr(s:line, '.\%' . (s:startcol + s:idx + s:offset) . 'c')
+	if s:settings.expand_tabs
+	  let s:offset = 0
+	  let s:idx = stridx(s:expandedtab, "\t")
+	  while s:idx >= 0
+	    if has("multi_byte_encoding")
+	      if s:startcol + s:idx == 1
+		let s:i = &ts
 	      else
-		let s:prevc = matchstr(s:expandedtab, '.\%' . (s:idx + 1) . 'c')
+		if s:idx == 0
+		  let s:prevc = matchstr(s:line, '.\%' . (s:startcol + s:idx + s:offset) . 'c')
+		else
+		  let s:prevc = matchstr(s:expandedtab, '.\%' . (s:idx + 1) . 'c')
+		endif
+		let s:vcol = virtcol([s:lnum, s:startcol + s:idx + s:offset - len(s:prevc)])
+		let s:i = &ts - (s:vcol % &ts)
 	      endif
-	      let s:vcol = virtcol([s:lnum, s:startcol + s:idx + s:offset - len(s:prevc)])
-	      let s:i = &ts - (s:vcol % &ts)
+	      let s:offset -= s:i - 1
+	    else
+	      let s:i = &ts - ((s:idx + s:startcol - 1) % &ts)
 	    endif
-	    let s:offset -= s:i - 1
-	  else
-	    let s:i = &ts - ((s:idx + s:startcol - 1) % &ts)
-	  endif
-	  let s:expandedtab = substitute(s:expandedtab, '\t', repeat(' ', s:i), '')
-	  let s:idx = stridx(s:expandedtab, "\t")
-	endwhile
+	    let s:expandedtab = substitute(s:expandedtab, '\t', repeat(' ', s:i), '')
+	    let s:idx = stridx(s:expandedtab, "\t")
+	  endwhile
+	end
 
 	" get the highlight group name to use
 	let s:id = synIDtrans(s:id)
-	let s:id_name = synIDattr(s:id, "name", s:whatterm)
-	if s:diff_id
-	  let s:diff_id_name = synIDattr(s:diff_id, "name", s:whatterm)
-	endif
       else
 	" use Conceal highlighting for concealed text
-	let s:id_name = 'Conceal'
+	let s:id = s:CONCEAL_ID
 	let s:expandedtab = s:concealinfo[1]
       endif
 
-      " Output the text with the same synID, with class set to {s:id_name},
-      " unless it has been concealed completely.
+      " Output the text with the same synID, with class set to the highlight ID
+      " name, unless it has been concealed completely.
       if strlen(s:expandedtab) > 0
-	let s:new = s:new . s:HtmlFormat(s:expandedtab,  s:id_name, s:diff_id_name)
+	let s:new = s:new . s:HtmlFormat(s:expandedtab,  s:id, s:diff_id, "", 0)
       endif
     endwhile
   endif
@@ -936,9 +1565,9 @@
   endwhile
 
   " add fold column to the style list if not already there
-  let s:id = hlID('FoldColumn')
-  if index(s:idlist, s:id) == -1
-    call insert(s:idlist, s:id)
+  let s:id = s:FOLD_C_ID
+  if !has_key(s:stylelist, s:id)
+    let s:stylelist[s:id] = '.FoldColumn { ' . s:CSS1(s:id) . '}'
   endif
 endif
 
@@ -947,7 +1576,7 @@
     " Close off the font tag that encapsulates the whole 
     call extend(s:lines, ["", "", ""])
   else
-    call extend(s:lines, ["", ""])
+    call extend(s:lines, ["
", "", ""]) endif else call extend(s:lines, ["
", "", ""]) @@ -957,91 +1586,119 @@ call setline(1, s:lines) unlet s:lines +" Mangle modelines so Vim doesn't try to use HTML text as a modeline if editing +" this file in the future; need to do this after generating all the text in case +" the modeline text has different highlight groups which all turn out to be +" stripped from the final output. +%s!\v(%(^|\s+)%(vim?|ex)):!\1\:!ge + +" The generated HTML is admittedly ugly and takes a LONG time to fold. +" Make sure the user doesn't do syntax folding when loading a generated file, +" using a modeline. +call append(line('$'), "") + " Now, when we finally know which, we define the colors and styles if s:settings.use_css 1;/