├── part0 ├── 第〇部分-基本操作说明.md ├── 第1章-vim-解决问题的方式.md ├── tip4.md ├── tip6.md ├── tip3.md ├── tip1.markdown ├── tip5.md ├── tip1.md └── tip2.md ├── images ├── tip1.png ├── tip2.png ├── tip3.png ├── tip4.png ├── tip5.png ├── tip10.png ├── tip100.png ├── tip101.png ├── tip107.png ├── tip109.png ├── tip115.png ├── tip116.png ├── tip117.png ├── tip12.png ├── tip13.png ├── tip14.png ├── tip15.png ├── tip16.png ├── tip17.png ├── tip19.png ├── tip21.png ├── tip22.png ├── tip24.png ├── tip25.png ├── tip26.png ├── tip27.png ├── tip33.png ├── tip41.png ├── tip43.png ├── tip47.png ├── tip53.png ├── tip58.png ├── tip66.png ├── tip72.png ├── tip73.png ├── tip74.png ├── tip75.png ├── tip76.png ├── tip77.png ├── tip81.png ├── tip83.png ├── tip84.png ├── tip85.png ├── tip86.png ├── tip92.png ├── tip93.png ├── tip94.png ├── tip95.png ├── tip98.png ├── tip99.png ├── tip9_1.png ├── tip9_2.png ├── tip9_3.png ├── tip100-1.png ├── tip101-1.png ├── tip103-1.png ├── tip103-2.png ├── tip103-3.png ├── tip103-4.png ├── tip115-1.png ├── tip116-1.png ├── tip11_1.png ├── tip11_2.png ├── tip21_1.png ├── tip21_2.png ├── tip23_1.png ├── tip23_1_1.png ├── tip23_2.png ├── tip28_1.png ├── tip28_2.png ├── tip28_3.png ├── tip29_1.png ├── tip29_2.png ├── tip29_3.png ├── tip29_4.png ├── tip30_1.png ├── tip30_2.png ├── tip32_1.png ├── tip34_1.png ├── tip34_2.png ├── tip35_1.png ├── tip35_2.png ├── tip35_3.png ├── tip36_2.png ├── tip37_1.png ├── tip37_2.png ├── tip37_3.png ├── tip37_4.png ├── tip37_5.png ├── tip38_1.png ├── tip38_2.png ├── tip38_3.png ├── tip38_4.png ├── tip38_5.png ├── tip38_6.png ├── tip38_7.png ├── tip39_1.png ├── tip39_2.png ├── tip39_3.png ├── tip39_4.png ├── tip39_5.png ├── tip40_1.png ├── tip40_2.png ├── tip40_3.png ├── tip43_0.png ├── tip43_1.png ├── tip48_1.png ├── tip48_2.png ├── tip48_3.png ├── tip48_4.png ├── tip49_1.png ├── tip49_2.png ├── tip49_3.png ├── tip49_4.png ├── tip49_5.png ├── tip50_1.png ├── tip50_2.png ├── tip50_3.png ├── tip51_0.png ├── tip51_1.png ├── tip51_2.png ├── tip51_3.png ├── tip52_1.png ├── tip52_2.png ├── tip52_3.png ├── tip54_1.png ├── tip54_2.png ├── tip54_3.png ├── tip55_1.png ├── tip55_2.png ├── tip57_1.png ├── tip59_1.png ├── tip59_2.png ├── tip59_3.png ├── tip59_4.png ├── tip60_1.png ├── tip60_2.png ├── tip60_3.png ├── tip60_4.png ├── tip60_5.png ├── tip61_1.png ├── tip61_2.png ├── tip61_3.png ├── tip62_1.png ├── tip62_2.png ├── tip62_3.png ├── tip63_0.png ├── tip63_1.png ├── tip64_0.png ├── tip64_1.png ├── tip64_2.png ├── tip67_1.png ├── tip67_2.png ├── tip67_3.png ├── tip67_4.png ├── tip67_5.png ├── tip67_6.png ├── tip67_7.png ├── tip68_1.png ├── tip68_2.png ├── tip68_3.png ├── tip69_1.png ├── tip69_2.png ├── tip69_3.png ├── tip69_4.png ├── tip69_5.png ├── tip70_1.png ├── tip70_2.png ├── tip70_3.png ├── tip71_1.png ├── tip71_2.png ├── tip71_3.png ├── tip85_1.png ├── tip85_2.png ├── tip88-1.png ├── tip88-2.png ├── tip88-3.png └── tip88-4.png ├── .gitignore ├── part4_register ├── tip73.md ├── chapter11_macro │ ├── tip66.md │ ├── tip64.md │ ├── tip68.md │ ├── tip65.md │ ├── tip70.md │ ├── tip71.md │ ├── tip67.md │ └── tip69.md ├── chapter10_copy_paste │ ├── tip61.md │ ├── tip63.md │ ├── tip62.md │ ├── tip59.md │ └── tip60.md └── tip72.md ├── part6_tools ├── chapter19_auto_complete │ ├── tip115.md │ ├── tip114.md │ ├── tip113.md │ ├── tip117.md │ ├── tip111.md │ ├── tip116.md │ └── tip112.md ├── chapter20_spell_check │ ├── tip119.md │ ├── tip121.md │ ├── tip120.md │ └── tip118.md ├── chapter17_compile │ ├── tip106.md │ ├── tip104.md │ ├── tip105.md │ └── tip107.md ├── chapter18_grep_search │ ├── tip108.md │ ├── tip110.md │ └── tip109.md └── chapter16_ctags │ ├── tip102.md │ ├── tip101.md │ └── tip103.md ├── part1_pattern ├── chapter2_normal_pattern │ ├── tip7.md │ ├── tip8.md │ ├── tip10.md │ ├── tip12.md │ ├── tip11.md │ └── tip9.md ├── chapter3_insert_mode │ ├── tip18.md │ ├── tip13.md │ ├── tip16.md │ ├── tip19.md │ ├── tip14.md │ ├── tip17.md │ └── tip15.md ├── chapter5_ex_mode │ ├── tip31.md │ ├── tip32.md │ ├── tip33.md │ ├── tip30.md │ ├── tip29.md │ ├── tip27.md │ ├── tip35.md │ ├── tip34.md │ └── tip28.md └── chapter4_visual_mode │ ├── tip24.md │ ├── tip22.md │ ├── tip25.md │ ├── tip20.md │ ├── tip21.md │ ├── tip26.md │ └── tip23.md ├── part3_fast_move ├── chapter8_doc_jump │ ├── tip47.md │ ├── tip46.md │ ├── tip54.md │ ├── tip50.md │ ├── tip49.md │ ├── tip53.md │ ├── tip48.md │ ├── tip52.md │ └── tip51.md └── chapter9_file_jump │ ├── tip56.md │ ├── tip58.md │ ├── tip55.md │ └── tip57.md ├── part5_pattern ├── chapter13_search │ ├── tip82.md │ ├── tip80.md │ ├── tip79.md │ ├── tip83.md │ ├── tip81.md │ ├── tip84.md │ ├── tip85.md │ └── tip86.md ├── chapter14_substitute │ ├── tip94.md │ ├── tip90.md │ ├── tip93.md │ ├── tip88.md │ ├── tip95.md │ ├── tip89.md │ ├── tip96.md │ ├── tip91.md │ ├── tip92.md │ └── tip87.md ├── chapter15_global_cmd │ ├── tip97.md │ ├── tip98.md │ ├── tip99.md │ └── tip100.md └── chapter12_match │ ├── tip74.md │ ├── tip75.md │ ├── tip72.md │ ├── tip77.md │ ├── tip73.md │ ├── tip76.md │ └── tip78.md ├── part2_file ├── chapter7_file_opr │ ├── tip44.md │ ├── tip42.md │ ├── tip41.md │ ├── tip43.md │ └── tip45.md └── chapter6_multi_files │ ├── tip36.md │ ├── tip40.md │ ├── tip39.md │ ├── tip37.md │ └── tip38.md ├── SUMMARY.md └── README.md /part0/第〇部分-基本操作说明.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /part0/第1章-vim-解决问题的方式.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /images/tip1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip1.png -------------------------------------------------------------------------------- /images/tip2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip2.png -------------------------------------------------------------------------------- /images/tip3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip3.png -------------------------------------------------------------------------------- /images/tip4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip4.png -------------------------------------------------------------------------------- /images/tip5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip5.png -------------------------------------------------------------------------------- /images/tip10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip10.png -------------------------------------------------------------------------------- /images/tip100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip100.png -------------------------------------------------------------------------------- /images/tip101.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip101.png -------------------------------------------------------------------------------- /images/tip107.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip107.png -------------------------------------------------------------------------------- /images/tip109.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip109.png -------------------------------------------------------------------------------- /images/tip115.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip115.png -------------------------------------------------------------------------------- /images/tip116.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip116.png -------------------------------------------------------------------------------- /images/tip117.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip117.png -------------------------------------------------------------------------------- /images/tip12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip12.png -------------------------------------------------------------------------------- /images/tip13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip13.png -------------------------------------------------------------------------------- /images/tip14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip14.png -------------------------------------------------------------------------------- /images/tip15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip15.png -------------------------------------------------------------------------------- /images/tip16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip16.png -------------------------------------------------------------------------------- /images/tip17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip17.png -------------------------------------------------------------------------------- /images/tip19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip19.png -------------------------------------------------------------------------------- /images/tip21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip21.png -------------------------------------------------------------------------------- /images/tip22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip22.png -------------------------------------------------------------------------------- /images/tip24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip24.png -------------------------------------------------------------------------------- /images/tip25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip25.png -------------------------------------------------------------------------------- /images/tip26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip26.png -------------------------------------------------------------------------------- /images/tip27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip27.png -------------------------------------------------------------------------------- /images/tip33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip33.png -------------------------------------------------------------------------------- /images/tip41.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip41.png -------------------------------------------------------------------------------- /images/tip43.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip43.png -------------------------------------------------------------------------------- /images/tip47.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip47.png -------------------------------------------------------------------------------- /images/tip53.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip53.png -------------------------------------------------------------------------------- /images/tip58.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip58.png -------------------------------------------------------------------------------- /images/tip66.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip66.png -------------------------------------------------------------------------------- /images/tip72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip72.png -------------------------------------------------------------------------------- /images/tip73.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip73.png -------------------------------------------------------------------------------- /images/tip74.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip74.png -------------------------------------------------------------------------------- /images/tip75.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip75.png -------------------------------------------------------------------------------- /images/tip76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip76.png -------------------------------------------------------------------------------- /images/tip77.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip77.png -------------------------------------------------------------------------------- /images/tip81.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip81.png -------------------------------------------------------------------------------- /images/tip83.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip83.png -------------------------------------------------------------------------------- /images/tip84.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip84.png -------------------------------------------------------------------------------- /images/tip85.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip85.png -------------------------------------------------------------------------------- /images/tip86.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip86.png -------------------------------------------------------------------------------- /images/tip92.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip92.png -------------------------------------------------------------------------------- /images/tip93.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip93.png -------------------------------------------------------------------------------- /images/tip94.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip94.png -------------------------------------------------------------------------------- /images/tip95.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip95.png -------------------------------------------------------------------------------- /images/tip98.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip98.png -------------------------------------------------------------------------------- /images/tip99.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip99.png -------------------------------------------------------------------------------- /images/tip9_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip9_1.png -------------------------------------------------------------------------------- /images/tip9_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip9_2.png -------------------------------------------------------------------------------- /images/tip9_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip9_3.png -------------------------------------------------------------------------------- /images/tip100-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip100-1.png -------------------------------------------------------------------------------- /images/tip101-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip101-1.png -------------------------------------------------------------------------------- /images/tip103-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip103-1.png -------------------------------------------------------------------------------- /images/tip103-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip103-2.png -------------------------------------------------------------------------------- /images/tip103-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip103-3.png -------------------------------------------------------------------------------- /images/tip103-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip103-4.png -------------------------------------------------------------------------------- /images/tip115-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip115-1.png -------------------------------------------------------------------------------- /images/tip116-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip116-1.png -------------------------------------------------------------------------------- /images/tip11_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip11_1.png -------------------------------------------------------------------------------- /images/tip11_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip11_2.png -------------------------------------------------------------------------------- /images/tip21_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip21_1.png -------------------------------------------------------------------------------- /images/tip21_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip21_2.png -------------------------------------------------------------------------------- /images/tip23_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip23_1.png -------------------------------------------------------------------------------- /images/tip23_1_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip23_1_1.png -------------------------------------------------------------------------------- /images/tip23_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip23_2.png -------------------------------------------------------------------------------- /images/tip28_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip28_1.png -------------------------------------------------------------------------------- /images/tip28_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip28_2.png -------------------------------------------------------------------------------- /images/tip28_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip28_3.png -------------------------------------------------------------------------------- /images/tip29_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip29_1.png -------------------------------------------------------------------------------- /images/tip29_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip29_2.png -------------------------------------------------------------------------------- /images/tip29_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip29_3.png -------------------------------------------------------------------------------- /images/tip29_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip29_4.png -------------------------------------------------------------------------------- /images/tip30_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip30_1.png -------------------------------------------------------------------------------- /images/tip30_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip30_2.png -------------------------------------------------------------------------------- /images/tip32_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip32_1.png -------------------------------------------------------------------------------- /images/tip34_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip34_1.png -------------------------------------------------------------------------------- /images/tip34_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip34_2.png -------------------------------------------------------------------------------- /images/tip35_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip35_1.png -------------------------------------------------------------------------------- /images/tip35_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip35_2.png -------------------------------------------------------------------------------- /images/tip35_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip35_3.png -------------------------------------------------------------------------------- /images/tip36_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip36_2.png -------------------------------------------------------------------------------- /images/tip37_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip37_1.png -------------------------------------------------------------------------------- /images/tip37_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip37_2.png -------------------------------------------------------------------------------- /images/tip37_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip37_3.png -------------------------------------------------------------------------------- /images/tip37_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip37_4.png -------------------------------------------------------------------------------- /images/tip37_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip37_5.png -------------------------------------------------------------------------------- /images/tip38_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip38_1.png -------------------------------------------------------------------------------- /images/tip38_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip38_2.png -------------------------------------------------------------------------------- /images/tip38_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip38_3.png -------------------------------------------------------------------------------- /images/tip38_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip38_4.png -------------------------------------------------------------------------------- /images/tip38_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip38_5.png -------------------------------------------------------------------------------- /images/tip38_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip38_6.png -------------------------------------------------------------------------------- /images/tip38_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip38_7.png -------------------------------------------------------------------------------- /images/tip39_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip39_1.png -------------------------------------------------------------------------------- /images/tip39_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip39_2.png -------------------------------------------------------------------------------- /images/tip39_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip39_3.png -------------------------------------------------------------------------------- /images/tip39_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip39_4.png -------------------------------------------------------------------------------- /images/tip39_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip39_5.png -------------------------------------------------------------------------------- /images/tip40_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip40_1.png -------------------------------------------------------------------------------- /images/tip40_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip40_2.png -------------------------------------------------------------------------------- /images/tip40_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip40_3.png -------------------------------------------------------------------------------- /images/tip43_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip43_0.png -------------------------------------------------------------------------------- /images/tip43_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip43_1.png -------------------------------------------------------------------------------- /images/tip48_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip48_1.png -------------------------------------------------------------------------------- /images/tip48_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip48_2.png -------------------------------------------------------------------------------- /images/tip48_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip48_3.png -------------------------------------------------------------------------------- /images/tip48_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip48_4.png -------------------------------------------------------------------------------- /images/tip49_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip49_1.png -------------------------------------------------------------------------------- /images/tip49_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip49_2.png -------------------------------------------------------------------------------- /images/tip49_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip49_3.png -------------------------------------------------------------------------------- /images/tip49_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip49_4.png -------------------------------------------------------------------------------- /images/tip49_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip49_5.png -------------------------------------------------------------------------------- /images/tip50_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip50_1.png -------------------------------------------------------------------------------- /images/tip50_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip50_2.png -------------------------------------------------------------------------------- /images/tip50_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip50_3.png -------------------------------------------------------------------------------- /images/tip51_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip51_0.png -------------------------------------------------------------------------------- /images/tip51_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip51_1.png -------------------------------------------------------------------------------- /images/tip51_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip51_2.png -------------------------------------------------------------------------------- /images/tip51_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip51_3.png -------------------------------------------------------------------------------- /images/tip52_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip52_1.png -------------------------------------------------------------------------------- /images/tip52_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip52_2.png -------------------------------------------------------------------------------- /images/tip52_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip52_3.png -------------------------------------------------------------------------------- /images/tip54_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip54_1.png -------------------------------------------------------------------------------- /images/tip54_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip54_2.png -------------------------------------------------------------------------------- /images/tip54_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip54_3.png -------------------------------------------------------------------------------- /images/tip55_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip55_1.png -------------------------------------------------------------------------------- /images/tip55_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip55_2.png -------------------------------------------------------------------------------- /images/tip57_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip57_1.png -------------------------------------------------------------------------------- /images/tip59_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip59_1.png -------------------------------------------------------------------------------- /images/tip59_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip59_2.png -------------------------------------------------------------------------------- /images/tip59_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip59_3.png -------------------------------------------------------------------------------- /images/tip59_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip59_4.png -------------------------------------------------------------------------------- /images/tip60_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip60_1.png -------------------------------------------------------------------------------- /images/tip60_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip60_2.png -------------------------------------------------------------------------------- /images/tip60_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip60_3.png -------------------------------------------------------------------------------- /images/tip60_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip60_4.png -------------------------------------------------------------------------------- /images/tip60_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip60_5.png -------------------------------------------------------------------------------- /images/tip61_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip61_1.png -------------------------------------------------------------------------------- /images/tip61_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip61_2.png -------------------------------------------------------------------------------- /images/tip61_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip61_3.png -------------------------------------------------------------------------------- /images/tip62_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip62_1.png -------------------------------------------------------------------------------- /images/tip62_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip62_2.png -------------------------------------------------------------------------------- /images/tip62_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip62_3.png -------------------------------------------------------------------------------- /images/tip63_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip63_0.png -------------------------------------------------------------------------------- /images/tip63_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip63_1.png -------------------------------------------------------------------------------- /images/tip64_0.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip64_0.png -------------------------------------------------------------------------------- /images/tip64_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip64_1.png -------------------------------------------------------------------------------- /images/tip64_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip64_2.png -------------------------------------------------------------------------------- /images/tip67_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip67_1.png -------------------------------------------------------------------------------- /images/tip67_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip67_2.png -------------------------------------------------------------------------------- /images/tip67_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip67_3.png -------------------------------------------------------------------------------- /images/tip67_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip67_4.png -------------------------------------------------------------------------------- /images/tip67_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip67_5.png -------------------------------------------------------------------------------- /images/tip67_6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip67_6.png -------------------------------------------------------------------------------- /images/tip67_7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip67_7.png -------------------------------------------------------------------------------- /images/tip68_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip68_1.png -------------------------------------------------------------------------------- /images/tip68_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip68_2.png -------------------------------------------------------------------------------- /images/tip68_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip68_3.png -------------------------------------------------------------------------------- /images/tip69_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip69_1.png -------------------------------------------------------------------------------- /images/tip69_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip69_2.png -------------------------------------------------------------------------------- /images/tip69_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip69_3.png -------------------------------------------------------------------------------- /images/tip69_4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip69_4.png -------------------------------------------------------------------------------- /images/tip69_5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip69_5.png -------------------------------------------------------------------------------- /images/tip70_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip70_1.png -------------------------------------------------------------------------------- /images/tip70_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip70_2.png -------------------------------------------------------------------------------- /images/tip70_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip70_3.png -------------------------------------------------------------------------------- /images/tip71_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip71_1.png -------------------------------------------------------------------------------- /images/tip71_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip71_2.png -------------------------------------------------------------------------------- /images/tip71_3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip71_3.png -------------------------------------------------------------------------------- /images/tip85_1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip85_1.png -------------------------------------------------------------------------------- /images/tip85_2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip85_2.png -------------------------------------------------------------------------------- /images/tip88-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip88-1.png -------------------------------------------------------------------------------- /images/tip88-2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip88-2.png -------------------------------------------------------------------------------- /images/tip88-3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip88-3.png -------------------------------------------------------------------------------- /images/tip88-4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iampkuhz/Practival-Vim/HEAD/images/tip88-4.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | Practical-Vim-Notes-master/ 2 | Practical-Vim-Notes/ 3 | .idea/ 4 | book.pdf 5 | _book 6 | *.pdf 7 | .* 8 | *.iml 9 | -------------------------------------------------------------------------------- /part4_register/tip73.md: -------------------------------------------------------------------------------- 1 | #Tip73: Use the \v Pattern Switch for Regex Searches 2 | 3 | ![tip73_1](images/tip73_1.png) 4 | ![tip73_2](images/tip73_2.png) 5 | ![tip73_3](images/tip73_3.png) 6 | 7 | #[Tip72](tip72.md) [Tip74](tip74.md) -------------------------------------------------------------------------------- /part0/tip4.md: -------------------------------------------------------------------------------- 1 | # 技巧4:执行、重复、回退 2 | > 在执行可重复工作时,我们应该让移动和修改尽可能重复,减少按键数量 3 | 4 | 1. `.`能极大减少按键数量 5 | 2. `u`撤销上次的插入操作可能会经常被使用 6 | 7 | ### 例子: 可重复的操作如何`回退`和`重复` 8 | 9 | ![tip4](../images/tip4.png) 10 | 11 |
12 | 13 | |上一篇|下一篇| 14 | |:---|---:| 15 | |[技巧3 以退为进](tip3.md) |[技巧5 查找并手动替换](tip5.md)| 16 | -------------------------------------------------------------------------------- /part6_tools/chapter19_auto_complete/tip115.md: -------------------------------------------------------------------------------- 1 | # 技巧 115 自动补全整行文本 2 | > 介绍对整行补全的方法 3 | 4 | ### 例子:复制第二行的内容到文件结尾 5 | > ![](../../images/tip115.png) 6 | > ![](../../images/tip115-1.png) 7 | 8 | 9 | 10 | 11 | |上一篇|下一篇| 12 | |:---|---:| 13 | |[技巧 114 使用字典中的单词进行自动补全](tip114.md)|[技巧 116 自动补全文件名](tip116.md)| 14 | -------------------------------------------------------------------------------- /part1_pattern/chapter2_normal_pattern/tip7.md: -------------------------------------------------------------------------------- 1 | # 技巧7 停顿时请移开画笔 2 | 3 | 1. 普通模式是 vim 的放松状态 4 | > 好比画家画画,大多数时间画笔不在画布上, vim操作的时候也应该一样: 大多数时间离开修改状态, 进行思考\阅读\在代码中穿梭 5 | 6 | 2. 普通模式可以直接进行修改,不一定需要进入插入模式 7 | 8 |
9 | 10 | |上一篇|下一篇| 11 | |:---|---:| 12 | |[技巧6 结识`.`范式](../../part0/tip6.md)| [技巧8 把撤销的单元切成块](tip8.md)| 13 | -------------------------------------------------------------------------------- /part6_tools/chapter20_spell_check/tip119.md: -------------------------------------------------------------------------------- 1 | # 技巧 119 使用其他拼写字典 2 | > vim的拼写检查支持不同语音的拼写字典 3 | 4 | 1. `:set spelllang=en_us`设置只使用美式拼法 5 | 2. `:set spelllang=en`设置支持所有以英语为母语的地区 6 | 3. 如果设置的语言拼写文件没有时,vim会为我们提供下载和安装的方法 7 | 8 | 9 | |上一篇|下一篇| 10 | |:---|---:| 11 | |[技巧 118 对你的工作进行拼写检查 ](tip118.md)|[技巧 120 将单词添加到拼写文件中](tip120.md)| 12 | -------------------------------------------------------------------------------- /part3_fast_move/chapter8_doc_jump/tip47.md: -------------------------------------------------------------------------------- 1 | # 技巧47: 区分实际行和屏幕行 2 | 3 | > 实际行就是文件的实际行号,如果vimrc设置`wrap`(缺省启用),则屏幕的多行是实际的一行 4 | 5 | ![tip47](../../images/tip47.png) 6 | 7 | 在`j`,`k`,`0`,`$`之前加`g`就是对屏幕行操作 8 | 9 | 10 |
11 | 12 | |上一篇|下一篇| 13 | |:---|---:| 14 | |[技巧46 让手指保持在 `本位行(Home Row)`上](tip46.md)|[技巧48 基于单词移动](tip48.md)| 15 | -------------------------------------------------------------------------------- /part6_tools/chapter19_auto_complete/tip114.md: -------------------------------------------------------------------------------- 1 | # 技巧 114 使用字典中的单词进行自动补全 2 | > 介绍如何使用字典进行自动补全 3 | 4 | 1. ``触发基于字典的查找 5 | 2. `:set spell`来激活vim的拼写检查 6 | 7 | 8 | [技巧121](../chapter20_spell_check/tip121.md)介绍了一种通过拼写字典实现自动补全的方式 9 | 10 | |上一篇|下一篇| 11 | |:---|---:| 12 | |[技巧 113 掌握关键字的来龙去脉 ](tip113.md)|[技巧 115 自动补全整行文本](tip115.md)| 13 | -------------------------------------------------------------------------------- /part5_pattern/chapter13_search/tip82.md: -------------------------------------------------------------------------------- 1 | # 技巧82: 统计当前模式的匹配个数 2 | 3 | #### 执行完查找模式后,输入`:%s///gn` 4 | 5 | > 说明 6 | > 1. `g` 表明作用于全局,非当前行 7 | > 2. `%` 表明作用于所有行,`:2,4s///gn`表示作用于2-4行 8 | > 3. `n` 表示不改变(不替换) 9 | > 4. 作用完后会显示类似这样的提示`32 matches on 30 lines` 10 | 11 | |上一篇|下一篇| 12 | |:---|---:| 13 | |[技巧81: 在执行查找前预览第一处匹配](tip81.md)|[技巧83: 将光标偏移到查找匹配的结尾](tip83.md)| 14 | -------------------------------------------------------------------------------- /part6_tools/chapter20_spell_check/tip121.md: -------------------------------------------------------------------------------- 1 | # 技巧 121 在插入模式下更正拼写错误 2 | > 自动补全功能允许不离开插入模式下更正拼写错误 3 | 4 | > 场景:刚输入完一行文本(位于行末),发现几个单词之前的地方有拼写错误 5 | 6 | 1. 解决方案1:(通常做法)切换到普通模式 7 | > 先切换到普通模式,再执行`[s`跳回拼写错误的地方,再用`1z=`更正,最后执行`A`继续行末编辑模式 8 | 2. 解决方案2:(利用拼写自动补全)在插入模式下执行`s`更正拼写错误 9 | 10 | 11 | |上一篇|下一篇| 12 | |:---|---:| 13 | |[技巧 120 将单词添加到拼写文件中 ](tip120.md)|| 14 | -------------------------------------------------------------------------------- /part1_pattern/chapter3_insert_mode/tip18.md: -------------------------------------------------------------------------------- 1 | # 技巧18: 用二合字母(digraph)插入非常用字符 2 | > 不知道ascii码,怎么方便插入`¿` `⅓` `⅔` `⅕` `⅙` 3 | 4 | **二合字母**: 成对的字符 5 | 6 | #### `{char1}{char2}` 7 | 8 | 1. `<<` 插入的是 `«` 9 | 2. `?I` 插入的是 `¿` 10 | 3. `35` 插入的是 `⅗` 11 | 12 |
13 | 14 | |上一篇|下一篇| 15 | |:---|---:| 16 | | [技巧17 用字符编码插入非常用字符](tip17.md)|[技巧19 使用替换模式替换已有文本](tip19.md)| 17 | -------------------------------------------------------------------------------- /part6_tools/chapter17_compile/tip106.md: -------------------------------------------------------------------------------- 1 | # 技巧 106 回溯以前的 Quickfix 列表 2 | > 更新quickfix表不会覆盖之前的quickfix表,只是把之前的表保存起来,方便我们回溯 3 | 4 | 1. `:colder`回溯某个版本的quickfix表(vim保存最近10个quickfix表) 5 | 2. `:cnewer`回到较新的列表 6 | 3. `:colder`和`:cnewer`都支持指定次数。`:5colder`指定之前5次的quickfix列表,`:3cnewer`指定之后的3次 7 | 8 | |上一篇|下一篇| 9 | |:---|---:| 10 | |[技巧 105 浏览 Quickfix 列表](tip105.md)|[技巧 107 定制外部编译器](tip107.md)| 11 | -------------------------------------------------------------------------------- /part1_pattern/chapter5_ex_mode/tip31.md: -------------------------------------------------------------------------------- 1 | # 技巧31: 重复上次的Ex命令 2 | 3 | 1. `:@:` 重复上次的Ex命令 4 | 2. `:@@` 使用过`@@`之后再重复之前的指令,使用`:@@` 5 | 3. `:bn` 等价于 `:bnext` 在缓冲区列表中正向移动 6 | 4. `:bp` 等价于 `:bprevius` 在缓冲区列表中逆向移动 7 | 5. `` :每次使用`:bnext` 的时候都会在跳转列表中添加一条记录,`` 会回到跳转列表的上一条记录处 (理解为**回看**) 8 | 9 |
10 | 11 | |上一篇|下一篇| 12 | |:---|---:| 13 | |[技巧30 在指定范围上执行普通模式命令](tip30.md)|[技巧32 自动补全Ex命令](tip32.md)| 14 | -------------------------------------------------------------------------------- /part2_file/chapter7_file_opr/tip44.md: -------------------------------------------------------------------------------- 1 | # 技巧44: 把文件保存到不存在的目录中 2 | 3 | > **Note:**
4 | > ``: 打印文件名和一些状态信息 5 | 6 | 7 | 1. 如果打开文件时指定的是空目录(当然打开的文件也是新文件了),则保存(`:write`)的时候会提示错误 8 | 2. 补救方法:**调用shell命令创建文件夹** 9 | 3. `:!mkdir -p %:h` 10 | > `-p` 表示递归创建不存在的文件夹 11 | > `%:h` 表示当前文件的完整目录路径 12 | 13 |
14 | 15 | |上一篇|下一篇| 16 | |:---|---:| 17 | |[技巧43 ](tip43.md)|[技巧45 以超级用户权限保存文件](tip45.md)| 18 | -------------------------------------------------------------------------------- /part6_tools/chapter17_compile/tip104.md: -------------------------------------------------------------------------------- 1 | # 技巧 104: 不用离开 Vim 也能编译代码 2 | > vim 提供了快速跳转到出错位置的方法 3 | 4 | 1. `make`命令在shell中编译 5 | 2. `:make`在vim中调用编译 6 | > 和系统的`make`输出一样,但是vim会做一些分析,列出其中的错误信息。对于错误信息,会在 quickfix 列表中为其创建一项记录。 7 | > 1. 使用`:cnext`跳转到quickfix列表的下一处出错位置 8 | 9 | |上一篇|下一篇| 10 | |:---|---:| 11 | |[技巧 103: 使用 Vim 的标签跳转命令,浏览关键字的定义 ](../chapter16_ctags/tip103.md)|[技巧 105 浏览 Quickfix 列表](tip105.md)| 12 | -------------------------------------------------------------------------------- /part1_pattern/chapter3_insert_mode/tip13.md: -------------------------------------------------------------------------------- 1 | # 技巧13: 在插入模式中回退/撤销 2 | 3 | 4 | ### 插入模式中回退 5 | ![tip13](../../images/tip13.png) 6 | 7 | 1. `` 回退一个字符(等价于`Backspace`键) 8 | 2. `` 回退一个单词 9 | 3. `` 当前行光标前全部删除 10 | 11 | #### 回退指令在`shell`中也可以使用 12 | 13 | 14 |
15 | 16 | |上一篇|下一篇| 17 | |:---|---:| 18 | | [技巧12 操作+操作符双剑合璧](../chapter2_normal_pattern/tip12.md) | [技巧14 返回普通模式](tip14.md)| 19 | -------------------------------------------------------------------------------- /part1_pattern/chapter3_insert_mode/tip16.md: -------------------------------------------------------------------------------- 1 | # 技巧16: 随时随地做运算 2 | > 使用表达式寄存器做运算 3 | 4 | 1. 大部分Vim`寄存器`保存的都是**文本/字符串** 5 | 2. `表达式寄存器`可以执行一个vim脚本,并返回结果 6 | > `=`指明使用表达式寄存器, 插入模式中`=`表明使用表达式寄存器 7 | 8 | 9 | ### 例子: 插入模式中计算6*35 10 | 11 | ![tip16](../../images/tip16.png) 12 | 13 | 14 |
15 | 16 | |上一篇|下一篇| 17 | |:---|---:| 18 | |[技巧15 不离开插入模式, 粘贴寄存器中的文本](tip15.md)|[技巧17 用字符编码插入非常用字符](tip17.md)| 19 | -------------------------------------------------------------------------------- /part6_tools/chapter18_grep_search/tip108.md: -------------------------------------------------------------------------------- 1 | # 技巧108 不必离开 Vim 也能调用 grep 2 | > vim内提供了对`grep`命令的封装,在vim内也可以调用 3 | 4 | 1. 在shell中调用系统的grep:`grep -n Waldo *` 5 | > 1. `-n`表示打印行号 6 | 7 | 2. 在vim中调用`:grep Waldo *`, 会创建一个quickfix列表;之后通过`:cnext`与`:cprev`进行切换 8 | > grep的`-i`参数表示不区分大小写 9 | 10 | 11 | |上一篇|下一篇| 12 | |:---|---:| 13 | |[技巧 107 定制外部编译器](../chapter17_compile/tip107.md)|[技巧 109 定制grep程序](tip109.md)| 14 | -------------------------------------------------------------------------------- /part1_pattern/chapter4_visual_mode/tip24.md: -------------------------------------------------------------------------------- 1 | # 技巧24: 用面向__列块__的可视模式编辑**表格数据** 2 | 3 | ### 例子: 将表格的每一列之间用竖线隔开(每行添加竖线) 4 | 5 | ![tip24](../../images/tip24.png) 6 | 7 | 1. `3j` 选中四列,每列宽1 8 | 2. `x..` 每行删3列 9 | 3. `gv` 重选上次的高亮区域 10 | 4. `r|` 将光标所在字符替换成 `|` 11 | 5. `Vr-` 选中光标所在行(`V`), 将光标所在的字符替换成`-` 12 | 13 |
14 | 15 | |上一篇|下一篇| 16 | |:---|---:| 17 | | [技巧23 尽可能使用操作符命令](tip23.md)|[技巧25 修改列文本](tip25.md)| 18 | -------------------------------------------------------------------------------- /part1_pattern/chapter4_visual_mode/tip22.md: -------------------------------------------------------------------------------- 1 | # 技巧22: 重复执行面向行的可视命令 2 | > `.`命令对于面向行的可视命令可复用 3 | 4 | ### 例子: 调整python代码的缩进 5 | 6 | ![tip22](../../images/tip22.png) 7 | 8 | 1. `Vj` 选中两行 9 | 2. `>` 将选中的行向右缩进一层 10 | 3. `.` 重复缩进操作`>` 11 | 12 | > **Note**
13 | > 1. `>.` 也可以用 `2>`替换,但是不如`>.`的及时视觉反馈来得快 14 | 15 |
16 | 17 | |上一篇|下一篇| 18 | |:---|---:| 19 | | [技巧21 选择高亮区域](tip21.md)|[技巧23 尽可能使用操作符命令,而不是可视命令](tip23.md)| 20 | -------------------------------------------------------------------------------- /part1_pattern/chapter4_visual_mode/tip25.md: -------------------------------------------------------------------------------- 1 | # 技巧25: 修改列文本 2 | 3 | ### 例子: 替换CSS中的图片路径 4 | 5 | > 将 `/images/` 替换成 `/components/` 6 | 7 | ![tip25](../../images/tip25.png) 8 | 9 | 10 | 1. `jje`: 进入列可视模式(``), 选中三行(`jj`), 每列选中到单词结尾(`e`) 11 | 2. `c`: 删除选中文本 12 | 3. ``: 显示剩下两行的修改结果 13 | 14 |
15 | 16 | |上一篇|下一篇| 17 | |:---|---:| 18 | |[技巧24 用面向__列块__的可视模式编辑](tip24.md)|[技巧26 在长短不一的高亮块中添加文本](tip26.md)| 19 | -------------------------------------------------------------------------------- /part1_pattern/chapter5_ex_mode/tip32.md: -------------------------------------------------------------------------------- 1 | # 技巧32: 自动补全Ex命令 2 | > ``自动补全 3 | 4 | 1. `` 会列出所有可用的补全列表 5 | 2. `` 会依次补全为候选(按一次,环一个候选) 6 | 7 | #### `wildmenu` 选项 8 | 9 | 1. 在`vimrc`中设置`set wildmenu`后,vim会提供补全导航列表 10 | > 1. ``, ``, `` 正向遍历列表 11 | > 2. ``, ``, `` 反向遍历列表 12 | 13 |
14 | 15 | |上一篇|下一篇| 16 | |:---|---:| 17 | |[技巧31 重复上次的Ex命令](tip31.md)|[技巧33 把当前单词插入到命令行](tip33.md)| 18 | -------------------------------------------------------------------------------- /part5_pattern/chapter14_substitute/tip94.md: -------------------------------------------------------------------------------- 1 | # 技巧94: 在替换过程中执行算术运算 2 | > 替换命令中的替换域不一定是简单的字符串,也可以是Vim脚本/表达式 3 | 4 | ### 例子: 将每一级HTML标签的层级都提升一级 5 | > ![](../../images/tip94.png) 6 | 7 | 1. 步骤1:执行`/\v\<\/?h\zs\d`查找 8 | 1. `\zs`表示设置匹配的开始位置。也就是说,虽然是查找` 1. 技巧2: `j`移动到下一行,`.`执行修改(`A;`,修改), `j.j.j.j.j.`... 8 | 9 | > 2. 技巧3: `;`移动到下一个地方,`.`执行修改(`s + `,将`+`添加左右空格), `;.;.;.`... 10 | 11 | > 3. 技巧5: `n.n.n.`...替换 12 | 13 | 14 | ### `.`范式 15 | 16 | `.`范式: 用'.'修改,且只需按一次键就能把光标移动到下一个目标 17 | 18 | 19 |
20 | 21 | |上一篇|下一篇| 22 | |:---|---:| 23 | | [技巧5 查找并手动替换](tip5.md)| [技巧7 停顿时请移开画笔](../part1_pattern/chapter2_normal_pattern/tip7.md)| 24 | -------------------------------------------------------------------------------- /part0/tip3.md: -------------------------------------------------------------------------------- 1 | # Tip3: 以退为进 2 | 3 | > 合理的推出插入模式,使得插入模式操作少,可复用 4 | 5 | ## `f{char}` 光标跳到当前行当前字符后面第一个`{char}`字符所在位置 6 | 1. `f+`光标跳到当前行下一个`+`字符处 7 | 2. `F+`光标跳到当前行上一个`+`字符处 8 | 9 | ## `s`删除光标所在字符并进入插入模式,相当于`xi` 10 | 11 | ## `;`重复上次`f{char}`指令,跳到下下个`{char}`字符 12 | ## `,`反向重复上次`f{char}`指令,跳到上上个`{char}`字符 13 | 14 | 15 | ## 例子:将代码中所有的`+`字符前后加一个空格 16 | ![tip3](../images/tip3.png) 17 | 18 | 19 |
20 | 21 | |上一篇|下一篇| 22 | |:---|---:| 23 | |[技巧2 不要自我重复](tip2.md) | [技巧4 执行、重复、回退](tip4.md)| 24 | -------------------------------------------------------------------------------- /part3_fast_move/chapter8_doc_jump/tip46.md: -------------------------------------------------------------------------------- 1 | # 技巧46: 让手指保持在 `本位行(Home Row)`上 2 | 3 | > `本位行`:键盘上`ASDFGHJKL`等字符所在的行,是盲打的停留行 4 | 5 | #### 戒掉使用光标键的习惯 6 | 7 | 可以在vimrc中设置禁用光标键: 8 | > noremap <Up> <Nop>
9 | > noremap <Down> <Nop>
10 | > noremap <Left> <Nop>
11 | > noremap <Right> <Nop>
12 | 13 |
14 | 15 | |上一篇|下一篇| 16 | |:---|---:| 17 | |[技巧45 以超级用户权限保存文件](../../part2_file/chapter7_file_opr/tip45.md)|[技巧47 区分实际行和屏幕行](tip47.md)| 18 | -------------------------------------------------------------------------------- /part2_file/chapter7_file_opr/tip42.md: -------------------------------------------------------------------------------- 1 | # 技巧42: 使用`:find`打开文件 2 | 3 | > `:find` 允许直接输入文件名查找文件,不需要直到路径,但是需要配置`path`选项 4 | 5 | ## 配置`path`选项 6 | 7 | #### `set path+=app/**` 8 | 9 | 该命令表示添加 app/ 目录及其所有子目录到`path`列表中 10 | 11 | ## 使用`:find` 查找 12 | 13 | 1. 配置完`path`之后可以使用`:find` 命令根据文件名查找文件路径了 14 | 2. `:find Main.js` ,假设目标路径中有2个`Main,js`,则会显示第一个的路径,再按一次``会切换到第二个的路径 15 | 16 | 17 |
18 | 19 | |上一篇|下一篇| 20 | |:---|---:| 21 | |[技巧41 用`:edit`命令打开文件](tip41.md)|[技巧43 使用netrw管理文件系统](tip43.md)| 22 | -------------------------------------------------------------------------------- /part1_pattern/chapter3_insert_mode/tip19.md: -------------------------------------------------------------------------------- 1 | # 技巧19: 使用替换模式替换已有文本 2 | 3 | > 替换模式类似与插入模式,但是每次插入字符的时候覆盖后面的字符 4 | 5 | ### 例子: 替换文本 6 | 7 | > 将 `line. But` 替换成 `line, but` 8 | 9 | ![tip19](../../images/tip19.png) 10 | 11 | 1. `R` 进入替换模式,直到``键按下后退出 12 | 13 | > `gR` 进入 `虚拟替换模式`:加入`制表符`占4列宽,则在制表符开始时插入前三个不会删除原来的制表符,插入第4个字符后制表符才被替换 14 | 15 | 2. `r` 替换光标所在 **字符** 16 | 17 |
18 | 19 | |上一篇|下一篇| 20 | |:---|---:| 21 | |[技巧18 用二合字母(digraph)插入非常用字符](tip18.md)|[技巧20 深入理解可视模式](../chapter4_visual_mode/tip20.md)| 22 | -------------------------------------------------------------------------------- /part6_tools/chapter19_auto_complete/tip113.md: -------------------------------------------------------------------------------- 1 | # 技巧 113 掌握关键字的来龙去脉 2 | > 介绍如何限制自动补全的候选来源 3 | > 本节命令在技巧111中有介绍过 4 | 5 | 1. ``使用缓冲区的单词做补全候选 6 | 2. ``使用引用的其他文件的关键词做候选(``相当于`include`) 7 | > 1. C语音的include、python的import、ruby的require所引用的文件都能实现 8 | > 2. `:set include?`可以查看引用的文件 9 | 3. ``使用ctags的索引关键字作为候选 10 | 11 | 普通补全(``)会把来自于缓冲区列表、包含文件以及标签文件的 单词列表组合在一起生成补全建议。 12 | 13 | 14 | |上一篇|下一篇| 15 | |:---|---:| 16 | |[技巧 112 与自动补全的弹出式菜单进行交互](tip112.md)|[技巧 114 使用字典中的单词进行自动补全](tip114.md)| 17 | -------------------------------------------------------------------------------- /part1_pattern/chapter2_normal_pattern/tip8.md: -------------------------------------------------------------------------------- 1 | # 技巧8: 把撤销的单元切成块 2 | 3 | ## `u`: 撤销上一次操作 4 | 5 | > **__一次操作__**:改变文档内文本的任意操作,`i`{insert some text}`` 是一次修改 6 | 7 | 撤销操作可能只是一个字符,可能是一段话, 控制``键的使用可使撤销命令重复作用于单词\句子\段落,这样最好 8 | 9 | ## `o` 好过 `` 10 | 11 | 插入模式中,光标位于行尾, 如果需要另起一行, 有两种方式: 12 | 13 | > 1. 直接回车(``) 14 | > 2. 跳出插入模式后在下面新开一行插入(`o`) 15 | 16 | 第二种方法更好: 撤销下一行的时候上一行的修改还在 17 | 18 | 19 |
20 | 21 | |上一篇|下一篇| 22 | |:---|---:| 23 | |[Tip7 停顿时请移开画笔](tip7.md)| [Tip9 尽量构造可重复的修改](tip9.md)| 24 | -------------------------------------------------------------------------------- /part1_pattern/chapter3_insert_mode/tip14.md: -------------------------------------------------------------------------------- 1 | # 技巧14: 返回普通模式 2 | 3 | > 大部分操作应该在普通模式中进行,快速的在普通模式,插入模式直接切换很重要 4 | 5 | ![tip14](../../images/tip14.png) 6 | 7 | 1. `` == `` ,退回到普通模式 8 | 9 | ### 插入-普通模式 10 | 11 | > 有的时候,只想在普通模式下进行一个操作,之后立刻跳回来继续插入模式,该怎么方便的操作?
12 | > **使用插入-普通模式!** 13 | 14 | #### `` 进入插入普通模式 15 | 16 | 1. **`zz`**:在插入模式中使用`zz`将当前操作行调整至屏幕中间,方便观察下面的行,继续插入操作 17 | 18 |
19 | 20 | |上一篇|下一篇| 21 | |:---|---:| 22 | |[技巧13 在插入模式中回退/撤销](tip13.md)|[技巧15 不离开插入模式, 粘贴寄存器中的文本](tip15.md)| 23 | -------------------------------------------------------------------------------- /part5_pattern/chapter15_global_cmd/tip97.md: -------------------------------------------------------------------------------- 1 | # 技巧97: 结识 global 命令 2 | > global命令允许在指定模式上的所有匹配运行Ex命令 3 | 4 | `:[range] global[!] /{pattern}/ [cmd]` 5 | 6 | 1. `:global`命令的作用范围默认是整个文件(`%`) 7 | 1. 其他Ex命令(删除、替换命令)缺省的作用范围是当前行 8 | 2. `{pattern}`域与查找历史相关联,留空则使用之前的查找模式 9 | 3. `[cmd]`可以是除`:global`命令之外的任何Ex命令 10 | 4. 将`:global`替换为`:global!`或者`:vglobal`(v表示invert),表示在没有匹配`{pattern}`的行上执行`[cmd]`操作 11 | 12 | |上一篇|下一篇| 13 | |:---|---:| 14 | |[技巧96: 在多个文件中执行查找与替换](../chapter14_substitute/tip96.md)|[技巧98: 删除所有包含模式的文本行](tip98.md)| 15 | -------------------------------------------------------------------------------- /part5_pattern/chapter15_global_cmd/tip98.md: -------------------------------------------------------------------------------- 1 | # 技巧98: 删除所有包含模式的文本行 2 | > 介绍`:global`命令和`:delete`命令复合使用 3 | 4 | ### 例子: 删除html中的标签,只保留文本 5 | > ![](../../images/tip98.png) 6 | 7 | 执行2条命令即可:`/\v\<\/?\w+>`,`:g//d` 8 | 9 | 1. 第一条命令匹配所有的html tag 10 | 2. 第二条命令对所有的匹配进行删除操作(`d`) 11 | 12 | 13 | `:v/href/d`表示删除所有不包含`href`的文本行,其中的`:v`表示`:vglobal` 14 | 15 | > `grep`命令的来源 16 | >> `:g/re/p` g表示全局执行;re表示 regular expression;p表示print 17 | 18 | |上一篇|下一篇| 19 | |:---|---:| 20 | |[技巧97: 结识 global 命令](tip97.md)|[技巧99: 将 TODO 项收集至寄存器](tip99.md)| 21 | -------------------------------------------------------------------------------- /part1_pattern/chapter3_insert_mode/tip17.md: -------------------------------------------------------------------------------- 1 | # 技巧17: 用字符编码插入非常用字符 2 | 3 | > 1. 如果知道一些特殊字符的编码,可以直接通过输入编码从键盘敲入这些字符,不需要借助外部的输入法或者手动复制粘贴 4 | > 2. atom 编辑器vim-mode不支持 5 | 6 | ### 例子 7 | 8 | ![tip17](../../images/tip17.png) 9 | 10 | 1. `{123}` 按16进制插入字符,实际插入的是`{` 11 | 2. `u{1234}` 按Unicode编码插入字符,实际插入的是`ሴ` 12 | 3. `` 之后插入`回车键`本身表达的内容`^M` 13 | 14 | #### `ga` 显示光标所在字符的`Ascii码,十进制编码,十六进制编码` 15 | 16 | 17 | 18 |
19 | 20 | |上一篇|下一篇| 21 | |:---|---:| 22 | |[技巧16 随时随地做运算](tip16.md)|[技巧18 用二合字母(digraph)插入非常用字符](tip18.md)| 23 | -------------------------------------------------------------------------------- /part5_pattern/chapter14_substitute/tip90.md: -------------------------------------------------------------------------------- 1 | # 技巧90: 重用上次的查找模式 2 | > 将替换命令的查找与留空,意味着使用上一次的查找模式,有时可以精简工作 3 | 4 | 1. `:%s/\v'(([^']|'\w)+)'/“\1”/g`等价于两条命令:`/\v'(([^']|'\w)+)'`和`:%s//“\1”/g` 5 | 1. `\v`表示``键,`\w`表示非空字符,`[^']`表示非`'`的字符 6 | 7 | 2. 我们也可以在可视模式中**选中待查找文本,然后执行`*`键来激活查找部分**,之后再使用`:%s//“\1”/g`来替换 8 | 9 | 3. `:%s/\n/,/g`:该命令把所有的换行符都替换为逗号,最终形成一行。 10 | 11 | 3. `:%s///“\1”/g`:该命令把上次查找到的内容加上左右双引号。``表示复制上次的查找内容进来 12 | 13 | |上一篇|下一篇| 14 | |:---|---:| 15 | |[技巧89: 手动控制每一次替换操作](tip89.md)|[技巧 91: 用寄存器的内容替换](tip91.md)| 16 | -------------------------------------------------------------------------------- /part0/tip1.markdown: -------------------------------------------------------------------------------- 1 | 2 | # 写作说明 3 | 4 | 1. 例子都用`###` 开头 5 | 2. 例子解法用`####` 开头 6 | 3. 需要强调的内容用 `####` 开头, 或者`**`加粗 7 | 1. 如果使用`####`, 下面必须有说明,否则只用加粗; 8 | 2. 连续两行都需要强调的内容,只能用`**`加粗 9 | 3. 能加粗,就不用`####` 10 | 4. 11 | ## 查看Vim内置文档 12 | 13 | 1. `:h XXXX` 14 | > 比如`:h vimtutor`查看vim向导 15 | 16 | ## 本文档的编码说明 17 | 18 | 1. `Ctrl-s`,`` 表示同时按住`Ctrl`键和`s`键 19 | 2. `d`:按一次`d`键 20 | 3. `daw`:依次按`d`,`a`,`w`键 21 | 22 | ## 使用Vim出厂设置 23 | 24 | `vim -u NONE -N` 25 | 26 | 27 |
28 | 29 | |返回| 30 | |:---| 31 | |[ReadME](README.md)| 32 | -------------------------------------------------------------------------------- /part3_fast_move/chapter9_file_jump/tip56.md: -------------------------------------------------------------------------------- 1 | # 技巧56: 遍历改变列表 2 | > 每次对文档修改后,vim都会记录当时光标所在位置,可以快速的在这些位置中跳转
3 | > `跳转列表`包含之前vim的所有文件的跳转情况,但是`改变列表`只是记录当前文件的改变情况 4 | 5 | 6 | #### `:changes` 查看改变列表 7 | #### `g;`,`g,`在改变列表中跳转,光标跳到之前和之后修改的位置 8 | > 和行内搜索字符的命令`f{char}`类似,`;`,`,`分别向前和向后查找 9 | 10 | 2个特殊的跳转命令 11 | 12 | 1. `` `.`` 指向最后一次修改的地方,是不能重复使用的`g;` 13 | 2. `` `^`` 指向最后一次插入模式推出时的光标位置 14 | 3. `gi` 立刻跳转到最后一次插入模式跳出的位置,并进入插入模式,**快速的继续修改** 15 | 16 | 17 |
18 | 19 | |上一篇|下一篇| 20 | |:---|---:| 21 | |[技巧55 遍历跳转列表](tip55.md)|[技巧57 跳转到光标下的文件](tip57.md)| 22 | -------------------------------------------------------------------------------- /part5_pattern/chapter12_match/tip74.md: -------------------------------------------------------------------------------- 1 | # 技巧74: 完全匹配字符串时,使用`\V` 查找 2 | > 1. 如果我们不想使用正则表达式查找,而是`完全匹配字符串`查找,就是用`\v` 3 | > 2. `\V` = `very nomagic` 4 | 5 | ### 例子:在下图文本里面查找 `a.k.a` 6 | > 假设当前光标在第一行第一个字符处 7 | 8 | ![tip74](../../images/tip74.png) 9 | 10 | 11 | 1. 如果使用`/a.k.a`,则匹配到的是`backward` 12 | 1. 因为`.`是特殊字符,能匹配任意一个字符 13 | 2. 查找到`backward`之后按`n`建也能跳到`a.k.a` 14 | 2. 或者直接转义搜`/a\.k\.a` 15 | 3. 启用**very nomagic**模式匹配`/\Va.k.a` 可以直接搜,比上面的方便 16 | 17 | |上一篇|下一篇| 18 | |:---|---:| 19 | |[技巧73: 使用`\v`模式进行正则表达式查找](tip73.md)|[技巧75: 使用`()`获取子匹配](tip75.md)| 20 | -------------------------------------------------------------------------------- /part5_pattern/chapter14_substitute/tip93.md: -------------------------------------------------------------------------------- 1 | # 技巧93: 使用子匹配重排CSV文件的字段 2 | > 本节介绍替换命令中:在替换域中使用查找模式的子匹配(减少替换域中的代码) 3 | 4 | ### 例子:交换csv文件的字段次序 5 | 6 | > 交换这些字段的次序,即把电子邮箱放到首列,其次是名字,最后一列为姓氏 7 | 8 | > ![](../../images/tip93.png) 9 | 10 | 执行2条指令即可:`/\v^([^,]*),([^,]*),([^,]*)$`、`:%s//\3,\2,\1` 11 | 12 | 1. `[^,]`表示匹配除`,`外的字符 13 | 2. `([^,]*)`表示匹配连续多个非`,`外的字符,并且将捕获的结果作为子匹配(子匹配就是一对小括号包含的内容) 14 | 3. `\1`,`\2`,`\3`表示第1、2、3个子匹配,在本例中分别指姓氏、名字和邮箱 15 | 16 | 17 | |上一篇|下一篇| 18 | |:---|---:| 19 | |[技巧92: 重复上一次 substitute 命令](tip92.md)|[技巧94: 在替换过程中执行算术运算](tip94.md)| 20 | -------------------------------------------------------------------------------- /part4_register/chapter11_macro/tip66.md: -------------------------------------------------------------------------------- 1 | # 技巧66: 加次数回放宏 2 | > 点范式(`.`重复操作)快速高效,缺点是不能指定次数,我们使用宏将`.`操作封装起来,这样就可以指定次数,减小按键了 3 | 4 | 5 | ### 例子:代码美化,让`+`前后都有空格 6 | > 对于一行代码,将其`+`附近增加空格 7 | 8 | ![tip66](../../images/tip66.png) 9 | 10 | 1. 这个例子也可以使用`f+s+;.;.;.;.;.;.;.;.;.`完成,一个个点太麻烦 11 | 2. `22`大于实际的`+`个数:利用宏的超过范围停止之后的指令,可以在找到最后一个后停止 12 | 3. `qq;.q` 是标记为`q`的宏,其内容是`;.` 13 | 4. 使用宏的时候其实是不需要计数的(保证执行的次数大于待处理的个数即可) 14 | 15 | 16 | 17 | 18 |
19 | 20 | |上一篇|下一篇| 21 | |:---|---:| 22 | |[技巧65 规范光标位置、直达目标以及终止宏](tip65.md)|[技巧67 在连续的文本行上重复修改](tip67.md)| 23 | -------------------------------------------------------------------------------- /part2_file/chapter7_file_opr/tip41.md: -------------------------------------------------------------------------------- 1 | # 技巧41: 用`:edit`命令打开文件 2 | 3 | > 1. `:edit`命令允许通过绝对路径和相对路径打开文件 4 | 5 | shell 命令的`pwd`显示当前的路径(`print working directory`) 6 | 7 | ## 相对于活动文件目录打开一个文件 8 | 9 | 1. `:edit %` 10 | > `%`表示当前工作路径,``将其展开 11 | 12 | 2. `:edit %:h` 13 | > `%:h` 表示当前工作区文件所在文件夹的完整路径 14 | 15 | **note**
16 | > 在vimrc中添加`cnoremap $$ getcmdtype() == ':' ? expand('%:h').'/':'%%'`,则每次在命令行模式中输入`%%`,都会自动显示当前工作目录路径 17 | 18 | 19 |
20 | 21 | |上一篇|下一篇| 22 | |:---|---:| 23 | |[技巧40 用标签页将窗口分组](tip40.md)|[技巧42 使用`:find`打开文件](tip42.md)| 24 | -------------------------------------------------------------------------------- /part6_tools/chapter19_auto_complete/tip117.md: -------------------------------------------------------------------------------- 1 | # 技巧 117 根据上下文自动补全 2 | > 介绍全能补全功能 3 | 4 | #### ``触发全能补全功能 5 | 1. 该功能由专用的文件类型插件实现,需要加载以下配置: 6 | ``` 7 | set nocompatible 8 | filetype plugin on 9 | ``` 10 | 2. 还需要安装为所用语音实现全能补全功能的插件 11 | 12 | 13 | ### 例子:在css文件中使用全能补全的效果图 14 | > ![](../../images/tip117.png) 15 | 16 | 0. 全能补全的效果如上图所示,当输入ba时,认为是CSS的属性的一部分;当输入完属性名之后,及时我们没有输入任何字,他也会发现是在填属性值,会提示不同于属性名的东西 17 | 1. CSS的静态语法特性决定了其非常适合全能补全 18 | 19 | 20 | |上一篇|下一篇| 21 | |:---|---:| 22 | |[技巧 116 自动补全文件名 ](tip116.md)|[技巧 118 对你的工作进行拼写检查](../chapter20_spell_check/tip118.md)| 23 | -------------------------------------------------------------------------------- /part5_pattern/chapter12_match/tip75.md: -------------------------------------------------------------------------------- 1 | # 技巧75: 使用圆括号`()`获取子匹配 2 | > 如果我们需要获取查找模式匹配的部分字符串,可以使用子匹配 3 | > 子匹配和替换模式经常搭配使用:匹配某个短语,只保留其中的某一个子匹配 4 | 5 | ### 例子:去除文本中连续出现的单词 6 | ![tip75](../../images/tip75.png) 7 | 8 | 1. `/\v<(\w+)\_s+\1>`可以完成需求 9 | 1. 上面命令中`\1`就是第一个圆括号之间匹配到的内容,表示`匹配一个单词(\w+)之后再匹配一些空格(\_s),然后再匹配前一个单词` 10 | 2. 子匹配最多可以有9个`\1`->`\9` 11 | 3. `\0`表示整个匹配 12 | 4. `<`和`>`是用来匹配单词边界,可以防止**`the the`sis**被错误匹配到,`> <`本身不匹配字符,但是可以表示前、后只单词的边界(前后是空格、文章的开头、结尾什么的) 13 | 14 | |上一篇|下一篇| 15 | |:---|---:| 16 | |[技巧74:完全匹配字符串时,使用`\V` 查找](tip74.md)|[技巧76: `<`,`>`界定单词边界](tip76.md)| 17 | -------------------------------------------------------------------------------- /part1_pattern/chapter4_visual_mode/tip20.md: -------------------------------------------------------------------------------- 1 | # 技巧20: 深入理解可视模式 2 | > 可是模式允许在选中的区域内操作 3 | 4 | ### `viw` 普通模式中选中光标所在单词 5 | > 不论此时光标在单词的首\尾\中间 6 | 7 | ### 选择模式(select mode) 8 | 9 | 1. vim中可视模式和一般的编辑器不一样:选中某个单词后按退格键不能删除单词 10 | 2. 选择模式可以! 11 | 3. 可视模式中选中后按``进入选中模式,再按退格键即可删除选中的文本 12 | 13 | ### `c`:删除并进入插入模式 14 | 15 | 1. `cw`:删除光标所在单词并进入插入模式 16 | 2. `c`:删除光标所在行及下一行并进入插入模式 17 | 3. `c$`:删除光标到行末的文本并进入插入模式 18 | 4. `c^`:删除光标到行首的文本并从行首进入插入模式 19 | 20 |
21 | 22 | |上一篇|下一篇| 23 | |:---|---:| 24 | | [技巧19 使用替换模式替换已有文本](../chapter3_insert_mode/tip19.md)|[技巧21 选择高亮区域](tip21.md)| 25 | -------------------------------------------------------------------------------- /part1_pattern/chapter5_ex_mode/tip33.md: -------------------------------------------------------------------------------- 1 | # 技巧33: 把当前单词插入到命令行 2 | 3 | > 怎么快速的把当前光标所在的单词插入正在编辑的命令行中?`` 4 | 5 | ### 例子:变量重命名(字符串替换) 6 | 7 | > 将所有的`tally`替换成`counter` 8 | 9 | ![tip33](../../images/tip33.png) 10 | 11 | 1. 将光标移动到`tally`字符串上面后,用`*`相当于 `/\`(查找光标所在单词的下一个位置) 12 | 13 | 2. 进行完上图的操作后,直接按`:%s///g`即可完成替换(因为此时光标在`counter`上,所所以指令等价于`:%s//counter/g` 14 | > 因为`*`命令,使得替换命令的查找域为空(理论上是`%s/tally/counter/g`), 具体原因看[技巧90]() 15 | 16 | 17 | 18 |
19 | 20 | |上一篇|下一篇| 21 | |:---|---:| 22 | |[技巧32 自动补全Ex命令](tip32.md)|[技巧34 回溯历史命令](tip34.md)| 23 | -------------------------------------------------------------------------------- /part5_pattern/chapter14_substitute/tip88.md: -------------------------------------------------------------------------------- 1 | # 技巧88: 在文件范围内查找并替换每一处匹配 2 | 3 | > 1. 不加任何标志位的substitue命令只会替换当前行、只替换第一处匹配 4 | > 2. `g`标志位对文件的全部内容进行替换(`global`) 5 | 6 | ### 例子:将`going`替换为`rolling` 7 | > 将下述文本中的`going`替换为`rolling` 8 | > ![](../../images/tip88-1.png) 9 | 10 | 1. 不加任何标志位,只替换第一次匹配处: 11 | > ![](../../images/tip88-2.png) 12 | 13 | 2. `g`标志位将当前行(光标所在行)所有的匹配都替换: 14 | > ![](../../images/tip88-3.png) 15 | 16 | 3. 添加`%`前缀表示在每一行都执行该替换操作: 17 | > ![](../../images/tip88-4.png) 18 | 19 | 20 | |上一篇|下一篇| 21 | |:---|---:| 22 | |[技巧87:结识 substitute 命令](tip87.md)|[技巧89: 手动控制每一次替换操作](tip89.md)| 23 | -------------------------------------------------------------------------------- /part1_pattern/chapter4_visual_mode/tip21.md: -------------------------------------------------------------------------------- 1 | # 技巧21: 选择高亮区域 2 | > 介绍如果进入可视模式的三种子模式(文本选中, 行选中, 块选中) 3 | 4 | ### 激活可视模式 5 | 6 | ![tip21](../../images/tip21.png) 7 | 8 | 1. `v`进入面向字符的可视模式 9 | > `gv` 重新选择上一次可视命令选中的位置,如果原来的单词/行被删除,显示可能有问题 10 | 11 | 2. `V`进入面向行的可视模式 12 | 3. ``进入面向列的可视模式 13 | 14 | ### 在可是模式间切换 15 | 16 | ![tip21_1](../../images/tip21_1.png) 17 | 18 | 1. `o` 在可视模式中光标移动到选中区域的另一端点, 见下面的例子 19 | 20 | ### 切换选区的活动端 21 | 22 | ![tip21_2](../../images/tip21_2.png) 23 | 24 | 25 |
26 | 27 | |上一篇|下一篇| 28 | |:---|---:| 29 | | [技巧20 深入理解可视模式](tip20.md)|[技巧22 重复执行面向行的可视命令](tip22.md)| 30 | -------------------------------------------------------------------------------- /part6_tools/chapter19_auto_complete/tip111.md: -------------------------------------------------------------------------------- 1 | # 技巧 111 结识 Vim 的关键字自动补全 2 | > 介绍vim自动补全 3 | 4 | #### ``或者``可以在插入模式下触发自动补全 5 | 两个命令同样可以在补全列表中反向或者正向选择 6 | 7 | ### 触发Vim自动补全方法总结 8 | 除了``和``,其他的自动补全方式,都需要以``开始。 9 | |命令|补全类型| 10 | |:---|:---| 11 | |``|普通关键字| 12 | |``|当前缓冲区关键字| 13 | |``|包含文件关键字| 14 | |``|标签文件关键字| 15 | |``|字典查找| 16 | |``|整行补全| 17 | |``|文件名补全| 18 | |``|全能(omni)补全| 19 | 20 | |上一篇|下一篇| 21 | |:---|---:| 22 | |[技巧 110 使用 Vim 内部的 Grep](../chapter18_grep_search/tip110.md)|[技巧 112 与自动补全的弹出式菜单进行交互](tip112.md)| 23 | -------------------------------------------------------------------------------- /part5_pattern/chapter12_match/tip72.md: -------------------------------------------------------------------------------- 1 | # 技巧72:调整查找模式的大小写敏感性 2 | > 可以全局设置,也可以每次查找的时候指定 3 | 4 | ### 全局设置 5 | 6 | 在`~/.vimrc` 添加 `set ignorecase` 即可不区分大小写进行查找 7 | > 注意:设置不区分大小写查找会影响`自动补全`效果 8 | 9 | ### 单次查找设置 10 | 11 | 查找模式下输入**`\c`XXXX**忽略大小写查找`XXXX`, **`\C`XXXX** 区分查找`XXXX` 12 | 13 | ### 智能查找 14 | 15 | 在`~/.vimrc` 添加 `set smartcase` 即可智能查找:`如果输入的单词都是小写,则使用大小写不明感查找;一旦输入的单词有一个是大写,则按照大小写敏感查找` 16 | 17 | 18 | #### 例子:不同设置下查找模式能匹配的字符串 19 | 20 | ![tip72](../../images/tip72.png) 21 | 22 | 23 | |上一篇|下一篇| 24 | |:---|---:| 25 | |[ 技巧71: 编辑宏的内容](../../part4_register/chapter11_macro/tip71.md)|[技巧73: 按正则表达式查找时,使用`\v`开关](tip73.md)| 26 | -------------------------------------------------------------------------------- /part0/tip5.md: -------------------------------------------------------------------------------- 1 | # 技巧5: 查找并手动替换 2 | 3 | ## 基本替换指令 4 | 5 | #### `:%s/content/copy/g`将文档中所有的`content`字符串替换为`copy` 6 | 7 | > 考虑到`content`这个单词有的时候是名词(`内容`),有点时候是(`满足的`),我们希望有的地方替换成copy,有的地方不替换,由编辑者每次确认是否要替换,该怎么修改指令呢? 8 | 9 | ### 改进替换指令1:连续查找+有的时候使用替换操作 10 | 11 | 1. `*`:查找光标所在单词的下一次出现 12 | 2. `#`:查找光标所在单词的上一次出现 13 | 3. `cw`:删除光标开始的字符直到单词结尾 14 | 15 | ### 例子:连续查找+有的时候使用替换操作 16 | ![tip5](../images/tip5.png) 17 | 18 | ### 改进替换指令2:加强基本替换操作 19 | 20 | #### `:s%/content/copy/gc`:将文档中的`content`字符串替换为`copy`, 每次替换前由用户确认是否替换 21 | 22 | 23 |
24 | 25 | |上一篇|下一篇| 26 | |:---|---:| 27 | |[技巧4 执行、重复、回退](tip4.md)|[技巧6 结识`.`范式](tip6.md)| 28 | -------------------------------------------------------------------------------- /part5_pattern/chapter14_substitute/tip95.md: -------------------------------------------------------------------------------- 1 | # 技巧95: 交换两个或更多的单词 2 | > 使用表达式寄存器+Vim脚本中的字典数据结构,对多个单词进行互换 3 | 4 | ### 例子: 交换`dog`和`man` 5 | > ![](../../images/tip94.png) 6 | 7 | 1. 错误解决方案:执行2条指令`:%s/dog/man/g`、`:%s/man/dog/g` 8 | 1. 第一条指令执行完后,会有2个`man`,再执行第二条会错误 9 | 2. 使用字典的解决方案: 10 | 0. 实验vim的字典:`:let swapper={"dog":"man","man":"dog"}` 11 | 1. 执行完后可以查询字典:`:echo swapper["dog"]`,`:echo swapper["man"]` 12 | 1. 解决方案part1:`/\v(|)` 13 | 2. 解决方案part2:`:%s//\={"dog":"man","man":"dog"}[submatch(1)]/g` 14 | 15 | |上一篇|下一篇| 16 | |:---|---:| 17 | |[技巧94: 在替换过程中执行算术运算 ](tip94.md)|[技巧96: 在多个文件中执行查找与替换](tip96.md)| 18 | -------------------------------------------------------------------------------- /part6_tools/chapter17_compile/tip105.md: -------------------------------------------------------------------------------- 1 | # 技巧 105 浏览 Quickfix 列表 2 | > 介绍浏览quickfix列表的几种方式 3 | 4 | 1. `:make`命令产生的错误信息、`:grep``:vimgrep`命令的匹配结果,都会加入quickfix列表中 5 | 6 | ### 浏览quickfix列表的命令 7 | 8 | |命令|用途| 9 | |:---|:---| 10 | |`:cnext`|跳转到下一项| 11 | |`:cprev`|跳转到上一项| 12 | |`:cfirst`|跳转到第一项| 13 | |`:clast`|跳转到最后一项| 14 | |`:cnfile`|跳转到下一个文件的第一项| 15 | |`:cpfile`|跳转到上一个文件的第一项| 16 | |`:cc N`|跳转到第n项| 17 | |`:copen`|打开quickfix窗口| 18 | |`:cclose`|关闭quickfix窗口| 19 | 20 | 1. 使用`:copen`打开包含quickfix列表的窗口后,可以使用`k`、`j`进行上下滚动 21 | 22 | 23 | |上一篇|下一篇| 24 | |:---|---:| 25 | |[技巧 104: 不用离开 Vim 也能编译代码](tip104.md)|[技巧 106 回溯以前的 Quickfix 列表](tip106.md)| 26 | -------------------------------------------------------------------------------- /part1_pattern/chapter5_ex_mode/tip30.md: -------------------------------------------------------------------------------- 1 | # 技巧30: 在指定范围上执行普通模式命令 2 | 3 | > `:normal {oprator}`可以在一系列连续行上执行一条普通模式命令, 结合`.`或宏命令可以花费很少的按键来完成大量重复性的任务 4 | 5 | ### 例子:给文件的每一行末尾添加`;`字符 6 | 7 | > 在`技巧2`中,如果我们想在50行的每一行的末尾加上`;`,则我们需要`A;j.j.j.j.`...按3×+2*49=101次键盘,下面的例子只需要几次按键即可完成此任务 8 | 9 | ![tip30_1](../../images/tip30_1.png) 10 | 11 | ![tip30_2](../../images/tip30_2.png) 12 | 13 | 1. `:'<,'>normal .` : 对高亮选取的每一行,执行`.`命令 14 | > 1. `:%normal A;` 表示对每一行,在结尾处插入`;` 15 | > 2. `:%normal i//` 表示对每一行,在最前面插入`//` (注释文件) 16 | 17 |
18 | 19 | |上一篇|下一篇| 20 | |:---|---:| 21 | | [技巧29 使用`:t` `:m` 进行复制和移动行](tip29.md)|[技巧31 重复上次的Ex命令](tip31.md)| 22 | -------------------------------------------------------------------------------- /part5_pattern/chapter13_search/tip80.md: -------------------------------------------------------------------------------- 1 | # 技巧80: 高亮查找匹配 2 | > vim 可以高亮查找匹配,我们可以定制开启/关闭高亮查找结果 3 | 4 | 1. 在`~/.vimrc`中设置`set hlsearch`来开启查找模式下的高亮显示 5 | 2. 有的时候查找结果会非常多(比如查找了空格, 字母a之类的), 导致满屏全是高亮文本,根本无法继续操作了,这时候`需要临时关闭高亮选项` 6 | 1. 输入`:noh` 或者`:nohlsearch` 来临时关闭高亮选项 7 | 2. 当然,你也可以查找一个根本找不到的字符串来取消高亮(比如`/slfcfwaeihfcqweuif`) 8 | 3. 按键更少的做法是制作快捷键,将`nnoremap :nohlsearch`加入`~/.vimrc`即可 9 | 1. ``在终端(linux or osx) 里面是`清除终端病重绘显示屏`的功能,和`clear`命令效果一样,设置完了只要在vim界面里面按``即可清除高亮 10 | 11 | 12 | |上一篇|下一篇| 13 | |:---|---:| 14 | |[技巧79: 查找命令入门](tip79.md)|[技巧81: 在执行查找前预览第一处匹配](tip81.md)| 15 | -------------------------------------------------------------------------------- /part6_tools/chapter18_grep_search/tip110.md: -------------------------------------------------------------------------------- 1 | # 技巧 110 使用 Vim 内部的 Grep 2 | > `:vimgrep`运行使用自带的正则表达式引擎,实现跨文件查找 3 | 4 | #### `:vim[grep][!] /{pattern}/[g][j] {file} ...` 5 | 6 | 1. 当一行有多处匹配时,`g`标志位为每一处匹配创建一条记录(默认只会为整行文本创建一项记录) 7 | 2. `j`标志位只更新quickfix列表,不跳转到第一处匹配 8 | 3. `{file}`域不能为空,可以接受的参数与`:args`命令相同,包括文件名、通配符、反引号表达式以及他们的组合。 9 | > 1. `*`匹配目录下的任意文件 10 | > 2. `**`匹配目录及子目录下的任意文件 11 | > 3. `##`匹配参数列表中的所有文件 12 | 13 | ### 例子:先在文件内查找,再扩大到整个工程 14 | 15 | 1. `/\v'(([^']|'\w)+)'` 16 | 2. `vim /// **` 17 | 18 | 19 | |上一篇|下一篇| 20 | |:---|---:| 21 | |[技巧 109 定制grep程序](tip109.md)|[技巧 111 结识 Vim 的关键字自动补全](../chapter19_auto_complete/tip111.md)| 22 | -------------------------------------------------------------------------------- /part1_pattern/chapter4_visual_mode/tip26.md: -------------------------------------------------------------------------------- 1 | # 技巧26: 在长短不一的高亮块中添加文本 2 | 3 | > **列块** 可视模式在长方形的高亮区域中很好用,在非长方形的选中区域中也可以执行 4 | 5 | ### 例子: 每行的末尾都插入`;`字符 6 | ![tip26](../../images/tip26.png) 7 | 8 | 1. 可以理解为在选中区域中进行的操作是在选中区域的第一行进行操作(比如本例的`A;`), 按下``键后作用到其他选中的行上 9 | 2. `$`: 动作命令, 选取扩展到行末 10 | 11 | ### 不同按键进入插入模式 12 | 13 | |按键|操作说明| 14 | |---|---| 15 | |`I`|从光标所在**行**的*__第一个__*字符进入插入模式| 16 | |`i`|从光标所在字符的**上一个字符**进入插入模式| 17 | |`a`|从光标所在字符的**下一个字符**进入插入模式| 18 | |`A`|从光标所在**行**的__*最后一个*__字符进入插入模式| 19 | 20 | 21 | 22 |
23 | 24 | |上一篇|下一篇| 25 | |:---|---:| 26 | | [技巧25 修改列文本](tip25.md)|[技巧27 结识Vim的命令行模式](../chapter5_ex_mode/tip27.md)| 27 | -------------------------------------------------------------------------------- /part4_register/chapter11_macro/tip64.md: -------------------------------------------------------------------------------- 1 | # 技巧64 宏的读取和执行 2 | 3 | > 宏就是把一段修改序列录制下来,然后重复执行这段操作 4 | 5 | 6 | ### 例子:修改代码并将操作制作成宏 7 | 8 | ![tip64_1](../../images/tip64_1.png) 9 | 10 | 1. 宏以`q`开始,也已`q`结束 11 | 2. `qa`开始录制宏,并保存在寄存器`a`中 12 | 3. `:reg a`查看寄存器`a`中的内容 13 | 14 | > 本例执行完,寄存器`a`中的内容是:
15 | > ![tip64.png](../../images/tip64_0.png) 16 | 17 | ### 例子1.1: 修改代码(上个例子的继续) 18 | 19 | ![tip64_2](../../images/tip64_2.png) 20 | 21 | 1. `@{register}`执行制定寄存器的内容 22 | > 本例中`@a`执行之前的操作,对第二行进行修改 23 | 2. `@@`执行最近刚**调用**的宏的命令 24 | 25 | 26 |
27 | 28 | |上一篇|下一篇| 29 | |:---|---:| 30 | |[技巧63 与系统粘贴板进行交互](tip63.md)|[技巧65 规范光标位置、直达目标以及终止宏](tip65.md)| 31 | -------------------------------------------------------------------------------- /part5_pattern/chapter12_match/tip77.md: -------------------------------------------------------------------------------- 1 | # 技巧77 界定匹配的边界(使用`\zs`, `\ze`) 2 | > 如果我们高亮所有`three apples`中的apples,不高亮three,也不高亮其他apple,怎么办? 3 | > `\zs`,`\ze`可以帮我处理这种情况! 4 | 5 | 1. `\zs`,`\ze`和`<`,`>`类似,都是very magic模式(`\v`)下面的`零宽度元字符` 6 | 7 | ### 例子:高亮`Practical Vim`中的`vim` 8 | 1. `/Practical Vim` 能匹配并且高亮 9 | 1. 需要在`~/.vimrc`中开启`hlsearch`选项 10 | 2. `Practical`也会一起被高亮,虽然他不需要被高亮! 11 | 2. `/\vPractical \zsVim`能匹配并且只高亮`vim`! 12 | 1. `\zs`表示匹配界定的开始,`\ze`表示匹配界定的结束 13 | 14 | ### 例子: 使用`\zs`,`\ze`微调匹配的结果 15 | > 见附图 16 | 17 | ![tip77](../../images/tip77.png) 18 | 19 | |上一篇|下一篇| 20 | |:---|---:| 21 | |[技巧76: 使用`<`,`>`界定单词边界](tip76.md)|[技巧78: 转义字符](tip78.md)| 22 | -------------------------------------------------------------------------------- /part5_pattern/chapter14_substitute/tip89.md: -------------------------------------------------------------------------------- 1 | # 技巧89: 手动控制每一次替换操作 2 | > `c`标志位表示每处替换前都需要确认 3 | 4 | ### 例子:将`content`替换成`copy` 5 | 执行: 6 | ``` 7 | :%s/content/copy/gc 8 | ``` 9 | 1. 引入`c`标志位后,每次替换前会提示`替换为copy?`,然后按`y`表示替换,按`n`表示不替换/跳过,全部的选项含有: 10 | 11 | |选项|含义| 12 | |:---|:---| 13 | |`y`|替换当前匹配| 14 | |`n`|忽略当前匹配| 15 | |`q`|退出替换过程| 16 | |`l`|(last)替换此处匹配后退出| 17 | |`a`|(all)替换此处与之后所有的匹配| 18 | |``|向上滚动屏幕| 19 | |``|向下滚动屏幕| 20 | 21 | 2. 执行`:h :s_c`可以在vim文档中查询上述信息 22 | 3. 替换-确认模式下,大部分按键都会失效,需要按``键退出 23 | 1. 有的时候点模式更好用,大家依赖经验选择 24 | 25 | 26 | |上一篇|下一篇| 27 | |:---|---:| 28 | |[技巧88:在文件范围内查找并替换每一处匹配](tip88.md)|[技巧90: 重用上次的查找模式](tip90.md)| 29 | -------------------------------------------------------------------------------- /part4_register/chapter11_macro/tip68.md: -------------------------------------------------------------------------------- 1 | # 技巧68: 给宏追加命令 2 | > 如果我们录制完了一个宏,但是发现少加了一些命令,怎么办? 3 | > 1. **在宏的结尾处追加** 4 | > 2. **如果缺少的命令在宏的开始或中间,则没法解决,必须重新录制宏** 5 | 6 | 7 | ### 例子:数据格式化 (同[技巧67](tip67.md)的例子) 8 | > 改变排序标号,首字母大写 9 | 10 | 假设我们录制完毕后如下: 11 | 12 | ![tip68_1](../../images/tip68_1.png) 13 | 14 | 发现少了一个`j`(移到下一行),查看一下现在的宏a的内容: 15 | 16 | ![tip68_2](../../images/tip68_2.png) 17 | 18 | 则进行补救,在宏a的结尾处添加: 19 | 20 | ![tip68_3](../../images/tip68_3.png) 21 | 22 | 1. `qa` 开始录制宏a,会覆盖之前宏a的内容 23 | 2. `qA` 将命令添加到宏a的后面,不会覆盖原来的宏a内容 24 | 25 |
26 | 27 | |上一篇|下一篇| 28 | |:---|---:| 29 | |[技巧67 在连续的文本行上重复修改](tip67.md)|[技巧69 在一组文件中执行宏](tip69.md)| 30 | -------------------------------------------------------------------------------- /part5_pattern/chapter13_search/tip79.md: -------------------------------------------------------------------------------- 1 | # 技巧79: 查找命令入门 2 | > 1. 如何制定查找方向? 3 | > 2. 如何重复上一次查找?方向重复上一次查找? 4 | > 3. 如何重复历史中的某次查找? 5 | 6 | 7 | 1. 普通模式下按`/`进入查找模式,输入完查找字符串后按回车键开始查找(中间可以按`ESC`键退出查找模式,返回普通模式) 8 | 2. `/`中输入的查找模式从上往下扫,如果稻苗到文件结尾,会提示类似`已经查找到文件结尾,再从开头继续查找` 9 | 3. 普通模式下按`?`进入反向的查找模式 10 | 4. 重复上一次查找:输入查找模式后,按`n`继续当前方向查找下一个匹配的地方,`N`反向查找下一个匹配的地方 11 | 1. 如果是`/`的查找模式,`n`查找文本后一处匹配,`N`查找文本前一处匹配 12 | 1. 如果是`?`的查找模式,`N`查找文本后一处匹配,`n`查找文本前一处匹配 13 | 5. 重复历史中的查找:输入`/`或`?`进入查找模式后,按``或者``键来查找历史查找记录,选择需要的查找历史后回车即可继续选中的历史查找 14 | 15 | 16 | 17 | |上一篇|下一篇| 18 | |:---|---:| 19 | |[技巧78: 转移问题字符](../chapter12_match/tip78.md)|[技巧80: 高亮查找匹配](tip80.md)| 20 | -------------------------------------------------------------------------------- /part6_tools/chapter20_spell_check/tip120.md: -------------------------------------------------------------------------------- 1 | # 技巧 120 将单词添加到拼写文件中 2 | > 手动添加拼写文件 3 | 4 | 1. `zg`把光标下的单词加到拼写文件中 5 | 2. `zw`把光标下的单词从拼写文件中删除 6 | 3. 假设我们编辑的是utf8编码的文件,且拼写检查采用的是英语字典,则自定义的单词都被保存到名为`~/.vim/spell/en.utf- 8.add`的文件中 7 | 8 | ### 例子:为专业术语创建拼写文件 9 | 1. vim可以同时指定多个拼写文件,可以维护多份单词列表 10 | 2. 下面的例子添加了2个自定义拼写文件: 11 | ```angular2html 12 | setlocal spelllang=en_us 13 | setlocal spellfile=~/.vim/spell/en.utf-8.add 14 | setlocal spellfile+=~/books/practical_vim/jargon.utf-8.add 15 | ``` 16 | 3. 对于被拼写检查误判的单词,目前有2种处理方式:既可以通过`2zg`添加到vim属于列表,也可以通过`1zg`添加到缺省的 17 | 18 | 19 | |上一篇|下一篇| 20 | |:---|---:| 21 | |[技巧 119 使用其他拼写字典](tip119.md)|[技巧 121 在插入模式下更正拼写错误](tip121.md)| 22 | -------------------------------------------------------------------------------- /part4_register/chapter10_copy_paste/tip61.md: -------------------------------------------------------------------------------- 1 | # 技巧61: 用寄存器中的内容替换高亮选取的文本 2 | 3 | > 在可视模式下使用粘贴命令 4 | 5 | ### 例子:替换单词(还是[技巧59](tip59.md)的例子) 6 | 7 | ![tip61_1](../../images/tip61_1.png) 8 | 9 | 1. `ve` 选中单词 10 | 2. `p`将选中的单词替换成未命名寄存器中的文本 11 | 3. **这次命令结束后未命名寄存器中的内容会被替换成somethingInTheWay** 12 | > 如果按`u`撤销操作后再重按`p`不会有任何效果 13 | 14 | ### 例子2:交换单词`chips`和`fish` 15 | 16 | ![tip61_3](../../images/tip61_3.png) 17 | 18 | 1. `de`删除当前单词 19 | 2. `p`把删除的单词粘贴到光标后面 20 | 3. `mm`在光标处设置标记为`m` 21 | 4. `` `m``跳到标记为`m`的位置 22 | 5. `c3w`,然后再重新输入单词也可以 23 | 24 | 25 | 26 |
27 | 28 | |上一篇|下一篇| 29 | |:---|---:| 30 | |[技巧60 深入理解vim寄存器](tip60.md)|[技巧62 把寄存器中的内容粘贴出来](tip62.md)| 31 | -------------------------------------------------------------------------------- /part5_pattern/chapter13_search/tip83.md: -------------------------------------------------------------------------------- 1 | # 技巧83: 将光标偏移到查找匹配的结尾 2 | > 我们可以设置在查找模式中每次查找时的光标距离匹配的起始或结尾指定步长的位置 3 | 4 | ### 例子:将文中所有的`lang`文本替换为全写`language` 5 | 6 | ![](../../images/tip83.png) 7 | 8 | 1. 使用替换模式可以完成效果:`:%s/lang/language/g` 9 | 2. 使用查找模式+`.`模式: 10 | 1. `/lang` 查找第一次出现, 然后输入`e`,`a`, `uage`, 之后重复按`n.`直到重复出现 11 | 2. 会出问题:`langs`会被替换成`langsuage`,**错误!** 12 | 3. 正确的使用查找模式+`.`模式: 13 | 1. `/lang/e` 查找第一次出现,并且光标会移动到匹配的末尾, 之后输入`a`,`uage`,然后重复`n.`即可 14 | 2. 如果查找的时候只输入了`/lang`,处理到`langs`之后才发现问题。没关系,回退对`langs`的操作,然后输入`//e`来匹配模式 15 | 16 | 17 | |上一篇|下一篇| 18 | |:---|---:| 19 | |[技巧82: 统计当前模式的匹配个数](tip82.md)|[技巧84: 对完整的查找匹配进行操作](tip84.md)| 20 | -------------------------------------------------------------------------------- /part0/tip1.md: -------------------------------------------------------------------------------- 1 | # 技巧1: 认识`.`命令 2 | 3 | ### `.`:重复上次修改 4 | 5 | ### `x`:删除光标所在的字符 6 | 7 | ### `u`:撤销上次修改 8 | 9 | ### `dd`: 删除光标所在行 10 | 11 | ### `>G`:从当前行到最后一行,每行增加一层缩进 12 | 13 | 1. `>$`:当前行向右缩进一层 14 | 2. `>`: 当前行和其下一行向右缩进一层 15 | > ``:回车键 16 | 3. `>3`: 当前行和其下3行向右缩进一层 17 | 4. `>4j`:当前行和其下4行向右缩进一层 18 | 5. `>5j`:当前行和其上5行向右缩进一层 19 | 20 | 21 | ## 上下左右移动光标 22 | 23 | 1. `h`:将光标向左移动一个字符 24 | 2. `l`:将光标向右移动一个字符 25 | 3. `j`:将光标垂直向下移动一个字符 26 | 3. `k`:将光标垂直向上移动一个字符 27 | 28 | ### 例子: 缩进代码 29 | 30 | ![tip1](../images/tip1.png) 31 | 32 |
33 | 34 | 35 | 36 |
37 | 38 | |上一篇|下一篇| 39 | |:---|---:| 40 | |[README](../README.md) |[技巧2 不要自我重复](tip2.md)| 41 | -------------------------------------------------------------------------------- /part3_fast_move/chapter8_doc_jump/tip54.md: -------------------------------------------------------------------------------- 1 | # 技巧54: 在匹配括号间跳转 2 | 3 | > vim 可以快速在开闭括号间跳转 4 | 5 | #### `%`运行在一组开、闭括号间跳转(`()[]{}`) 6 | > 例子见下图: 7 | 8 | ![tip54_1](../../images/tip54_1.png) 9 | 10 | ### 例子:将`{}`替换成`[]` 11 | > 如果先替换`}`,之后按`%`是跳不回`{`所在位置的,因为已经没有匹配的`{}`对了
12 | > 可以用``` `` ```来跳回到`上一次跳转动作之前的位置`(见[技巧53](tip53.md)) 13 | 14 | ![tip54_2](../../images/tip54_2.png) 15 | 16 | 17 | ### 例子:给选中的文本对象加分隔符 18 | > 需要 **matchit** 插件 19 | 20 | ![tip54_3](../../images/tip54_3.png) 21 | 22 | 1. `cs}]` 命令可以把 `{Donghai}`改成`[Donghai]` 23 | 24 |
25 | 26 | |上一篇|下一篇| 27 | |:---|---:| 28 | |[技巧53 设置位置标记,以便快速跳回](tip53.md)|[技巧55 遍历跳转列表](../chapter9_file_jump/tip55.md)| 29 | -------------------------------------------------------------------------------- /part5_pattern/chapter12_match/tip73.md: -------------------------------------------------------------------------------- 1 | # 技巧73: 使用`\v`模式进行正则表达式查找 2 | > 1. vim的正则表达式更接近POSIX 3 | > 1. `\v`模式使用更接近于我们日常使用的正则表达式语法风格 4 | > 2. `\v`=`very magic` 5 | 6 | ### 例子:使用magic模式匹配css文件中的颜色代码 7 | > 匹配`3c3c3c`, `0000EE`, `000` 8 | 9 | ![tip73_1](../../images/tip73.png) 10 | 11 | 1. 满足条件的magic模式下正则表达式:`/#\([0-9a-fA-F]\{6}\|[0-9a-fA-F]\{3}\)` 12 | > 需要非常多的转义!! 13 | 2. 使用very magic模式的正则表达式:`/\v#([0-9a-fA-F]{6}|[0-9a-fA-F]{3})` 14 | > 基本不用写转义字符;转义字符多了肯定容易写错! 15 | 3. 优化查找(使用16进制字符类优化): `/\v#(\x{6}|\x{3})` 16 | 17 | **very magic 模式下 `(,),|,{,}`字符变成特殊字符,表达字符凭借功能时不需要转义** 18 | 19 | |上一篇|下一篇| 20 | |:---|---:| 21 | |[技巧72:调整查找模式的大小写敏感性](tip72.md)|[技巧74: 完全匹配查找时, 使用`\V`](tip74.md)| 22 | -------------------------------------------------------------------------------- /part6_tools/chapter19_auto_complete/tip116.md: -------------------------------------------------------------------------------- 1 | # 技巧 116 自动补全文件名 2 | > shell中可以使用``来自动补全路径中的目录和文件名;Vim中也有类似的操作(``) 3 | 4 | #### ``自动补全文件名 5 | 6 | 1. 注意vim维护的是当前的工作目录,而不是当前编辑的缓冲区文件所在的目录 7 | 8 | ### 例子:自动补全引用的js文件 9 | > 假设文件目录为: 10 | > ![](../../images/tip116.png) 11 | > 需要对正在编辑的文件的src的属性值填充为application.js 12 | 13 | 1. 如果当前在vim中执行`:pwd`返回的结果为`webapp`,则自动补全的内容为相对于webapp文件夹的路径;进而,如果我们恰恰又需要将结果变成`src="js/application.js"`,则需要切换工作目录: 14 | > :cd public 15 | 16 | 2. 然后执行下面操作即可: 17 | > ![](../../images/tip116-1.png) 18 | 19 | 3. 进行完操作后执行`:cd -`回到原来的工作目录 20 | 21 | 22 | |上一篇|下一篇| 23 | |:---|---:| 24 | |[技巧 115 自动补全整行文本 ](tip115.md)|[技巧 117 根据上下文自动补全](tip117.md)| 25 | -------------------------------------------------------------------------------- /part4_register/chapter11_macro/tip65.md: -------------------------------------------------------------------------------- 1 | # 技巧65: 规范光标位置、直达目标以及终止宏 2 | > 介绍执行宏时候的最佳应用方式, 能使得宏执行的时候有更好的一致性 3 | 4 | #### 黄金法则:**录制宏时,确保每条指令都可以被重复执行** 5 | 6 | ##### rule 1: 规范光标位置 7 | 8 | 开始录制宏时,确保光标位置 9 | 10 | 1. 常见的光标位置:行首(`0`),下一处查找匹配项(`n`),当前文件的行首(`gg`) 11 | 12 | ##### rule 2: 用开始命令直达目标 13 | 14 | 1. 尽量不要使用`hhhh`,`jjj`这样的形式来达到目标位置 15 | 2. 尽量使用`w`,`b`,`e`,`ge`这样的操作 16 | 17 | 18 | ##### rule 3: 当动作命令失败时,宏终止执行 19 | 20 | 失败情况举例:光标已经位于行末,又执行了`l`命令。 21 | 22 | 1. 失败时vim会发出`哔`的声音,设置`visualbell`可以关闭提示音 23 | 2. 宏命令失败后会中止之后的指令 24 | 3. 对于查找替换类型的宏,如果不知道执行多少次,就多写一些,比如`1000@a`,执行到最后一次后会终止 25 | 26 |
27 | 28 | |上一篇|下一篇| 29 | |:---|---:| 30 | |[技巧64 宏的读取和执行](tip64.md)|[技巧66 加次数回放宏](tip66.md)| 31 | -------------------------------------------------------------------------------- /part6_tools/chapter20_spell_check/tip118.md: -------------------------------------------------------------------------------- 1 | # 技巧 118 对你的工作进行拼写检查 2 | > 启动拼写检查后,Vim将对所有未在拼写文件中出现的单词做标记 3 | 4 | ### 例子:开启拼写检查 5 | > vim中的文本为`Yoru mum has a moustache.` 6 | 7 | 1. 执行`:set spell`后,`Yoru`会高亮,一般为红色虚线 8 | 2. `[s`和`]s`可以在错误间进行反向和正向跳转 9 | 3. 当贯标位于拼错单词之上时,可以通过`z=`命令给出修改建议 10 | > 1. 如果对后续特别有信心,可以直接输入`1z=`,则直接用第一个候选替换 11 | > 2. `2z=`就是直接使用第二个候选替换 12 | 13 | ### 普通模式下,Vim拼写检查的基本命令 14 | 15 | |命令|用途| 16 | |:---|:---| 17 | |`]s`|跳到下一处拼写错误| 18 | |`[s`|跳到上一处拼写错误| 19 | |`z=`|为当前单词提供更正建议| 20 | |`zg`|把当前单词添加到拼写文件中| 21 | |`zw`|把当前单词从拼写文件中删除| 22 | |`zug`|撤销对当前单词的`zg`或`zw`命令| 23 | 24 | 25 | |上一篇|下一篇| 26 | |:---|---:| 27 | |[技巧 117 根据上下文自动补全](../chapter19_auto_complete/tip117.md)|[技巧 119 使用其他拼写字典](tip119.md)| 28 | -------------------------------------------------------------------------------- /part1_pattern/chapter3_insert_mode/tip15.md: -------------------------------------------------------------------------------- 1 | # 技巧15: 不离开插入模式, 粘贴寄存器中的文本 2 | 3 | 4 | #### 建议: 将大小写锁定键(`Caps Lock`)映射成``键 5 | 6 | 尤其是`` 键离的很远的时候 7 | > 转换方法自行google 8 | 9 | ### 例子: 在插入模式中粘贴 10 | 11 | ![tip15](../../images/tip15.png) 12 | 13 | 1. `yt,` 复制光标所在字符串直到字符`,` 14 | > `y/abc` 复制光标所在字符直到遇到字符串`abc`, 比`yt,`更强大 15 | 16 | 2. `0` 将刚刚复制的文本粘贴到光标所在处 17 | > **第10章** 会专门介绍寄存器和复制操作 18 | 19 | #### 从寄存器中插入多行文本时,建议退回普通模式插入 20 | 21 | 1. `{register}` 在只插入几个单词时效果最好. 22 | 2. 如果插入多行,而且vim设置了`textwidth`或者`autoindent`,则插入结果可能比较乱 23 | 24 | > 这个时候可以使用`{register}`来插入本文, 会修正不必要的缩进 25 | 26 |
27 | 28 | |上一篇|下一篇| 29 | |:---|---:| 30 | |[技巧14 返回普通模式](tip14.md)|[技巧16 随时随地做运算](tip16.md) | 31 | -------------------------------------------------------------------------------- /part3_fast_move/chapter8_doc_jump/tip50.md: -------------------------------------------------------------------------------- 1 | # 技巧50: 通过查找进行移动 2 | 3 | > `f{char}` 的局限性: 4 | > > 1. 只能找一个**字符**,不能找字符串 5 | > > 2. 不能跨行找 6 | > > 3. 普通的英文字符可能出现很多,单纯按一个字符查找可能没法快速定位到目的地 7 | 8 | 9 | 10 | #### `/word` 查找字符串 `word`的下一个出现位置 11 | 12 | 1. 第一次查找完后,按`n`继续查找下一个出现位置,`N`反向查找(上一个出现位置) 13 | 14 | 15 | ### 例子:查找`ta` 16 | 17 | ![tip50_1](../../images/tip50_1.png) 18 | 19 | #### 查找可以和`普通模式`,`可视模式`,`操作符待决模式`一起使用 20 | 21 | ### 例子:查找和 `可视模式` 混合使用 22 | 23 | ![tip50_2](../../images/tip50_2.png) 24 | 25 | ### 例子:查找和`操作符待决模式`一起使用 26 | > 和上一个例子完成相同任务,但是更简单 27 | 28 | ![tip50_3](../../images/tip50_3.png) 29 | 30 |
31 | 32 | |上一篇|下一篇| 33 | |:---|---:| 34 | |[技巧49 对字符串进行查找](tip49.md)|[技巧51 用精确的文本对象选择选取](tip51.md)| 35 | -------------------------------------------------------------------------------- /part5_pattern/chapter13_search/tip81.md: -------------------------------------------------------------------------------- 1 | # 技巧81: 在执行查找前预览第一处匹配 2 | 3 | 1. 默认情况下我们正在输入查找模式的情况下,vim不会进行查找,只有输入``之后才会开始查找 4 | 2. 在`~/.vimrc`中添加`set incsearch`后开启增量查找模式 5 | 1. 该模式让vim根据已输入的文本,预览第一处匹配 6 | 7 | ### 例子:开启增量查找功能后查找`carrot`字符串 8 | 9 | ![](../../images/tip81.png) 10 | 11 | 12 | 1. `增量查找功能`可以快速的查找是否存在某个字符串,对于`检查是否有匹配`的需求非常方便 13 | 2. 查找模式下的自动补全 14 | 1. 加入我们需要查找`Antetokounmpo`(字母哥), 然后通过增量查找发现输入`Ante`之后光标已经在`Antetokounmpo`下面了,这个时候我们输入``可以直接把搜索框里面的内容补全为光标所在的字符串,不需要继续输入其他字符了 15 | 1. 如果是very magic模式查找(`/v`), 则执行上面命令会变成`/vAnteAntetokounmpo`, 不可以!这时候需要先回车(确认当前查找模式),然后重新进入查找模式,直接输入`` 16 | 17 | |上一篇|下一篇| 18 | |:---|---:| 19 | |[技巧80: 高亮查找匹配](tip80.md)|[技巧82: 统计当前模式的匹配个数](tip82.md)| 20 | -------------------------------------------------------------------------------- /part3_fast_move/chapter8_doc_jump/tip49.md: -------------------------------------------------------------------------------- 1 | # 技巧49: 对字符串进行查找 2 | 3 | #### `f{char}`:行内搜索字符,跳到该字符的第一次出现位置 4 | 5 | > 没有搜到则光标不移动
6 | 7 | ![tip49_1](../../images/tip49_1.png) 8 | 9 | > `F{char}` 和`f{char}` 搜索方向相反
10 | 11 | ![tip49_4](../../images/tip49_4.png) 12 | 13 | > 搜索到第一个字符后按`;`继续向后查找改行的下一个字符出现位置
14 | 15 | ![tip49_2](../../images/tip49_2.png) 16 | 17 | > 按`,`向前查找改行的下一个字符出现位置 18 | 19 | ![tip49_3](../../images/tip49_3.png) 20 | 21 | 22 | #### `t{char}`,`T{char}` 23 | 24 | 向后查找**直到**字符`{char}`,光标停在前一个字符(如果是`T{char}`,则光标停在后一个字符) 25 | 26 | ![tip49_5](../../images/tip49_5.png) 27 | 28 | 29 | 30 |
31 | 32 | |上一篇|下一篇| 33 | |:---|---:| 34 | |[技巧48 基于单词移动](tip48.md)|[技巧50 通过查找进行移动](tip50.md)| 35 | -------------------------------------------------------------------------------- /part1_pattern/chapter2_normal_pattern/tip10.md: -------------------------------------------------------------------------------- 1 | # 技巧10 用次数做简单的算术运算 2 | 3 | > 大多数普通模式命令可以在执行时指定执行次数,利用这个进行算术运算 4 | 5 | #### `` 将光标所在数字的值增加1,``将光标所在单词减1 6 | 7 | > 1. **如果光标所在单词不是数字**,则在当前行向后查找数字,如果找到,则将其加一,否则,不操作 8 | > 2. 有的时候对`007`按``可能得到`010`,是系统将其看成了**八进制** 的数,在vimrc文件中设置 `set nrformats=` 这一行可以让vim对所有数字按十进制考虑 9 | 10 | `24` 将光标所在数字的值加`24`, `28`将光标所在数字值减28 11 | 12 | ### 例子: 修改CSS代码 13 | > 1. 将news替换成blog 14 | > 2. 将0px替换成-180px 15 | 16 | ![tip10](../../images/tip10.png) 17 | 18 | #### `yyp`: 将当前行复制成两份 19 | 20 | 等价于 `yy`(先复制当前行) + `p`(再插入到当前行的下方) 21 | 22 | #### `cw`: 删除光标所在单词,并进入插入模式 23 | 24 |
25 | 26 | |上一篇|下一篇| 27 | |:---|---:| 28 | | [Tip9 尽量构造可重复修改](tip9.md) | [Tip11 能够重复,就别用次数](tip11.md)| 29 | -------------------------------------------------------------------------------- /part6_tools/chapter16_ctags/tip102.md: -------------------------------------------------------------------------------- 1 | # 技巧102: 配置 Vim 使用 ctags 2 | > 如何告诉vim找标签文件 3 | 4 | #### 查看vim是从哪里找标签文件的:`:set tags?` 5 | 6 | #### 例子:vim中生成标签文件 7 | 8 | `:!ctags -R` 9 | > 该命令从单曲工作目录开始,遍历所有子目录,为每个文件建立索引文件 10 | 11 | ### 例子:每次保存文件时自动更新ctags 12 | 13 | `:autocmd BufWritePost * call system("ctags -R")` 14 | 15 | **可以通过版本控制工具的回调机制自动执行ctags** 16 | > Tim Pope 的《Effortless Ctags with Git》,讲解了如何为 post-commit、post-merge 以及 post-checkout等事件建立回调机制 17 | 18 | 19 | #### ctags 更新策略 20 | 1. 手动更新:容易忘记 21 | 2. 每次保存缓冲区时通过自动命令更新:对于大工程,更新ctags的速度慢,导致卡顿 22 | 3. 每次commit代码的时候自动更新:正在修改的文件可能无法正确跳转,但是当前正在开发的代码是最不可能用于标签跳转的。对于前面2种更新策略是一种折中 23 | 24 | |上一篇|下一篇| 25 | |:---|---:| 26 | |[技巧101: 结识ctags](tip101.md)|[技巧 103: 使用 Vim 的标签跳转命令,浏览关键字的定义](tip103.md)| 27 | -------------------------------------------------------------------------------- /part5_pattern/chapter15_global_cmd/tip99.md: -------------------------------------------------------------------------------- 1 | # 技巧99: 将 TODO 项收集至寄存器 2 | > `:global`和`:yank`结合可以把匹配的文本存到寄存器中 3 | 4 | ### 例子:收集代码中的`TODO`项 5 | 6 | > ![](../../images/tip99.png) 7 | 8 | 操作步骤: 9 | ```angular2html 10 | // 将寄存器a的内容清空 11 | qaq 12 | // 查看一下当前寄存器a的内容 13 | :reg a 14 | // 将包含 TODO 注释的行复制到此寄存器; A表示将匹配的结果附加到寄存器a后,而不是每次附加的时候清空寄存器a的内容 15 | :g/TODO/yank A 16 | // 查看一下当前寄存器a的内容 17 | :reg a 18 | // 再打开一个新的缓冲区 19 | // 在新的缓冲区中执行下面指令,将寄存器a中的内容复制到缓冲区 20 | "ap 21 | ``` 22 | 23 | 另一种解决方式:`:g/TODO/t$` 24 | 1. `:t` 的用法见[技巧29](../../part1_pattern/chapter5_ex_mode/tip29.md),,表示**复制到**,`:t$`表示**复制到最后一行** 25 | 2. 此条命令把所有含有**TODO**的行提取出来放到文本的最后 26 | 27 | 28 | |上一篇|下一篇| 29 | |:---|---:| 30 | |[技巧98: 删除所有包含模式的文本行 ](tip98.md)|[技巧100: 将 CSS 文件中所有规则的属性按照字母排序](tip100.md)| 31 | -------------------------------------------------------------------------------- /part3_fast_move/chapter8_doc_jump/tip53.md: -------------------------------------------------------------------------------- 1 | # 技巧53: 设置位置标记,以便快速跳回 2 | 3 | > 可以手动设置位置标记,vim也会自动的标记位置; 标记位置方便快速跳回 4 | 5 | #### `m{char}`:用选定的字母字符`{char}`标记光标所在位置 6 | 7 | #### `` `{char}``:跳到字母字符`{char}`标记的位置(行+列) 8 | > `'{char}`:跳到字母字符`{char}`标记的行 (记住`` `{char}``就行了) 9 | 10 | **Note** 11 | `mm`和`` `m``是一对常用的标记命令。前者标记,后者快速跳回来 12 | 13 | ### 自动位置标记 14 | 15 | ![tip53](../../images/tip53.png) 16 | 17 | 1. ``` `` ```:当前文件中上次跳转动作之前的位置 18 | 2. `` `.``:上次修改的地方 19 | 3. `` `^``:上次插入的地方 20 | 4. `` `[``:上次修改的起始位置 21 | 5. `` `]``:上次修改的结束位置 22 | 6. `` `>``:上次高亮选区的起始位置 23 | 4. `` `<``:上次高亮选区的结束位置 24 | 25 | **Note** 26 | > 高亮模式会默认自动标记位置标记`` `>`` `` `<``来跳转 27 | 28 |
29 | 30 | |上一篇|下一篇| 31 | |:---|---:| 32 | |[技巧52 删除周边,修改内部](tip52.md)|[技巧54 在匹配括号间跳转](tip54.md)| 33 | -------------------------------------------------------------------------------- /part1_pattern/chapter2_normal_pattern/tip12.md: -------------------------------------------------------------------------------- 1 | # 技巧12: 操作+操作符 双剑合璧 2 | 3 | #### 操作=操作+操作符 4 | 5 | > **操作符**:比如`d`(删除),`y`(复制), `c`(删除并进入插入模式)
6 | > __动作命令__: 操作符的作用范围, 比如`dl`(删除一个字符), `daw`(删除一个单词),`dap`(删除一个段落) 7 | 8 | ## 大小写转换(`g`)命令,缩进有关操作 9 | 10 | ![tip12](../../images/tip12.png) 11 | 12 | 13 | 1. `g~`大小写翻转 14 | 2. `gU`单词转大写 15 | > 1. `gUaw` 把当前词转换成大写单词 16 | > 2. `gUap` 把当前段落转换成大写单词段落 17 | > 3. `gUgU`, `gUU`把当前行换成大写 18 | 19 | 3. `gu`单词转小写 20 | 4. `>` 选中的行向右缩进一层 21 | > `>>` 或`>$`向右缩进当前行
22 | > `>` 当前行和下一行向右缩进 23 | 24 | 5. `<` 选中的行向左缩进一层 25 | > `<<` 或`<$`向左缩进当前行 26 | 6. `=` 选中的行自动对齐 27 | 7. `dd` 删除当前行 28 | 29 |
30 | 31 | |上一篇|下一篇| 32 | |:---|---:| 33 | |[技巧11 能够重复,就别用次数](tip11.md)|[技巧13 在插入模式中回退/撤销](../chapter3_insert_mode/tip13.md)| 34 | -------------------------------------------------------------------------------- /part2_file/chapter7_file_opr/tip43.md: -------------------------------------------------------------------------------- 1 | # 技巧43: 使用netrw管理文件系统 2 | 3 | > `netrw`全称是`across NETwork Read and Write files` 4 | 5 | vimrc 需要配置下面的内容 6 | > set nocompatible
7 | > filetype plugin on 8 | 9 | 10 | 1. shell 命令行输入命令`vim .`,显示如下. 按`jk`移动光标,按回车键选中文件 11 | ![tip43_1](../../images/tip43_1.png) 12 | 13 | 2. `:edit .`打开文件管理器 14 | 3. `:Explore` 打开netrw的文件管理器 15 | > `:E.` 等价`:Explore`,(但貌似不是通用的,我的不可以) 16 | 17 | `工程目录树(project drawer)`: 一般的文本编辑软件的布局结构,左侧边是目录管理器的结构 18 | 19 | ## 与分割窗口协同工作 20 | 21 | > `:Explore` 默认在活动窗口打开新文件 22 | 23 | ``打开上一次的文件(**如果上一次打开的是目录,则会报错**) 24 | 25 | 下图说明:**用工程目录树打开的新文件在原来的窗口显示** 26 | 27 | ![tip43_0](../../images/tip43_0.png) 28 |
29 | 30 | |上一篇|下一篇| 31 | |:---|---:| 32 | |[技巧42 使用`:find`打开文件](tip42.md)|[技巧44 把文件保存到不存在的目录中](tip44.md)| 33 | -------------------------------------------------------------------------------- /part4_register/chapter11_macro/tip70.md: -------------------------------------------------------------------------------- 1 | # 技巧70: 用迭代求值的方式给列表编号 2 | > 在使用宏的时候如何插入一个变化(递增)的数值 3 | 4 | ### 例子:给每行加上编号 5 | > 希望把下图上面的内容变成下图下面的内容
6 | > ![tip70_1](../../images/tip70_1.png) 7 | 8 | 解决方法:通过`:let`创建变量,每次调用宏的时候增加1,使用该变量显示行号,具体过程如下图: 9 | 10 | 1. 录制宏 11 | > ![tip70_2](../../images/tip70_2.png) 12 | 13 | 2. 并行回放宏 14 | > ![tip70_3](../../images/tip70_3.png) 15 | 16 | 17 | 说明: 18 | 19 | 1. `:let i=0` 设置变量 20 | 2. `:echo i` 打印变量 21 | 3. `=i` 在插入模式中使用表达式寄存器,并将值`i`插入 22 | 23 | #### (思考题)解法2:使用复制、粘贴+``解决 24 | > 这里我只贴代码和简要注释 25 | 26 | 1. `gg0`+`i1) ` 制作第一个 27 | 2. `qa`+`0`+`yt `+`j0`+`i `+`0`+`P`+`0`+`q` 录制宏 28 | 3. `99@a` 回放宏 29 | 30 |
31 | 32 | |上一篇|下一篇| 33 | |:---|---:| 34 | |[技巧69 在一组文件中执行宏](tip69.md)|[技巧71 编辑宏的内容](tip71.md)| 35 | -------------------------------------------------------------------------------- /part0/tip2.md: -------------------------------------------------------------------------------- 1 | # 技巧2: 不要自我重复 2 | 3 | 1. `$`:光标移动到当前行的末尾 4 | 2. `I`:在光标所在字符所在行的开头插入内容 5 | 3. `i`:在光标所在字符的上一个字符位置插入内容 6 | 4. `a`:在光标所在字符的下一个字符位置插入内容 7 | 5. `A`:在光标所在字符所在行的结尾插入内容 8 | 9 | ### 例子:每行结尾插入`;`字符 10 | 11 | 1. `$a;`:光标移动到改行末尾(`$`),在末尾插入(`a`), 插入字符(`;`),退回到普通模式(``)
12 | 2. `j$a;`:光标移动到下一行(`j`),光标移动到改行末尾(`$`),在末尾插入(`a`), 插入字符(`;`),退回到普通模式(``)
13 | 3. `j$a;`:光标移动到下一行(`j`),光标移动到改行末尾(`$`),在末尾插入(`a`), 插入字符(`;`),退回到普通模式(``)
14 | 4. ... 15 | 16 | ### 减少无关操作 17 | 18 | `A`替代了`$a`的功能,为了减少按键,应该使用`A`,上面的操作变成 19 | 20 | > `A;` 21 | > `jA;` 22 | > `jA;` 23 | > ... 24 | 25 | ### 例子: 每行末尾加上`;` 26 | ![tip2](../images/tip2.png) 27 | 28 | 29 |
30 | 31 | |上一篇|下一篇| 32 | |:---|---:| 33 | |[Tip1 认识`.`命令](tip1.md)|[Tip3 以退为进](tip3.md)| 34 | -------------------------------------------------------------------------------- /part5_pattern/chapter12_match/tip76.md: -------------------------------------------------------------------------------- 1 | # 技巧76: 使用`<`,`>`界定单词边界 2 | 3 | ### 例子:查找句子中单词`the`的所有出现地方 4 | ![tip76.md](../../images/tip76.png) 5 | 6 | 1. `/the` 会错误的匹配`these`, `their` 7 | 2. `/v` 可以正确匹配到所有单词the 8 | 1. 在very magic 模式下,`<`, `>`表示单词边界 9 | 2. `<`,`>`是`零宽度元字符`, 本身不匹配字符,仅表示**单词与围绕此单词的空白字符(或者标点符号)之间的边界** 10 | 3. **注意:** 如果在very magic 模式下面需要匹配`<`,`>`,则需要转义(`/\v\<`) 11 | 12 | 13 | ### 补充:使用圆括号`()`但是不捕获 14 | #### 例子:讲文本中所有的(姓+名)的形式替换成(名,姓)的形式 15 | >假设作者叫 feipi zhe, 或者 hanpi zhe, 也就是 `((fei|han)pi zhe)`能匹配所有的名字 16 | 1. 按顺序执行下面2条指令即可 17 | 1. `/\v(%(fei|han)pi) (zhe)` 18 | 2. `:%s//\2,\1/g` 19 | 2. 说明:`%`表示不匹配后面的括号, 所以`\1`指的是`(%(fei|han)pi)`,`\2`指的是`(zhe)` 20 | 21 | |上一篇|下一篇| 22 | |:---|---:| 23 | |[技巧75:使用圆括号`()`获取子匹配](tip75.md)|[技巧77: 界定匹配的边界(`\zs`,`\ze`的使用)](tip77.md)| 24 | -------------------------------------------------------------------------------- /part5_pattern/chapter14_substitute/tip96.md: -------------------------------------------------------------------------------- 1 | # 技巧96: 在多个文件中执行查找与替换 2 | > vim 本身没有提供跨文件的替换命令,我们可以通过命令组合间接实现 3 | 4 | ### 例子:将每个文件中的`Pragmatic Vim`替换为`Pragmatic Practical` 5 | 6 | 解决步骤: 7 | 1. 在一个文件中执行:`/Pragmatic\ze Vim`和`:%s//Practical/g` 8 | 2. 将所有待处理文件加入到参数列表:`:args **/*.txt` 9 | 3. 执行:`:set hidden` (允许在有未保存的修改时切换缓冲区) 10 | 4. 执行:`:argdo %s//Practical/g` 对缓冲区中的每个文件执行替换操作 11 | 1. 如果有的文件并不能找到替换的地方,则会报"找不到模式"的提示,可以使用`:argdo %s//Practical/ge`来忽略提示 12 | 13 | 另一种解决方法(假设所有待替换的文件都已经在vim的缓冲区列表中了): 14 | ```angular2html 15 | // 当前文件中进行查找 16 | /Pragmatic\ze Vim 17 | // 对缓冲区 18 | :vimgrep /// **/*.txt 19 | :Qargs 20 | :argdo %s//Practical/g 21 | :argdo update 22 | ``` 23 | 24 | |上一篇|下一篇| 25 | |:---|---:| 26 | |[技巧95: 交换两个或更多的单词](tip95.md)|[技巧97: 结识 global 命令](../chapter15_global_cmd/tip97.md)| 27 | -------------------------------------------------------------------------------- /part1_pattern/chapter2_normal_pattern/tip11.md: -------------------------------------------------------------------------------- 1 | # 技巧11 能够重复,就别用次数 2 | 3 | > 按键少不一定快,用可重复模块(比如`. 范式`)有的时候可能更快) 4 | 5 | ### 例子:删除一些单词 6 | > 删除成: `delete two words` 7 | 8 | ![tip11_1](../../images/tip11_1.png) 9 | 10 | #### 方法1: `d2w` 或者 `d2W` 11 | > 删除两个单词 12 | 13 | #### 方法2: `2dw` 或者 `2dW` 14 | > 做两次(删除一个单词) 15 | 16 | #### 方法3: `dw.` 17 | > 删除一个单词,重复做一次 18 | 19 | ### 三种方法对比 20 | 1. 如果是删除6个单词,前两个方法更快: `d6w` vs `6dw` vs `dw.....` 21 | 2. 如果单词数很多(10+), 前两者虽然快,但是还要数来数去, `dw....`...所见即所得,反而更好 22 | 23 | ## 次数风格(`d8w`) vs 重复风格(`dw........`): 24 | 25 | 1. 在必要时才使用次数 26 | > 次数好? 保证你的字数数的对!数的快!
27 | > ![tip11_2](../../images/tip11_2.png) 28 | 29 | 2. **因人而异**,选择用的顺手就行 30 | 31 |
32 | 33 | |上一篇|下一篇| 34 | |:---|---:| 35 | | [技巧10 用次数做简单的加减法](tip10.md) | [技巧12 操作+操作符 双剑合璧](tip12.md)| 36 | -------------------------------------------------------------------------------- /part2_file/chapter7_file_opr/tip45.md: -------------------------------------------------------------------------------- 1 | # 技巧45: 以超级用户权限保存文件 2 | 3 | > 我们想要修改一个文件,但是直接`vim file` 打开了一个只读文件忘记`sudo vim file`, 当我们第一次修改这个文件时,会提示`warning,XXXXX`,但结果我们连这个warning也没有看到,一直修改了好长时间,结果最后`:w`想保存的时候发现保存不了,`:w!`也不行,这时候该怎么办? 4 | 5 | 1. 对于只能读取,不能修改的文件,按``会提示`[readonly]` 6 | 2. 对于上面问题的解决方法: 7 | 8 | #### `:write !sudo tee % > /dev/null` 9 | > `%`表示编辑的文件的路径 10 | > tee 用法: 11 | > > 1. `tee {filepath}`,监听标准输入,把标准输入存到`{filepath}`上 12 | > > 2. `tee -a {filepath}`,把标准输入**追加**到`{filepath}`中 13 | > `> /dev/null` 重定向标准输出到垃圾桶(不显示标准输出),因为tee在接收标准输入的时候默认会同时打印出来,这个不必要,只要写到文件里就行 14 | > 实际是启动`sudo tee % > /dev/null` 来写文件,然后使用`:write`来把缓冲区作为命令的标准输入 15 | 16 | 17 |
18 | 19 | |上一篇|下一篇| 20 | |:---|---:| 21 | |[技巧44 把文件保存到不存在的目录中](tip44.md)|[技巧46 用动作命令在文档中移动](../../part3_fast_move/chapter8_doc_jump/tip46.md)| 22 | -------------------------------------------------------------------------------- /part4_register/chapter10_copy_paste/tip63.md: -------------------------------------------------------------------------------- 1 | # 技巧63: 与系统粘贴板进行交互 2 | > 如果vim启用`autoindent`选项,则在插入命令下插入系统粘贴板的时候可能排版会混乱 3 | 4 | ### 例子:从系统粘贴板复制一段代码 5 | 6 | 1. 待插入代码如下:
7 | ![tip63_0](../../images/tip63_0.png) 8 | 2. 我们在别的程序中打开这个文件,并复制到系统粘贴板 9 | 3. 在vim中进入插入模式,然后使用系统的粘贴命令(`Ctrl+V`)插入这段代码,效果如下:
10 | ![tip63_1](../../images/tip63_1.png) 11 | 12 | 这是因为`autoindent`选项启用后每次插入一个新行(输入了一个``),就会增加一层缩进,所以排版出错 13 | 14 | #### 设置`paste`选项可以避免系统剪切板的粘贴操作出现意外,但是粘贴完后必须`尽快关闭paste选项`,否则插入模式下创建的自定义映射都会失效 15 | 16 | 为了解决上面切换的代价,2种方式: 17 | 18 | 1. 设置`set pastetoggle=`,按``来启动/关闭`paste`选项 19 | 2. **推荐:** 使用家好寄存器进行粘贴`,"+p`将寄存器的内容粘贴到光标之后,不论`autoindent`是否启用,都能保证排版不会出错 20 | 21 | 22 |
23 | 24 | |上一篇|下一篇| 25 | |:---|---:| 26 | |[技巧62 把寄存器中的内容粘贴出来](tip62.md)|[技巧64 宏的读取和执行](../chapter11_macro/tip64.md)| 27 | -------------------------------------------------------------------------------- /part6_tools/chapter18_grep_search/tip109.md: -------------------------------------------------------------------------------- 1 | # 技巧 109 定制grep程序 2 | > 介绍如果配置`grepprg`与`grepformat`参数 3 | 4 | 1. `grepprg`选项负责制定所调用的shell程序 5 | 2. `grepformat`选项指示vim如何解析`:grep`命令的结果 6 | > 1. 缺省的设置为: 7 | >> `grepprg="grep -n $* /dev/null"` 8 | >> `grepformat="%f:%l:%m,%f:%l%m,%f %l%m"` 9 | >> 2. `%f`表示文件名,`%l`表示行号,`%m`表示匹配行的文本 10 | >> 3. grepformat可以包含以逗号分隔的多组格式,不过vim将采用第一种格式匹配来自`:grep`的输出结果 11 | 12 | 13 | ### 例子:通过`:grep`调用ack 14 | 1. OSX中安装ack:`brew install ack` 15 | 2. ack的默认搜索结果会按照不同文件显示在不同的区块: 16 | > ![](../../images/tip109.png) 17 | > 使用`ack --nogroup Waldo *`参数可以得到类似grep的结果 18 | 3. `:set grepprg=ack\ --nogroup\ $*`可以把`:grep`实际使用的设置为ack 19 | 4. `set grepformat=%f:%l:%c:%m`设置打印格式 20 | > `%c`表示列号 21 | 22 | 23 | |上一篇|下一篇| 24 | |:---|---:| 25 | |[技巧108 不必离开 Vim 也能调用 grep ](tip108.md)|[技巧 110 使用 Vim 内部的 Grep](tip110.md)| 26 | -------------------------------------------------------------------------------- /part1_pattern/chapter4_visual_mode/tip23.md: -------------------------------------------------------------------------------- 1 | # 技巧23: 尽可能使用操作符命令,而不是可视命令 2 | 3 | > 可视模式比普通模式操作视觉反馈更好,但是由于对于`.`操作的支持性低,所以尽量使用操作符命令 4 | 5 | ### 例子: 修改HTML代码中的标签信息进行大写转换 6 | 7 | ![tip23_1](../../images/tip23_1.png) 8 | 9 | 1. `vit` 理解为(**visually** select **inside** the **tag**), 选中标签里的内容 10 | > `it` 指的是文本对象(text object), 一种特殊的动作命令 11 | 12 | 2. 之后可以使用`j.j.`将下面两行内容也变为大写, 见下面的例子 13 | 14 | ![tip23_1_1](../../images/tip23_1_1.png) 15 | 16 | ![tip23_2](../../images/tip23_2.png) 17 | 18 | ### `vitU` vs `gUit` 19 | 20 | 1. `vitU` = `vit`(选中)+`U`(变为大写), 实际是**2**个命令 21 | 2. `gUit` = `gU`(操作符) + `it`(动作命令), 实际是**1**个命令 22 | > 可视模式下`U`等价于普通模式下`gU` 23 | 24 | 3. 两者没有优劣,但是建议需要**重复**的操作用操作符+动作命令实现 25 | 26 | 27 |
28 | 29 | |上一篇|下一篇| 30 | |:---|---:| 31 | |[技巧22 重复执行面向行的可视命令](tip22.md)|[技巧24 用面向__列块__的可视模式编辑**表格数据**](tip24.md)| 32 | -------------------------------------------------------------------------------- /part1_pattern/chapter5_ex_mode/tip29.md: -------------------------------------------------------------------------------- 1 | # 技巧29: 使用`:t` `:m` 进行复制和移动行 2 | 3 | > 1. `:t` 是 `:copy` 的缩写, 也等价于`:co`, 可以把多行复制到其他位置 4 | > 2. `:m` 是 `:move` 的缩写,把多行移动到其他位置 5 | 6 | 7 | ### 例子: 复制/移动购物清单 8 | 9 | ![tip29_1](../../images/tip29_1.png) 10 | 11 | ### 复制行 12 | 13 | 1. `:6copy.` 等价于 `:6co.` 等价于 `:6t.`: 将第3行复制到当前行下方, 效果见下图
14 | ![tip29_2](../../images/tip29_2.png) 15 | 16 | 2. 其他复制的例子见下表
17 | ![tip29_3](../../images/tip29_3.png) 18 | 19 | 20 | #### `:t.` vs `yyp` 21 | 1. 两者都是把当前行复制一份放到下面一行 22 | 2. `:t.` 不使用寄存器,`yyp`使用 23 | 24 | #### 移动行 25 | 26 | 1. `Vjj`选中待移动区域后`:m$`将其插入到文件结尾 27 | ![tip29_4](../../images/tip29_4.png) 28 | 29 | > 也可以`Vjj`选中后按`dGp` (`d`删除选中区域,`G`跳到最后一行,`p`粘贴内容) 30 | 31 | 32 |
33 | 34 | |上一篇|下一篇| 35 | |:---|---:| 36 | |[技巧28 在一行或多个连续行上执行命令](tip28.md)|[技巧30 在指定范围上执行普通模式命令](tip30.md)| 37 | -------------------------------------------------------------------------------- /part6_tools/chapter16_ctags/tip101.md: -------------------------------------------------------------------------------- 1 | # 技巧101: 结识ctags 2 | > 介绍安装tags、ctags生成的文件分析 3 | 4 | ### 安装 ctags 5 | 6 | ```angular2html 7 | // ubuntu: 8 | sudo apt-get install exuberant-ctags 9 | // OSX: 10 | brew install ctags 11 | // 检查ctags是否安装完毕: 12 | ctags --help 13 | ``` 14 | 15 | ### 例子:分析ctags生成的标签的文件 16 | 17 | 1. 执行下述命令: 18 | ```angular2html 19 | ls 20 | ctags * 21 | ls 22 | ``` 23 | > ![](../../images/tip101.png) 24 | 25 | 2. vim查看一下生成的`tags`标签文件: 26 | > ![](../../images/tip101-1.png) 27 | 28 | > 1. 标签文件的前几行为元数据; 后面每行为关键字、文件名、关键字在源码中的位置这3项构成 29 | >> 1. 关键字按照字母序排列,vim可以通过二分查找定位关键字 30 | > 2. ctags使用模式定位关键字,而不是行号 31 | >> 1. 优点在于避免添加文本导致的关键字位置错误 32 | > 3. 关键字`c`表示类,`f`表示函数 33 | 34 | |上一篇|下一篇| 35 | |:---|---:| 36 | |[技巧100: 将 CSS 文件中所有规则的属性按照字母排序](../../part5_pattern/chapter15_global_cmd/tip100.md)|[技巧102: 配置 Vim 使用 ctags](tip102.md)| 37 | -------------------------------------------------------------------------------- /part3_fast_move/chapter9_file_jump/tip58.md: -------------------------------------------------------------------------------- 1 | # 技巧58: 用全局位置标记在文件间快速跳转 2 | > 1. `全局位置标记`是一种标签,可以在文件间快速跳转。 3 | > 2. 如果我们分析完代码,想快速跳回某个文件时特别有用 4 | 5 | #### `m{char}` 在当前光标所在位置创建一个位置标记 6 | > `小写字母`建立缓冲区内的标记 (`局部`标记)
7 | > `大写字母`建立缓冲区内的标记 (`全局`标记) 8 | 9 | #### `` `{char}`` 快速跳转到光标所在处 10 | 11 | ### 例子:浏览`一些/大量`文件后跳回 12 | > 假如你需要浏览一些文件中的`foorBar()`函数,看好了之后快速跳回之前的文件继续修改,怎么操作? 13 | 14 | 1. `:vimgrep /foorBar/ **` 递归文件夹查找下一处`fooBar`的出现位置 15 | > `vimgrep`的详细用法[技巧110]()会详细说明 16 | 2. 假如我们看了10+处`fooBar`函数,怎么快速跳回刚开始的文件位置? 17 | 3. 查找之前输入`mM`记录位置,查找结束后`` `M``快速跳回 18 | > 也可以不断的按``根据跳转列表不断向前,但是如果看了很多个文件,则需要按很多次才能返回开始的文件
19 | 20 | 当预计之后可能要看比较多文件才回来继续修改的时候,强烈建议使用`m{char-upper-case}`做标记来快速跳回 21 | 22 | 23 |
gg 24 | 25 | |上一篇|下一篇| 26 | |:---|---:| 27 | |[技巧57 跳转到光标下的文件](tip57.md)|[技巧59 用无名寄存器实现删除、复制和粘帖操作](../../part4_register/chapter10_copy_paste/tip59.md) 28 | -------------------------------------------------------------------------------- /part5_pattern/chapter14_substitute/tip91.md: -------------------------------------------------------------------------------- 1 | # 技巧 91: 用寄存器的内容替换 2 | > 输入替换命令时,可以直接复制寄存器里面的内容,省的打字了 3 | 4 | 1. `:%s//0/g` 替换文本为`寄存器0`里面的内容 5 | 2. 替换命令里面**查找域**可以为空(使用上次查找命令的模板),但是**替换域**不能为空 6 | 3. `:%s//\=@0/g`含义: 7 | 1. `\=`指向后面是表达式脚本,`@0`表示返回寄存器0内的内容 8 | 2. 如果是单纯`@`(后面不接数字),表示的是无名寄存器的内容 9 | 10 | 11 | ### 例子:使用寄存器实现替换命令 12 | 13 | `:%s/Pragmatic Vim/Practical Vim/g`等价于下面3条命令: 14 | ```angular2html 15 | :let @/='Pragmatic Vim' 16 | :let @a='Practical Vim' 17 | :%s//\=@a/g 18 | ``` 19 | 1. 第一条命令采用编程方式输入查找模式,等同于执行`/Pragmatic Vim`,但是不会在查找历史中留下记录 20 | 2. 第二条命令表示设置寄存器a的内容,等同于高亮选中`Practical Vim`并执行`"ay` 21 | 3. 第三条命令表示最终的替换命令 22 | 4. 2种实现方式的区别在于,过一段时间执行,前者还是能够重复,后者只是执行`:%s//\=@a/g`,寄存器a的内容可能变了,替换的结果可能很不一样 23 | 24 | 25 | 26 | |上一篇|下一篇| 27 | |:---|---:| 28 | |[技巧90: 重用上次的查找模式](tip90.md)|[技巧92: 重复上一次 substitute 命令](tip92.md)| 29 | 30 | -------------------------------------------------------------------------------- /part4_register/tip72.md: -------------------------------------------------------------------------------- 1 | #Tip72: Tune the Case Sensitivity of Search Patterns 2 | 3 | We can tune the case sensitivity of Vim's search globally or on a per-search basis. 4 | 5 | **Setting Case Sensitivity Globally** 6 | We can make Vim's search patterns **case insensitive** by enabling the 'ignorecase' setting. But this setting has a side effect that influences the behavior of Vim's keyword autocompletion. 7 | 8 | **Setting Case Sensitivity per Search** 9 | >`\c`: causes the search pattern to **ignore case**. 10 | >`\C`: forces case sensitivity. 11 | 12 | **Enabling Smarter Default Case Sensitivity** 13 | ##'smartcase' 14 | >If our pattern include an uppercase character, 'smartcase' canceling out the 'ignorecase'. 15 | >If our pattern include all lowercase, the search will be case insensitive. 16 | 17 | #[Tip71](tip71.md) [Tip73](tip73.md) 18 | -------------------------------------------------------------------------------- /part5_pattern/chapter13_search/tip84.md: -------------------------------------------------------------------------------- 1 | # 技巧84: 对完整的查找匹配进行操作 2 | > 如果我们不仅要查找,还需要对匹配的内容进行替换,应该怎么操作? 3 | 4 | ### 例子: 将xml和xhtml全部变成大写 5 | 6 | ![](../../images/tip84.png) 7 | 8 | 1. 方法1:每次单独操作 9 | 1. 假设查找到了每个单词,对于XhtmlDocument, 执行`gU3l`或者`3gUl` 10 | 1. `gU3l` 是指向右(`l`)3个字符,将其变成大写(`U`) 11 | 2. `3gUl` 是指重复执行3次`gUl`, `gUl`是指将光标所在字符变成大写后右移光标 12 | 2. 方法2:半可重复的操作 13 | 1. `/\vX(ht)?ml\C` 来查找xml和xhtml的所有出现, 对第一次出现,执行`gU//e`,之后重复执行`//.` 14 | 1. `gU//e` 将光标匹配到的都变成大写,知道查找模式在当前匹配的结束(`e`) 15 | 2. `//.` 中`//`跳到光标结束位置,`.`重复修改操作 16 | 3. 不能用`n`跳到下次位置是因为`gU//e`修改了查找模式每次跳转之后的相对为止为文件结尾(`e`), 不能重复 17 | 3. 方法3:可重复操作 18 | 1. `/\vX(ht)?ml\C` 来查找xml和xhtml的所有出现, 之后执行`gUfl`, 后面重复 `n.` 19 | 1. `gUfl` 指将文本变成大写直到字符`l` 20 | 21 | |上一篇|下一篇| 22 | |:---|---:| 23 | |[技巧83: 将光标偏移到查找匹配的结尾](tip83.md)|[技巧85: 利用查找历史,迭代完成复杂模式](tip85.md)| 24 | 25 | -------------------------------------------------------------------------------- /part1_pattern/chapter5_ex_mode/tip27.md: -------------------------------------------------------------------------------- 1 | # 技巧27: 结识Vim的命令行模式 2 | 3 | > 1. 命令行模式需要输入:一条Ex命令 or 一条查找模式 or 一个表达式 4 | > 2. 本技巧介绍一些操作缓冲区文本的Ex命令 5 | 6 | 1. 普通模式中按下`:`键进入命令行模式 7 | > 1. 这个模式和shell下的命令行有些类似:`输入一条命令,按回车键执行` 8 | > 2. 普通模式中按`/`进入查找模式、按`=`访问表达式寄存器时, 也进入命令行模式` 9 | 10 | 2. 由于历史原因, 在命令行模式中执行的命令被称作`Ex`命令 11 | 3. 命令行模式可以干很多事情:读写文件(`:edit` 和`:write`)、创建新标签页(`:tabnew`)、分割窗口(`:split`)、操作参数列表(`:prev`、`:next`)缓冲区列表(`:bprev`、`:bnext`)... 12 | 13 | ### 操作缓冲区文本的Ex命令介绍 14 | ![tip27](../../images/tip27.png) 15 | 16 | 17 | 1. 命令行模式和插入模式类似(大部分按键输入一个字符),不同的是:命令行模式输入的文本出现在`命令行`上,插入模式输入到`缓冲区` 18 | 2. ``(回退一个单词),``(回退一个字符), `{register}`(将寄存器内的文本插入)、``(按照编码来插入字符) 等指令在命令行模式仍能使用 19 | 3. Ex命令的有点在于`有能在多行上同时执行的能力`(不需要`j.j.j.`一直按) 20 | 21 | 22 |
23 | 24 | |上一篇|下一篇| 25 | |:---|---:| 26 | |[技巧26 在长短不一的高亮块中添加文本](../chapter4_visual_mode/tip26.md)|[技巧28 在一行或多个连续行上执行命令](tip28.md)| 27 | -------------------------------------------------------------------------------- /part3_fast_move/chapter8_doc_jump/tip48.md: -------------------------------------------------------------------------------- 1 | # 技巧48: 基于单词移动 2 | 3 | ### 例子:单词级别的移动 4 | > 假设当前光标所在字符为`r`,不同按键之后光标跳转情况如下图 5 | 6 | ![tip48_2](../../images/tip48_2.png) 7 | 8 | ![tip48_1](../../images/tip48_1.png) 9 | 10 | 1. `w` 移动到下一个单词(**(for)word**)的词首 11 | 2. `b` 移动到上一个单词(**back-word**)的词首 12 | 3. `e` 移动到下一个单词(**back-word**)的词尾 13 | 4. `ge` 移动到上一个单词(**back-word**)的词尾 14 | 15 | 扩展: 16 | 17 | 1. `ea`:在单词的尾部添加 18 | 2. `gea`:在上一个单词的尾部添加 19 | 20 | ### `w`,`b`,`e` vs `W`,`B`,`E` 21 | 22 | 字串(WORD):不含空格的连续字符串 23 | 单词(word):字母、数字、下划线组成的连续字符串 24 | 25 | ### 例子:7个单词 vs 2个字串 26 | 27 | ![tip48_3](../../images/tip48_3.png) 28 | 29 | ### 例子:根据要求选择使用字串模式还是字符模式 30 | > 下面两个替换字符串的例子,使用不同的模式按键次数不一样,粒度较小的修改使用单词模式,粒度大的修改使用字串模式 31 | 32 | ![tip48_4](../../images/tip48_4.png) 33 | 34 | 35 | 36 |
37 | 38 | |上一篇|下一篇| 39 | |:---|---:| 40 | |[技巧47 区分实际行和屏幕行](tip47.md)|[技巧49 对字符串进行查找](tip49.md)| 41 | -------------------------------------------------------------------------------- /part3_fast_move/chapter9_file_jump/tip55.md: -------------------------------------------------------------------------------- 1 | # 技巧55: 遍历跳转列表 2 | > Vim 会记录跳转的前后位置,提供命令原路返回 3 | 4 | #### `:jumps` 列出跳转列表的内容 5 | #### ``,`` 跳到跳转列表的文件中之后和之前的文件 6 | 7 | #### 一些跳转动作: 8 | ![tip55_2](../../images/tip55_2.png) 9 | 10 | 1. `[count]G`跳转到制定行号,比如`10G`跳转到第10行 11 | 2. `/pattern`跳转到下一个`pattern`字符串出现的位置 12 | 3. `?pattern`跳转到上一个`pattern`字符串出现的位置 13 | 4. `%` 跳转到匹配的括号所在的地方 14 | 5. `(` 跳转到上一句开头 15 | 6. `)` 跳转到下一句开头 16 | 7. `{` 跳转到上一段开头 17 | 8. `}` 跳转到下一段开头 18 | 9. `H` 跳到当前屏幕最上方的行(`我自己实际尝试离屏幕顶部还有几行距离`) 19 | 10. `M` 跳到屏幕中间的行(`H`和`L`的中间行) 20 | 11. `L` 跳到当前屏幕最下方的行(`我自己实际尝试离屏幕顶部还有几行距离`) 21 | 12. `gf` 跳到光标下的文件名中去(文件需要和当前的文件在同一路径下) 22 | 13. `` 跳到光标所在关键字的定义位置 23 | 14. `` `{mark}``跳转到一个位置标记 24 | 25 | `` 和`` 搭配使用,可以在当前编辑文件和之前编辑文件之间快速切换 26 | 27 | 28 |
29 | 30 | |上一篇|下一篇| 31 | |:---|---:| 32 | |[技巧54 在匹配括号间跳转](../chapter8_doc_jump/tip54.md)|[技巧56 遍历改变列表](tip56.md)| 33 | -------------------------------------------------------------------------------- /part5_pattern/chapter12_match/tip78.md: -------------------------------------------------------------------------------- 1 | # 技巧78: 转移问题字符 2 | > 1. `\V`(very nomagic)模式关闭了`.,+*`等字符的特殊含义,但是还有一些字符仍然需要转移 3 | > 2. `/`,`\`,`?` 这几个字符永远都需要转移 4 | 5 | 1. `/`,`?`字符作为激活查找模式的保留字,如果查找这个字符,则永远都需要转移 6 | 2. 转义字符`\`本身也需要转义 7 | 8 | ### 例子:如何匹配一些奇怪的URL 9 | 10 | #### 匹配: `http://vimdoc.net/search?q=/\\` 11 | 12 | 1. `/\Vhttp://vimdoc.net/search?q=/\\`只能匹配到`http:` 13 | 2. `/\Vhttp:\/\/vimdoc.net\/search?q=\/\\`只能匹配到`http://vimdoc.net/search?q=/\` 14 | 3. `/\Vhttp:\/\/vimdoc.net\/search?q=\/\\\\` 是正确答案 15 | 16 | #### 逆向匹配(`?`): `http://vimdoc.net/search?q=/\\` 17 | 1. `?http://vimdoc.net/search?q=/\\` 只能匹配 `http://vimdoc.net/search` 18 | 2. `?http://vimdoc.net/search\?q=/\\` 只能匹配 `http://vimdoc.net/search?q=/\` 19 | 3. `?http://vimdoc.net/search\?q=/\\\\` 是正确答案 20 | 21 | 22 | |上一篇|下一篇| 23 | |:---|---:| 24 | |[技巧77: 界定匹配的边界(使用`\zs`, `\ze`)](tip77.md)|[技巧79: 查找命令简介](../chapter13_search/tip79.md)| 25 | -------------------------------------------------------------------------------- /part5_pattern/chapter15_global_cmd/tip100.md: -------------------------------------------------------------------------------- 1 | # 技巧100: 将 CSS 文件中所有规则的属性按照字母排序 2 | 3 | ### 例子:将 CSS 文件中所有规则的属性按照字母排序 4 | 5 | > ![](../../images/tip100.png) 6 | 7 | #### 解决方案1:每一个`{}`子块执行一次 8 | 先可视模式选中`{}`内的内容,然后调用vim内置的sort函数: 9 | > ![](../../images/tip100-1.png) 10 | 1. 对于其他的子块,重复执行即可 11 | 12 | #### 解决方案2:使用global命令排序 13 | 14 | 执行`:g/{/ .+1,/}/-1 sort`即可 15 | 16 | 1. 该命令分为`:g`,`/{/`,` .+1,/}/-1 sort`三部分,分别表示使用global命令、查找的是`{`这个符号,以及对匹配的位置使用的Ex命令 17 | 2. `.+1,/}/-1 sort`是执行的Ex命令: 18 | 1. `.`表示的是当前行,`.+1`表示的是下一行 19 | 2. `/}/`表示的是后面第一个`}`所在的行, `/}/-1`表示后面第一个`}`所在的下一行 20 | 3. 该命令表示从`.+1`行到`/}/-1`行执行`sort`命令 21 | 22 | ### 例子:对`{}`内包含的每一行向右缩进 23 | 24 | 执行`:g/{/ .+1,/}/—1 >`即可 25 | 26 | > `:>`命令每次执行会有提示(`:sort`命令不会有提示),所以可以先执行`:silent`取消提示信息 27 | 28 | 29 | |上一篇|下一篇| 30 | |:---|---:| 31 | |[技巧99: 将 TODO 项收集至寄存器](tip99.md)|[技巧101: 结识ctags](../../part6_tools/chapter16_ctags/tip101.md)| 32 | -------------------------------------------------------------------------------- /part4_register/chapter11_macro/tip71.md: -------------------------------------------------------------------------------- 1 | # 技巧71: 编辑宏的内容 2 | > 1. [技巧68](tip68.md)说明在宏结尾添加 命令容易 3 | > 2. 本技巧说明如何像编辑普通文本一样编辑宏内容 4 | 5 | ### 例子:更改排序编号的样式 6 | > 1. 把下图的文件改成`1) One`的形式 (**注意下图有的首字母大写,有的还未大写**)
7 | > 2. 假设现在宏a的内容是`0f.r)w~j`
8 | > ![tip71_1](../../images/tip71_1.png) 9 | 10 | #### 解法:把宏a的内容粘贴到文档中,然后修改,之后覆盖回宏a的寄存器中 11 | 12 | #### 步骤1:将宏粘贴到 文本 13 | 14 | `:put a` 15 | > 1. `:put a` 把 寄存器a的内容插入到`光标所在的下一行` 16 | > 2. 比`"ap` 好,因为如果寄存器a中的是面向字符的内容,则会插入光标后一个字符,可能会和原来的代码混在一起,`:put a`保证在独立的一行 17 | 18 | #### 步骤2:编辑宏 19 | ![tip71_2](../../images/tip71_2.png) 20 | 21 | 1. `~`把光标所在的字符大小写取反 22 | 2. `U`把光标所在的字符变成大写 23 | 24 | #### 步骤3:将宏从文档复制回寄存器 25 | 26 | `0`+`"ay$`+`dd` 27 | > `"add`也能达到类似效果,但是代码最后会多一个结尾字符`^J`,为了保险起见,使用先复制,再删除的方法 28 | 29 | 30 |
31 | 32 | |上一篇|下一篇| 33 | |:---|---:| 34 | |[技巧70 用迭代求值的方式给列表编号](tip70.md)|[技巧72 调整查找模式的大小写敏感性](../../part5_pattern/chapter12_match/tip72.md)| 35 | -------------------------------------------------------------------------------- /part5_pattern/chapter14_substitute/tip92.md: -------------------------------------------------------------------------------- 1 | # 技巧92: 重复上一次 substitute 命令 2 | > 有时(之前执行错了、另一个缓冲区中再执行一遍)我们需要重复执行替换命令,可以使用一些快捷方式加速 3 | 4 | ### 例子:在全局范围内执行替换操作 5 | 6 | >假设我们想把所有的`target`替换为`replacement`,但是错误执行了`:s/target/replacement/g`。 7 | 8 | 后续我们只需要执行`g&`即可达到效果。 9 | 10 | 11 | 1. `g&`等价于`:%s//~/&`,用同样的标志位、同样的替换字符串、同样的查 找模式以及新的执行范围 %,重复上一次 substitute 命令 12 | 2. 之后遇到除了没加`%`之外,其他都对的替换命令时,之后执行`g&`即可 13 | 14 | 15 | ### 例子: 对部分区域执行替换操作 16 | > 假设我们需要下面第二个`applyName....`的子块中的`Name`字符串替换为`Number` 17 | > ![](../../images/tip92.png) 18 | 19 | 1. 如果我们执行`:%s/Name/Number/g`,会**错误的**把所有的`Name`替换成`Number` 20 | 2. 发生上述错误后,我们使用`u`回退,然后高亮选中第二个子块,最后执行`:'<,'>&&`即可 21 | 1. `:&&`中第一个`&`是一个Ex命令,表示重复上一次替换命令;第二个`&`表示重复上一次替换命令的标志位 22 | 2. 选中模式中已选择部分区域后,按`:`会自动进入`:'<,'>`,其中`'<`表示光标选中的第一行,`'>`表示光标选中 23 | 3. 类似的,`:%&&`表示作用于整个文件 24 | 25 | |上一篇|下一篇| 26 | |:---|---:| 27 | |[技巧91: 用寄存器的内容替换](tip91.md)|[技巧93: 使用子匹配重排CSV文件的字段](tip93.md)| 28 | 29 | -------------------------------------------------------------------------------- /part1_pattern/chapter5_ex_mode/tip35.md: -------------------------------------------------------------------------------- 1 | # 技巧35: 运行Shell命令 2 | 3 | > vim 内可以调用shell命令 4 | 5 | > **好处:** 6 | >> 1. 可以把缓冲区的内容作为标准输入发送给标准输出发送给外部命令 7 | >> 2. 把外部命令的标准输入放到缓冲区 8 | 9 | 1. `:ls`,`:!ls` 不同,前者是vim命令,显示缓冲区内容;后者调用shell的`ls` 10 | 2. `:!ruby %` 调用ruby执行当前文件 11 | 12 | ### `:shell` 启动一个交互式的shell会话 13 | ![tip35_1](../../images/tip35_1.png) 14 | 15 | ## 把缓冲区的内容作为标准输出或输入 16 | 17 | 1. `:read !{cmd}` 把标准输出重定向到缓冲区 18 | 2. `:write !{cmd}` 把缓冲区的内容作为shell命令的标准输入 19 | 3. `:write! sh` 把缓冲区的内容写到`sh`这个文件里面 20 | 21 | 22 | ### 例子: 使用sort排序 23 | 24 | > 将记录按照姓氏排序 25 | 26 | ![tip35_2](../../images/tip35_2.png) 27 | 28 | 1. `2,$!sort -t',' -k2`即可按照姓氏排序上图的条目 29 | > `2,$`表示排序候选是第二行到最后一行 30 | > `-t','`表示按`,`分割字段 31 | > `-k2` 表示排序字段为第二列 32 | 33 | 2. 如果排序的是当前文档且光标就在第二行,直接使用`!G` (等价于`:.,$!`) 34 | 35 | 36 |
37 | 38 | |上一篇|下一篇| 39 | |:---|---:| 40 | | [技巧34 回溯历史命令](tip34.md)|[技巧36 用缓冲区列表管理打开的文件](../../part2_file/chapter6_multi_files/tip36.md)| 41 | -------------------------------------------------------------------------------- /part3_fast_move/chapter8_doc_jump/tip52.md: -------------------------------------------------------------------------------- 1 | # 技巧52: 删除周边,修改内部 2 | 3 | > vim的`文本对象`分为两类 4 | > 1. `分隔符文本对象`:对象内部的文本, 以配对的符号作为开始和结束, 比如`vit`选中XML标签内的内容 5 | > 2. `范围文本对象`:对象周围的文本, 像单词、句子、段落这样以文本结构的范围进行界定,比如`viw`选中光标所在单词 6 | 7 | ### 例子:选中单词、句子、段落 8 | 9 | ![tip52_1](../../images/tip52_1.png) 10 | 11 | #### `iw` vs `aw` 12 | 13 | 1. `iw` 包含当前光标所在单词的第一个字符到最后一个字符 14 | 2. `aw` 包含`iw`的文本连同前一个 **或** 后一个空格 15 | 16 | ### 例子:删除单词 17 | > `daw`好! 18 | 19 | ![tip52_2](../../images/tip52_2.png) 20 | 21 | 1. `daw` 符合我们想要的 22 | 2. `diw` 不好! 因为不会删除空格,导致adjectives之前有2个空格 23 | 24 | ### 例子:删除单词并进入插入模式继续输入 25 | > `ciw` 好! 26 | 27 | ![tip52_3](../../images/tip52_3.png) 28 | 29 | 1. `ciw` 正好! 30 | 2. `caw` 会多删一个空格,导致开始进入插入模式的时候会变成`mostadjectives` 31 | 32 | 33 | 34 | 35 | `d{motion}`: 和`aw`, `as`, `ap`搭配好 36 | `c{motion}`: 和`iw`, `is`, `ip`搭配好 37 | 38 |
39 | 40 | |上一篇|下一篇| 41 | |:---|---:| 42 | |[技巧51 用精确的文本对象选择选取](tip51.md)|[技巧53 设置位置标记,以便快速跳回](tip53.md)| 43 | -------------------------------------------------------------------------------- /part4_register/chapter11_macro/tip67.md: -------------------------------------------------------------------------------- 1 | # 技巧 67: 在连续的文本行上重复修改 2 | > 1. 对于在连续多行内进行的重复性修改,可以先录制一个宏,然后在每一行上回放 3 | > 2. 该宏可以设计成`串行`或`并行` 4 | 5 | ### 例子:数据格式化 6 | > 改变排序标号,首字母大写
7 | > ![tip67_1](../../images/tip67_1.png)
8 | > 变成:
9 | > ![tip67_2](../../images/tip67_2.png) 10 | 11 | #### 步骤1. 录制宏
12 | ![tip67_3](../../images/tip67_3.png) 13 | 14 | #### 步骤2. 串行方式回放宏
15 | ![tip67_4](../../images/tip67_4.png) 16 | > `0`将光标至于行首 17 | 18 | **Note** 19 | 20 | 假设文件内容如下: 21 | 22 | ![tip67_5](../../images/tip67_5.png) 23 | 24 | 该方法对于上面的情况会出错, 宏遇到一个执行错误后会停止执行后面的内容 25 | 26 | ![tip67_6](../../images/tip67_6.png) 27 | 28 | ### 解决方法:使用并行方式执行宏 29 | > 好处:行与行之间互相不影响
30 | > `并行方式`实际就是选择一段文本,制定在文本区间内同时执行 31 | 32 | ![tip67_7](../../images/tip67_7.png) 33 | 34 | 1. `:normal @a` 让vim在选中的每一行都执行`@a` 35 | 36 | `并行方式`和`串行方式`没有好坏之分,分情况使用 37 | 38 |
39 | 40 | |上一篇|下一篇| 41 | |:---|---:| 42 | |[技巧66 加次数回放宏](tip66.md)|[技巧68 给宏追加命令](tip68.md)| 43 | -------------------------------------------------------------------------------- /part5_pattern/chapter14_substitute/tip87.md: -------------------------------------------------------------------------------- 1 | # 技巧87: 结识 substitute 命令 2 | > 替换命令可以选择进行替换的范围 3 | 4 | `:[range]s/{pattern}/{string}/[flags]` 5 | 1. `{pattern}`表示待替换的字符串的正则表达式 6 | 2. `{string}`表示替换成的字符串 7 | 3. `[flags]`(标志位)候选有: 8 | 1. `g`表示全局范围执行替换 9 | 2. `c`表示每查找到一处,替换前都需要确认 10 | 3. `n`表示只统计匹配的数量,不进行替换 11 | 4. `e`表示不显示错误提示(没有找到pattern) 12 | 5. `&`表示使用上一次替换模式使用的标志位 13 | 4. 在替换域中有一些特殊字符,包括: 14 | 15 | |符号|描述| 16 | |:---|:---| 17 | |`\r`|插入换行符| 18 | |`\t`|插入制表符| 19 | |`\\`|插入反斜杠| 20 | |`\1`|插入第一个子匹配(第一个括号包住的内容)| 21 | |`\2`|插入第二个子匹配(最多到`\9`)| 22 | |`\0`|插入匹配模式的所有内容| 23 | |`&`|插入匹配模式的所有内容| 24 | |`~`|使用上一次调用`替换命令`时的{string}| 25 | |`\={Vim Script}|执行{Vim Script}表达式:并将返回的结果作为替换{string}| 26 | 27 | 28 | 5. 更多的实例操作参考[技巧92](tip92.md)、[技巧93](tip93.md) 29 | 6. `\={Vim script}`的使用方式见[技巧94](tip94.md)、[技巧95](tip95.md) 30 | 31 | 32 | |上一篇|下一篇| 33 | |:---|---:| 34 | |[技巧86:查找当前高亮选区中的文本](../chapter13_search/tip86.md)|[技巧88: 在文件范围内查找并替换每一处匹配](tip88.md)| 35 | 36 | -------------------------------------------------------------------------------- /part1_pattern/chapter2_normal_pattern/tip9.md: -------------------------------------------------------------------------------- 1 | # 技巧9 尽量构造可重复的修改 2 | 3 | > 1. Vim 的设计对重复操作进行了优化,我们要利用他,尽可能的构造可重复的修改 4 | > 2. 一般认为,按键越少越好, 感兴趣的可以去 [VimGolf](http://vimgolf.com) 练习 5 | 6 | ## 比较几种删除单词的操作优劣 7 | 8 | > 假设光标在单词的末尾(`h`) 9 | 10 | ### 1. 反向删除单词 `dbx` 11 | 12 | ![tip9_1](../../images/tip9_1.png) 13 | 14 | `db` 删除贯标起始位置到单词开头位置的内容,但不删除光标所在单词, 补一个`x`删除光标所在字符 15 | 16 | ### 2. 正向删除 `bdw` 17 | 18 | ![tip9_2](../../images/tip9_2.png) 19 | 20 | `b` 跳到光标所在单词开头, `dw` 删除起始位置直到单词结尾的整个单词,包括起始位置 21 | 22 | 23 | ### 3. `daw` 24 | 25 | ![tip9_3](../../images/tip9_3.png) 26 | 27 | `aw` 指一个文本对象, `daw` 理解为 `delete a word` 28 | 29 | ### 三种删除方式比较 30 | 31 | 1. `daw` 好! 32 | 2. `daw` 可以使用`.` 重复删除单词 33 | 3. `dbx` 之后使用 `.` 等价于 `x`, 34 | 4. `bdw` 之后使用`.` 大多数情况没问题 35 | > 但是如果是从文件的最后一个单词删除, 相当于不断`dw`,`dw`,...而此时的word其实是倒数第二个单词的最后一个字符,所以之后按`.`只能删除一个字符,不是一个单词 36 | 37 | 38 |
39 | 40 | |上一篇|下一篇| 41 | |:---|---:| 42 | | [技巧8 把撤销的单元切换成块](tip8.md) | [技巧10 用次数做简单的算术运算](tip10.md)| 43 | -------------------------------------------------------------------------------- /part5_pattern/chapter13_search/tip85.md: -------------------------------------------------------------------------------- 1 | # 技巧85: 利用查找历史, 迭代完成复杂的模式 2 | > 写一个正则表达式匹配长字符串总是复杂的过程,我们可以利用查找历史迭代的做 3 | 4 | ### 例子: 匹配所有单引号(`''`)之间的内容,并进行替换 5 | 6 | ![](../../images/tip85.png) 7 | 8 | #### 1. 先考虑匹配 9 | 1. 错误尝试1: `/\v'.+'` 10 | 1. 结果如下,这是因为`。+`是贪心匹配,总会匹配最长的结果 11 | ![](../../images/tip85_1.png) 12 | 2. 错误尝试2: `/\v'[^']+'` 13 | 1. 结果如下,`[^']+`表示匹配非`'`的任意多个字符,但是没有办法区别`doesn't`的`'` 14 | ![](../../images/tip85_2.png) 15 | 3. 正确尝试3: `/\v'([^']|'\w)+'` 16 | 1. 可以正确匹配到样例的所有情况 17 | 18 | #### 2. 匹配+替换结合 19 | 20 | 1. 执行`/\v'(([^']|'\w)+)'` 21 | 2. 执行 `:%s//“\1”/g` 22 | 1. `\1`在命令1中已经被赋值为第一个匹配到的括号内的内容(单引号之间的内容) 23 | 24 | #### 3. 一条语句 25 | 26 | `:%s/\v'(([^']|'\w)+)'/“\1”/g` 27 | 28 | #### 迭代完成 29 | 30 | 在迭代修改正则表达式匹配的过程中,我们可以通过2种方式利用前一次的结果 31 | 32 | 1. `/` 来调用上一次的匹配模式 33 | 2. (当正则表达式变得复杂时推荐)普通模式下`q/`调出命令行窗口来显示历史语句, 这样我们可以像修改文件一样来修改上一次的命令 34 | 35 | |上一篇|下一篇| 36 | |:---|---:| 37 | |[技巧84: 对完整的查找匹配进行操作](tip84.md)|[技巧86: 查找当前高亮选区中的文本](tip86.md)| 38 | 39 | -------------------------------------------------------------------------------- /part1_pattern/chapter5_ex_mode/tip34.md: -------------------------------------------------------------------------------- 1 | # 技巧34: 回溯历史命令 2 | 3 | > 回溯之前之执行过的命令的两种方式: 4 | > > 1. 用光标键回滚 5 | > > 2. 调出命令行窗口查看历史命令 6 | 7 | 1. 先按`:`,然后保持提示符为空下按``,则刚刚执行的命令会覆盖在命令行上,``键反向 8 | > 1. 对于查找命令(普通模式下按`/`进入),vim也保存其历史记录,按``,``键切换 9 | > 2. 命令行下历史记录的查找可以用``, ``来分别替代``,``键,好处是手指移动距离短,坏处是没有``,``键对历史记录过滤的功能 10 | > > 将两者结合:在vimrc中添加下面两行,把命令行模式下的``, ``映射成``,`` 11 | > > `cnoremap ` 12 | > > `cnoremap ` 13 | 14 | 2. 设置vimrc `set history=200`可以修改vim保存200条历史命令记录 15 | 16 | ### 命令行窗口 17 | 18 | 1. `q:`进入命令行窗口 19 | > 1. 在命令行历史窗口中,`j`,`k`上下移动 20 | > 2. 命令行历史窗口内支持`/`,`?`查找命令 21 | > 3. 命令行历史窗口内按回车键执行光标所在命令 22 | > 4. 窗口打开后拥有焦点,`:q`退出 23 | 24 | 2. 进入命令行模式的3中方法:见下图 25 | 26 | ![tip34_2](../../images/tip34_2.png) 27 | 28 | ### 例子: **利用命令行窗口合并历史命令** 29 | 30 | ![tip34_1](../../images/tip34_1.png) 31 | 32 | 33 | 34 |
35 | 36 | |上一篇|下一篇| 37 | |:---|---:| 38 | | [技巧33 把当前单词插入到命令行](tip33.md)|[技巧35 运行Shell命令](tip35.md)| 39 | -------------------------------------------------------------------------------- /part2_file/chapter6_multi_files/tip36.md: -------------------------------------------------------------------------------- 1 | # 技巧36: 用缓冲区列表管理打开的文件 2 | 3 | > vim 的一次编辑会话可以打开多个文件,vim的缓冲区列表对文件进行管理 4 | 5 | ## 文件 vs 缓冲区 6 | 7 | 1. vim中`正在编辑一个文件` 其实是`正在编辑一个缓冲区` 8 | 2. 文件存在磁盘,缓冲区存在内存 9 | 10 | ## 查看/切换缓冲区列表 11 | 12 | ![tip36_2](../../images/tip36_2.png) 13 | 14 | 1. `vim *.txt`假设打开2个文件文件, 会默认只显示第一个文件 15 | 16 | 2. `:ls`显示缓冲区的所有文件,其中: 17 | > 1. `%`表明当前窗口中可见的缓冲区 18 | > 2. `#`表示轮换文件,即上一次打开的文件 19 | 20 | 3. `:bnext` 切换到下一个文件的缓冲区 21 | > 1. `:bprev` 切换到上一次的文件缓冲区 22 | > 2. `:bfirst` 切换到缓冲区列表中第一个文件的缓冲区 23 | > 3. `:blast` 切换到缓冲区列表中最后一个文件的缓冲区 24 | > 4. `` 在当前文件和轮换文件间快速切换 25 | > 5. `:buffer N` 跳到编号为`N`的缓冲区 26 | 27 | 4. `:bufdo` 允许在打开的所有缓冲区中执行Ex命令(作用在多个文件上) 28 | 5. `:argdo` 比`:bufdo`实用(后面讲) 29 | 30 | 31 | ## 删除缓冲区 32 | 33 | 1. `:bdelete` 删除缓冲区
34 | > `:bdelete 1 2 4`:删除编号为1,2,4的缓冲区 35 | 36 | **vim 内置的缓冲区管理不灵活,之后的几个技巧介绍如何将缓冲区进行自定义的组织、分割** 37 | 38 |
39 | 40 | |上一篇|下一篇| 41 | |:---|---:| 42 | |[技巧35 运行Shell命令](../../part1_pattern/chapter5_ex_mode/tip35.md)|[技巧37 用参数列表将缓冲区分组](tip37.md)| 43 | -------------------------------------------------------------------------------- /part4_register/chapter10_copy_paste/tip62.md: -------------------------------------------------------------------------------- 1 | # 技巧62: 把寄存器中的内容粘贴出来 2 | > 普通模式下的粘贴命令,待插入的文本不同,粘贴指令的执行效果也不同
3 | > 面向行和面向字符的粘贴指令效果不同 4 | 5 | 1. `xp`交换2个字符顺序 6 | 2. `ddp`交换2行顺序 7 | 8 | 9 | 1. `p`将文本粘贴到光标之前 10 | 2. `P`将文本粘贴到光标之后 11 | 12 | > 1. `前`和`后`有两种理解:前一行/后一行,前一列/后一列 13 | > 2. 面向`行`的删除和复制:粘贴操作粘贴到光标的`前一行和后一行` 14 | > 3. 面向`字符`的删除和复制:粘贴操作粘贴到光标的`前一字符和后一字符` 15 | 16 | ## 粘贴面向字符的区域 17 | 18 | ### 例子:将寄存器中的单词插入光标位置 19 | 20 | ![tip62_1](../../images/tip62_1.png) 21 | 22 | 1. 上一个用`p`,下一个用`P` 23 | 2. `p`和`P`经常会用错,导致`puP`或`Pup`的按键序列出现 24 | 3. 好的方法是进入插入模式后按`"`或`0`来粘贴 25 | 26 | ### 例子1:使用插入模式来替换单词(还是[技巧59](tip59.md)的例子) 27 | 28 | ![tip62_2](../../images/tip62_2.png) 29 | 30 | 31 | ## 粘贴面向行的区域 32 | 33 | 比面向字符的粘贴更直观 34 | 35 | #### `gp` 类似与`p`, 区别在于粘贴后光标位于插入的文本的末尾(`p`位于开头) 36 | #### `gP` 类似与`P`, 区别在于粘贴后光标位于插入的文本的末尾(`P`位于开头) 37 | 38 | 39 | ### 例子:复制表格的html 40 | 41 | ![tip62_3](../../images/tip62_3.png) 42 | 43 | 44 |
45 | 46 | |上一篇|下一篇| 47 | |:---|---:| 48 | |[技巧61 用寄存器中的内容替换高亮选取的文本](tip61.md)|[技巧63 与系统粘贴板进行交互](tip63.md)| 49 | -------------------------------------------------------------------------------- /part6_tools/chapter17_compile/tip107.md: -------------------------------------------------------------------------------- 1 | # 技巧 107 定制外部编译器 2 | > 介绍如何使用vim的`:make`命令调用任何安装在机器上的编译器 3 | 4 | ### 例子:在vim中调用nodelint编译js代码 5 | > ![](../../images/tip107.png) 6 | 1. 安装nodelint:`npm install nodelint -g` 7 | 2. 配置‘:make’,使其调用 Nodelint:`:setlocal makeprg=NODE_DISABLE_COLORS=1\ nodelint\ %` 8 | > 1. `%`表示当前文件所在路径 9 | > 2. 该命令相当于在shell中运行的2条指令:`export NODE_DISABLE_COLORS=1`和`nodelint ~/quickfix/fizzbuzz.js` 10 | > 3. nodelint默认采用ANSI 色标编码把错误信息高亮为红色,配置信息`NODE_DISABLE_COLORS=1`将该高亮禁用,(减少特殊字符的输出),可以更容易地解析出错信息 11 | 12 | ### 例子:用nodelint的输出结果填充quickfix列表 13 | 14 | 1. `:setglobal errorformat?`查看vim解析`:make`结果的输出格式 15 | 2. `:setlocal efm=%A%f\,\ line\ %l\,\ character\ %c:%m,%Z%.%#,%-G%.%#`将输出格式进行改变 16 | 17 | ### 例子:用一条命令设置‘makeprg’与‘errorformat’ 18 | `:compiler nodelint` 19 | 相当于执行下述一系列操作: 20 | > ![](../../images/tip107.png) 21 | 22 | 23 | #### `:args $VIMRUNTIME/compiler/*.vim`命令列出了vim自带的编译器插件 24 | 25 | 26 | |上一篇|下一篇| 27 | |:---|---:| 28 | |[技巧 106 回溯以前的 Quickfix 列表 ](tip106.md)|[技巧 108 不必离开 Vim 也能调用 grep](../chapter18_grep_search/tip108.md)| 29 | -------------------------------------------------------------------------------- /part1_pattern/chapter5_ex_mode/tip28.md: -------------------------------------------------------------------------------- 1 | # 技巧28: 在一行或多个连续行上执行命令 2 | 3 | ### 例子:使用命令行打印代码 4 | 5 | ![tip28_1](../../images/tip28_1.png) 6 | 7 | ### 用行号做地址 8 | 1. `:1` 跳到第一行 9 | 2. `:print` 将第一行的内容打印到命令行上显示 10 | 3. `:$` 跳到最后一行 11 | 4. `p` 等于`:print` 12 | 13 | ### 用地址指定一个范围 14 | 5. `:5p` 光标移动到第5行并打印改行 15 | 6. `:2,5p` 打印第二到第5行的内容(**含第二行和第五行**) 16 | 7. `:.,$p` 打印当前行到最后一行的内容(`.`代表当前行,`$`代表最后一行) 17 | 8. `%p` 打印所有行 18 | 9. `%s/Practical/iampkuhz/` 把所有的`Practical` 单词替换成 `iampkuhz` 19 | 20 | ### 用高亮选取指定范围 21 | 22 | > 假设已经在可视模式下选中下面的文本 23 | 24 | ![tip28_2](../../images/tip28_3.png) 25 | 26 | 10. 在上面的可视选取选中后按`:`,则命令行会预先填充`:'<,'>` 27 | > `'<`代表高亮选区的第一行, `'>`代表高亮选区的最后一行 28 | 11. `://,/<\/html>/p`, 在本例中等价于`2,5p` 29 | > `//`表示的是 `` 所在地址, `/<\/html>/`表示的是 ``所在地址(含有转义字符) 30 | 12. `://+1,/<\/html>/-1p`, 在本例中等价于`2+1,5-1p`,等价于`3,4p` 31 | 32 | ### Ex命令的地址和范围符号总结 33 | 34 | ![tip28_2](../../images/tip28_2.png) 35 | 36 | 37 |
38 | 39 | |上一篇|下一篇| 40 | |:---|---:| 41 | |[技巧27 结识Vim的命令行模式](tip27.md)|[技巧29 使用`:t` `:m` 进行复制和移动行](tip29.md)| 42 | -------------------------------------------------------------------------------- /part2_file/chapter6_multi_files/tip40.md: -------------------------------------------------------------------------------- 1 | # 技巧40: 用标签页将窗口分组 2 | 3 | > vim里 可以用标签页把窗口组织到一系列工作区里 4 | 5 | 1. `标签页`是可以容纳多个窗口的容器 6 | 2. `标签页`和`缓冲区`不是一一对应的! 7 | 3. 可以将`标签页`理解成Linux中的`虚拟桌面` 8 | 9 | 4. 一个标签页可能包含一个或多个窗口 10 | > 比如下图, 上面一行是标签页,灰色代表活动窗口或活动标签页 11 | > ![tip40_1](../../images/tip40_1.png) 12 | 13 | ## 如何使用标签页 14 | 15 | 1. `:lcd {path}` 可以设置当前`窗口`的本地工作目录(非标签) 16 | 2. `:windo lcd {path}` 可以设置`所有窗口`的本地工作目录(非标签) 17 | 18 | ## 打开/关闭标签页 19 | 20 | ![tip40_2](../../images/tip40_2.png) 21 | 22 | 1. `:tabedit {filename}` 打开新的标签页 23 | > 没有指定`{filename}`,则创建空缓冲区 24 | 25 | 2. `:tabc` 关闭当前标签页(同时关闭该标签页的所有窗口) 26 | 3. `:tabo` 关闭所有非当前标签页(同时关闭该标签页的所有窗口) 27 | 28 | ## 在标签夜间切换 29 | 30 | ![tip40_3](../../images/tip40_3.png) 31 | 32 | 1. `:tabn` 或`gt` 切换到下一个标签页 33 | 2. `:tabN` 或`gT` 切换到上一个标签页 34 | 3. `:tabn {N}` 或`{N}gt` 切换到编号为`{N}`的标签页 35 | 36 | ## 重排标签页 37 | 38 | 1. `:tabmove {N}` 将当前标签页移动到第`{N}`个位置(从`0`开始) 39 | 2. `:tabmove` 将当前标签页移动到末尾 40 | 41 | 42 |
43 | 44 | |上一篇|下一篇| 45 | |:---|---:| 46 | |[技巧39 将工作去切分成窗口](tip39.md)|[技巧41 用`:edit`命令打开文件](../chapter7_file_opr/tip41.md)| 47 | -------------------------------------------------------------------------------- /part3_fast_move/chapter9_file_jump/tip57.md: -------------------------------------------------------------------------------- 1 | # 技巧57: 跳转到光标下的文件 2 | > vim 会把文档中的文件名当成超链接,在进行正确配置后,可以用`gf`美丽跳转到光标下的文件 3 | 4 | #### `gf` (go to file)跳转到光标所在文件名对应的文件 5 | 6 | **E447: Can't find file "XXXXXXX" in path** 可能的原因: 7 | > 1. 路径中文件名缺少类型后缀:路径中是`path/file`,实际是`path/file.cpp`;
8 | > 2. 解决方法:在vimrc中设置`set suffixesadd+=.cpp`,这样会自动找文件名是`file`且文件后缀是`cpp`的文件了 9 | 10 | 如果`gf`进入新的文件后,可以按``(根据跳转列表)跳回来 11 | > `gf`会在跳转列表中增加一条记录 12 | 13 | #### 如何在指定的目录中搜索文件? 14 | > 之前的例子都是在`相对路径`(`绝对路径`也可以跳转)中跳转, 但是有点时候引用的第三方的类库,只在特定路径中,怎么设置vim来快速跳转?
15 | > 设置 `path`! 16 | 17 | #### `gf`命令会在`path`参数列举的所有路径中依次查找每个路径,在每个路径下查找是否有光标所在文件,有则打开,没有则继续查找`path`中的下个路径 18 | 19 | ![tip57_1](../../images/tip57_1.png) 20 | 21 | 1. `:set path?`查看当前`path`参数所含的所有路径,用`,`隔开 22 | 23 | > 1. 由上图发现,第一个查找的路径就是`.`(当前文件所文件夹) 24 | > 2. 如果添加一个路径`:set path+=/home/hanzhe/Documents/tmp`,则`:set path?`结果变成`path=.,/usr/include,,,~/Documents/tmp/,` 25 | 26 | `suffixsadd`和`pth`参数既可以全局配置(在vimrc)中,也可以对每个缓冲区单独设置(敲命令`:set path+=XXX`) 27 | 28 |
29 | 30 | |上一篇|下一篇| 31 | |:---|---:| 32 | |[技巧56 遍历改变列表](tip56.md)|[技巧58 用全局位置标记在文件间快速跳转](tip58.md) 33 | -------------------------------------------------------------------------------- /part3_fast_move/chapter8_doc_jump/tip51.md: -------------------------------------------------------------------------------- 1 | # 技巧51: 用精确的文本对象选择选取 2 | 3 | > 怎么快速选中 _括号间的文本_,_XML标签内的文本_,_被引用的文本_ 以及其他常用文本对象? 4 | 5 | ### Vim 理解`成对出现的符号` 6 | > vim "知道" 下图代码中的 (`{`和`}`),(`[`和`]`), (`<`和`>`),(``和``) 是成对出现的 7 | > 我们可以让vim**快速定位/选中/删除其文本内容** 8 | 9 | ![tip51_0](../../images/tip51_0.png) 10 | 11 | ### 例子:快速选中文本对象 12 | 13 | ![tip51_1](../../images/tip51_1.png) 14 | 15 | 1. `vi}` 快速选中`{}`之间的内容, 不包括`{`和`}` (**visual inside }**) 16 | 2. `a"` 快速选中`""`之间的内容,包括`"` (**around "**) 17 | 3. `i>` 快速选中`<>`之间的内容 18 | 4. `at` 快速选中XML标签内的内容,包括标签本身 19 | 20 | 21 | #### Vim 的文本对象由`2`个字符组成,且第一个字符永远是`a`或`i` 22 | 23 | `a` 包括分隔符本身(**around**),`i` 不包括分隔符(**inside**) 24 | 25 | 26 | #### 文本对象的例子见下表 27 | > `a[`等价于`a]`,其他同理 28 | 29 | ![tip51_2](../../images/tip51_2.png) 30 | 31 | 注意: 32 | > 1. 文本对象本身不是`动作命令`,但是可以在`可视模式`或`操作符待决模式`中使用 33 | > 2. 一般可以使用`动作命令`的地方,也可以使用文本对象 34 | > > 比如`d{motion}`, `c{motion}`, `y{motion}`. 35 | 36 | ### 例子:替换html中链接地址 37 | 38 | ![tip51_3](../../images/tip51_3.png) 39 | 40 |
41 | 42 | |上一篇|下一篇| 43 | |:---|---:| 44 | |[技巧50 通过查找进行移动](tip50.md)|[技巧52 删除周边,修改内部](tip52.md)| 45 | -------------------------------------------------------------------------------- /part6_tools/chapter19_auto_complete/tip112.md: -------------------------------------------------------------------------------- 1 | # 技巧 112 与自动补全的弹出式菜单进行交互 2 | > 介绍如何提升自动补全的效果:精简列表使我们快速选择、没有理想候选时快速关闭 3 | > 具体细节查看`:h popupmenu-completion` 4 | 5 | 1. 不论哪种自动补全命令,出现弹出菜单的时候,都可以用``和``在后续中上下选择;当插入模式下使用``或``,会触发普通关键字自动补全 6 | 7 | ### 可供弹出式菜单使用的命令 8 | |按键操作|作用| 9 | |:---|:---| 10 | |``|使用来自补全列表的下一个匹配项(next 匹配项)| 11 | |``|使用来自补全列表的上一个匹配项(previous 匹配项)| 12 | |``|选择来自补全列表的下一个匹配项| 13 | |``|选择来自补全列表的上一个匹配项| 14 | |``|确认使用当前选中的匹配项(yes)| 15 | |``|还原最早输入的文本(从自动补全中 exit)| 16 | |``|从当前匹配项中删除一个字符| 17 | |``|从当前匹配项中增加一个字符| 18 | |`{char}`|中止自动补全并插入字符 {char}| 19 | 20 | 1. ``等价于``;``等价于`` 21 | > 两种区别在于``和``只会上下移动光标,不会把当前光标的候选添加到文本中;``和``不仅移动光标,还会把候选添加到文本域 22 | > 原则上``与``更好:省的按``或``进行确认了 23 | 24 | #### 组合键`` 25 | 1. ``打开补全,并自动填充第一个候选;接着``向上选择上一个候选(相当于回到没有选择候选的状态) 26 | 2. 该条组合命令相当于打开自动补全候选,但是不选中任何候选 27 | 28 | #### ``对全能补全的结果进行实时性过滤 29 | 30 | #### ``为文件名补全进行实时性过滤 31 | 32 | 33 | |上一篇|下一篇| 34 | |:---|---:| 35 | |[技巧 111 结识 Vim 的关键字自动补全](tip111.md)|[技巧 113 掌握关键字的来龙去脉](tip113.md)| 36 | -------------------------------------------------------------------------------- /part2_file/chapter6_multi_files/tip39.md: -------------------------------------------------------------------------------- 1 | # 技巧39: 将工作去切分成窗口 2 | 3 | > vim 的窗口可以并排显示多个缓冲区 4 | 5 | ## 创建切分窗口 6 | 7 | > 效果见下图, `阴影`表示当前选中的窗口 8 | 9 | ![tip39_1](../../images/tip39_1.png) 10 | 11 | 1. `v` 垂直(_**v**ertical_)平分当前窗口 12 | > `:sp` 等价于 `v` 13 | 2. `s` 水平(_**s**tandard_)平分当前窗口 14 | > `:vsp` 等价于 `s` 15 | 16 | 3. 也可以指定分割窗口后缓冲区到底插入的是哪个文件的缓冲区 17 | > `:vsp filename`, `:sp filename` 18 | 19 | ![tip39_2](../../images/tip39_2.png) 20 | 21 | ## 在窗口间切换 22 | 23 | > 加入我们打开了多个窗口,咋么切换正在编辑的窗口?见下图: 24 | 25 | ![tip39_3](../../images/tip39_3.png) 26 | 27 | 1. `w` 在窗口间循环切换 28 | > `` 等价于 `w`,所以可以按住`Ctrl`键,之后连按2次`w`键即可切换窗口 29 | 2. `h` 切换到左边的窗口 30 | 2. `j` 切换到下边的窗口 31 | 2. `k` 切换到上边的窗口 32 | 2. `l` 切换到下边的窗口 33 | 34 | ## 关闭窗口 35 | 36 | ![tip39_4](../../images/tip39_4.png) 37 | 38 | 1. `:close` 关闭所有活动窗口 39 | 2. `:only` 关闭活动窗口以外的窗口 40 | 41 | ## 改变窗口大小和重新排列窗口 42 | 43 | ![tip39_5](../../images/tip39_5.png) 44 | 45 | 1. `=` 是所有窗口等宽等高 46 | 2. `_` 最大化活动窗口高度 47 | 3. `|` 最大化活动窗口宽度 48 | 49 |
50 | 51 | |上一篇|下一篇| 52 | |:---|---:| 53 | |[技巧38 管理隐藏缓冲区](tip38.md)|[技巧40 使用标签页将窗口分组](tip40.md)| 54 | -------------------------------------------------------------------------------- /part6_tools/chapter16_ctags/tip103.md: -------------------------------------------------------------------------------- 1 | # 技巧 103: 使用 Vim 的标签跳转命令,浏览关键字的定义 2 | > ctags将代码中的关键字变成某种超链接,使用``和`g`及相应的Ex命令跳转 3 | 4 | ### 例子:跳转到关键字的定义处 5 | 2个例子: 6 | > ![](../../images/tip103-1.png) 7 | > ![](../../images/tip103-2.png) 8 | 9 | 按照以上方式浏览代码库时,vim会维护一个标签历史列表,``充当【后退按钮】角色。 10 | > 当例子2结束后:光标会从 Speaker 的定义处回到 Anglophone 的定义处;再按一次的话,光标会回到原位。 11 | 12 | ### 例子:从函数调用跳转到定义处 13 | > ![](../../images/tip103-3.png) 14 | 对于前面的例子,知道Speaker和Anglophone都定义了speak函数,当光标在上述位置时,调用``命令,光标会自动跳到Anglophone的speak函数定义,而不是Speaker的speak函数。 15 | > 这是因为vim优先查找缓冲区的标签,而Anglophone在更近的时间点搜索过 16 | 17 | 18 | #### `g`与``的区别 19 | 1. 如果当前关键字只有一处匹配,两者一样 20 | 2. 如果有多处匹配,前者会提供候选列表让我们选择 21 | 3. 对于不能选择的后者,当我们发现跳转错误了,使用`:tselect`调出标签匹配列表进行回溯;或者使用`:tnext`直接跳转到下一处匹配(也可以使用`:tprev`,`:tfirst`,`:tlast`进行切换) 22 | 23 | #### 使用Ex命令进行跳转 24 | 1. `:tag {keyword}`与`:tjump {keyword}`等同于``与`g` 25 | 2. 当vim为标签文件提供tab补全功能的时候,只需要输入`:tag Fran`, Vim就会把内容扩展成完整的Francophone 26 | 3. `:tjump /phone$`会列出所有以`phone`结尾的关键字: 27 | > ![](../../images/tip103-4.png) 28 | 29 | |上一篇|下一篇| 30 | |:---|---:| 31 | |[技巧102: 配置Vim使用ctags](tip102.md)|[技巧 104: 不用离开 Vim 也能编译代码](../chapter17_compile/tip104.md)| 32 | -------------------------------------------------------------------------------- /part4_register/chapter10_copy_paste/tip59.md: -------------------------------------------------------------------------------- 1 | # 技巧59: 用无名寄存器实现删除、复制和粘帖操作 2 | > vim 复制、剪切、粘贴的例子 3 | 4 | ### 例子:调换连续的2个字符 5 | > 空格打的太快导致单词打错,调换' '和'l' 6 | 7 | ![tip59_1](../../images/tip59_1.png) 8 | 9 | 1. `F `从后向前查找第一个空格 10 | 2. `x` 删除光标所在字符(并把删除的字符放到`无名寄存器`) 11 | 3. `p`将无名寄存器的内容粘贴到光标后 12 | 13 | > `xp` 是调换两个连续的字符(没必要专门记忆) 14 | 15 | ### 例子2:调换文本`行` 16 | 17 | ![tip59_2](../../images/tip59_2.png) 18 | 19 | 1. `dd`删除光标所在行(并把删除的字符放到`无名寄存器`) 20 | 2. `p`将无名寄存器的内容粘贴到光标下一行 21 | 22 | > `ddp` 交换2个连续的行(没必要专门记忆) 23 | 24 | ### 例子3:复制文本行 25 | 26 | ![tip59_3](../../images/tip59_3.png) 27 | 28 | 1. `yy`复制光标所在行(并把复制的字符放到`无名寄存器`) 29 | 2. `p`将无名寄存器的内容粘贴到光标下一行 30 | 31 | 32 | ### 例子4:替换单词,但是失败了 (**这个例子后面几个技巧都提到,注意一下**) 33 | > 希望将`somethingInTheWay`替换成`collection` 34 | 35 | ![tip59_4](../../images/tip59_4.png) 36 | 37 | 1. `yiw` 复制光标所在单词 38 | 2. `jww` 跳到`somethingInTheWay` 39 | 3. `diw` 删除光标所在单词 40 | 4. `P` 将未命名寄存器的内容粘贴到光标处 41 | 42 | **粘贴失败!** 43 | 44 | 1. 失败原因: `diw`之后无名寄存器已经变成`somethingInTheWay`了 45 | 2. **解决方式**:用`"0P`替代`P` 46 | > `"0` 是复制专用寄存器, 只有`y`操作会改变其中的值; `"0P"` 将`复制专用寄存器`的值粘贴到光标`前` 47 | 48 |
gg 49 | 50 | |上一篇|下一篇| 51 | |:---|---:| 52 | |[技巧58 用全局位置标记在文件间快速跳转](tip58.md)|[技巧60 深入理解vim寄存器](tip60.md)| 53 | -------------------------------------------------------------------------------- /part5_pattern/chapter13_search/tip86.md: -------------------------------------------------------------------------------- 1 | # 技巧86: 查找当前高亮选区中的文本 2 | > 如果我们高亮选中了某段文本,怎么快速的在文章中查找该段文本? 3 | 4 | 1. 普通模式下`*`会查找当前光标所在的文本 5 | 2. 如果在可视模式(visual mode) 下, `*` 会增加选中区域到下一次出现 6 | > ![](../../images/tip86.png) 7 | 3. 设置键盘映射`vmap X y/"`可以使在可视模式下输入`X`查找被选中的区域 8 | 1. 如果选中区域含有`.*`等特殊字符, 会有问题 9 | 2. `y/"` = `y`(复制选中区域(到无名寄存器)) + `/`(进入查找模式) + `"`(将无名寄存器的内容输入进来) + ``(开始查找) 10 | 1. `"`取出无名寄存器的内容 11 | 2. `%`取出当前文件名 12 | 3. `/`取出上一次查找到模式串(在查找模式下等价于``) 13 | 4. `+`取出系统粘贴版里面的内容 14 | 15 | 4. 终极版本(我只是看懂大概,语法不懂),将下面的内容复制到vim脚本就可以实现可视模式下按`*`或者`#`来正向、反向查找 16 | 17 | ```Shell 18 | xnoremap * :call VSetSearch()/=@/ 19 | xnoremap # :call VSetSearch()?=@/ 20 | function! s:VSetSearch() 21 | let temp = @s 22 | norm! gv"sy 23 | let @/ = '\V' . substitute(escape(@s, '/\'), '\n', '\\n', 'g') let @s = temp 24 | endfunction 25 | ``` 26 | 27 | 28 | 1. `VSetSearch`函数应该是将当期寄存器的内容存放到`@/`寄存器 29 | 2. `/=@/` 搜索`@/`寄存器的字符串 30 | 31 | 32 | |上一篇|下一篇| 33 | |:---|---:| 34 | |[技巧85: 利用查找历史, 迭代完成复杂的模式](tip85.md)|[技巧87: 认识替换命令](../chapter14_substitute/tip87.md)| 35 | -------------------------------------------------------------------------------- /part2_file/chapter6_multi_files/tip37.md: -------------------------------------------------------------------------------- 1 | # 技巧37: 用参数列表将缓冲区分组 2 | 3 | > 1. 参数列表易于管理,将其分组易于访问 4 | > 2. `:argdo` 用法 5 | 6 | 1. 假设我们已经使用`vim *.vim`打开了一些txt文件 7 | 8 | 2. `:args` 查看参数列表 9 | > ![tip37_1](../../images/tip37_1.png)
10 | > `[]`覆盖的文件表明**活动文件**
11 | > `:args` 比 `:ls`的显示简陋
12 | 13 | 3. `:args {arglist}` 可以**指定**参数列表的内容,例子如下: 14 | > ![tip37_2](../../images/tip37_2.png) 15 | > `{arglist}` 也可是通配符,比如`:args *.txt`,对于打开大量文件有优势 16 | 17 | ## 用Glob模式指定文件 18 | 19 | > 1. `*` 是一个通配符,用于匹配0个或多个字符,**不递归** 20 | > 2. `**` 是一个通配符,用于匹配0个或多个字符,**递归** 21 | 22 | 1. **Glob模式**:使用两种通配符加上部分文件名或目录名,构造的用以匹配文件名的模式 23 | > 几个例子:
24 | > ![tip37_3](../../images/tip37_3.png) 25 | 26 | 2. `:args **/*.js **/*.css`: 构造一个只包含`.js`和`.css`的文件 27 | 28 | ## 用``` 反引号(``) ``` 来指定文件 29 | 30 | 1. 假设要打开的文件名已经存放在一个文本文件中: 31 | >![tip37_4](../../images/tip37_5.png) 32 | 33 | 2. 使用``:args `cat .chapters` ``即可打开这4个pml文件 34 | 35 | ## 参数列表 vs 缓冲区列表 36 | 37 | 1. 参数列表更容易管理, 对于**缓冲区分组** 问题更容易管理 38 | 2. `:args {arglist}` 一下就可清空缓冲区,并设置新的缓冲区列表 39 | 40 | 3. 缓冲区列表像`桌面(desktop)`,乱七八糟;参数列表像`工作区(workspace)`, 只在需要扩展空间时用到 41 | > [技巧69](),[技巧96]() 有参数列表的例子 42 | 43 | 44 |
45 | 46 | |上一篇|下一篇| 47 | |:---|---:| 48 | |[技巧36 用缓冲区列表管理打开的文件](tip36.md)|[技巧38 管理隐藏缓冲区](tip38.md)| 49 | -------------------------------------------------------------------------------- /part2_file/chapter6_multi_files/tip38.md: -------------------------------------------------------------------------------- 1 | # 技巧38: 管理隐藏缓冲区 2 | 3 | > 1. vim 对修改过的缓冲区会区别对待,放在意外退出 4 | > 2. 本节介绍如何隐藏已修改的缓冲区 5 | > 3. 介绍如何在退出Vim时处理隐藏缓冲区 6 | 7 | ### 例子:修改and切换缓冲区 8 | 9 | 1. 打开文件 10 | > ![tip38_1](../../images/tip38_1.png) 11 | 12 | 2. 输入`Go`(跳到最后一行,后面插入一个空行),不保存后输入`:ls`发现第一个文件多一个`+`,说明有未保存的修改(保存后`+`消失) 13 | > ![tip38_2](../../images/tip38_2.png) 14 | 15 | 3. 如果不保存修改就直接切换缓冲区,会报错: 16 | > ![tip38_5](../../images/tip38_5.png) 17 | 18 | 4. 如果输入`:bn!`可以强制切换,但是显示不一样: 19 | > ![tip38_6](../../images/tip38_6.png) 20 | > 标记`h`表示他是`隐藏缓冲区(hidden)`
21 | > 标记`a`表示他是`活动缓冲区(active)` 22 | 23 | ## 在退出时处理隐藏缓冲区 24 | 25 | > 下图显示所有的处理缓冲区的策略 26 | 27 | ![tip38_4](../../images/tip38_4.png) 28 | 29 | 1. 如果有隐藏缓冲区,则退出时,会提示下图,并把当前窗口切换为第一个修改的隐藏缓冲区: 30 | > ![tip38_3](../../images/tip38_3.png) 31 | 32 | 2. 如果需要保存当前缓冲区,则执行`:write`把当前缓冲区保存到文件 33 | > `:edit!` 则放弃更改 34 | 35 | 3. 如果有多个隐藏缓冲区被修改,则每处理一个(`:write`或`:edit!`)之后下一个自动跳到屏幕上 36 | 4. `:qall!` 放弃所有的隐藏缓冲区修改,直接退出 37 | 38 | 5. `:wall` 保存所有的缓冲区修改 39 | > `:argdo write` 也可以保存所有的缓冲区修改 40 | 41 | 42 | #### 运行`:argdo` 或`:bufdo`之前,最好启用`hidden` 43 | 44 | 1. 否则在执行下图的指令时,假如第二条`{cmd}`指令修改了缓冲区,则第三条指令不能切换,导致后面的指令都停止 45 | 2. `hidden`参数强制不提示 46 | 47 | 48 |
49 | 50 | |上一篇|下一篇| 51 | |:---|---:| 52 | |[技巧37 用参数列表将缓冲区分组](tip37.md)|[技巧39 将工作区切分成窗口](tip39.md)| 53 | -------------------------------------------------------------------------------- /part4_register/chapter11_macro/tip69.md: -------------------------------------------------------------------------------- 1 | # 技巧69: 在一组文件中执行宏 2 | > 介绍如何将一个宏作用在一组文件shang
3 | > 同样可以串行或并行执行 4 | 5 | ### 例子:给每个 class 添加外部的 module 6 | > 如下图,我们希望下图的上半部分变成下图的下半部分 7 | > ![tip69_1](../../images/tip69_1.png) 8 | 9 | #### 1. 建立目标文件列表/打开所有的目标文件 10 | 11 | ![tip69_2](../../images/tip69_2.png) 12 | 13 | 1. `:args *.rb` 打开目标文件 14 | 2. `:args` 显示参数列表的内容 15 | 16 | 17 | #### 2. 录制宏 18 | 19 | ![tip69_3](../../images/tip69_3.png) 20 | ![tip69_4](../../images/tip69_4.png) 21 | 22 | 1. `:first` 先把光标移到参数列表的第一个文件 23 | 2. `gg` 移动到第一行 24 | 3. `/class` 查找class 25 | 4. `0` 移动到行的第一列 26 | 5. `j>G` 先把光标移动到下一行(`j`),然后将光标所在行到最后一行(`G`)增加一层缩进(`>`) 27 | 6. `Go` 跳到最后一行,并在下面插入一行 28 | 29 | > 做完第一个的修改不要保存(`:w`),下面说明原因 30 | 31 | #### 3. 方法一:并行方式执行宏 32 | 33 | 1. 撤销对第一个文件的修改`:edit!` 34 | 2. 对参数列表的所有文件执行宏`:argdo normal @a` 35 | 3. 保存`:wall` 36 | > **之所以录制宏的时候不保存、3.1先撤销修改,是为了防止第一个文件被执行2次** 37 | 38 | 39 | #### 3. 方法二:串行方式执行宏 40 | 41 | 1. 添加宏的内容到结尾
42 | > ![tip69_5](../../images/tip69_5.png) 43 | 44 | 2. 串行执行宏 `100@` 45 | > 也可以是`10@a`,只要大于文件个数就行,超过的`:next`命令会失败,然后宏自动中止 46 | 47 | 3. 保存文件`:argdo write` (等价于`:wall`,保存参数列表的所有文件的修改) 48 | > 可以将3.1添加的宏改成`:wnext`, 则3.3可以省略。`:wnext`等价于先保存当前文件修改,再移动到参数列表的下一个文件 49 | 50 |
51 | 52 | |上一篇|下一篇| 53 | |:---|---:| 54 | |[技巧68 给宏追加命令](tip68.md)|[技巧70 用迭代求值的方式给列表编号](tip70.md)| 55 | -------------------------------------------------------------------------------- /part4_register/chapter10_copy_paste/tip60.md: -------------------------------------------------------------------------------- 1 | # 技巧60: 深入理解vim寄存器 2 | > 使用shanchu、复制、粘贴操作时,可以指定使用哪一个寄存器 3 | 4 | #### `"{register}` 指定使用的寄存器 5 | > [技巧59](tip59.md) 使用`"0`来粘贴复制寄存器中的值 6 | 7 | ### 例子1:替换单词(技巧59的最后一个例子解法) 8 | > 将`somethingInTheWay`替换成`collection` 9 | 10 | #### 解法1:使用`复制专用寄存器("0)`来替换单词 11 | ![tip60_1](../../images/tip60_1.png) 12 | 13 | 1. 只有复制操作会改变复制专用寄存器中的值 14 | 15 | #### 解法2:使用有名寄存器(`"a`-`"z`) 来复制和替换单词 16 | ![tip60_2](../../images/tip60_2.png) 17 | 18 | 19 | #### 解法4:使用`黑洞寄存器`来删除单词 20 | ![tip60_3](../../images/tip60_3.png) 21 | 22 | 黑洞寄存器不会存储文本的副本 23 | 24 |
25 | 26 | #### 系统粘贴板(`"+`) 和 选择专用寄存器(`"*`) 27 | 28 | ![tip60_4](../../images/tip60_4.png) 29 | 30 | 1. `"+p`将外部程序中复制的内容粘贴到光标后面 31 | 2. `"+yy`将光标所在行复制到系统粘贴板 32 | 3. `"*`表示主剪切板,保存上次被高亮选中的文件,使用`鼠标中键`粘贴出来 33 | > 1. windows 和 Mac OS X没有主剪切板,`"*`和`"+`混用 34 | > 2. `:version`查看`xterm_clipboard`是否激活,`+xterm_clipboard`表明支持主剪切板 35 | 36 | #### 表达式寄存器(`"=`) 37 | 38 | 输入`"=`后vim会进入命令行模式,并显示提示符`=`,敲入一段vim脚本表达式并按``执行。如果返回的是字符串或者是可以转换成字符串的数据,则Vim会使用他。 39 | 40 | ### 例子5:其他寄存器 41 | ![tip60_5](../../images/tip60_5.png) 42 | 43 | 1. `"%`当前文件名 44 | 2. `"#`轮换文件名 45 | 3. `".`上次插入的文本 46 | 4. `":`上次执行的Ex命令 47 | 5. `"/`上次查找的模式 48 | > `:let` 可以对`"/` 寄存器进行显示的赋值, 而上面其他的寄存器都是`只读`的 49 | 50 | 51 |
52 | 53 | |上一篇|下一篇| 54 | |:---|---:| 55 | |[技巧59 用无名寄存器实现删除、复制和粘帖操作](tip59.md)|[技巧61 用寄存器中的内容替换高亮选取的文本](tip61.md)| 56 | -------------------------------------------------------------------------------- /SUMMARY.md: -------------------------------------------------------------------------------- 1 | # Summary 2 | 3 | * [Introduction](README.md) 4 | 5 | 《Practical Vim》(《Vim实用技巧》)笔记,参考了[gitig/Practical-Vim-Notes](https://github.com/gitig/Practical-Vim-Notes) 和`中文版 Practical Vim`,加入了一些我的理解和例子, 教程的[写作方式](part0/tip1.markdown) 6 | * [第〇部分 基本操作说明](part0/第〇部分-基本操作说明.md) 7 | * [第1章 Vim 解决问题的方式](part0/第1章-vim-解决问题的方式.md) 8 | * [技巧 1. 认识.命令](part0/tip1.md) 9 | * [技巧 2. 不要自我重复](part0/tip2.md) 10 | * [技巧 3. 以退为进](part0/tip3.md) 11 | * [技巧 4. 执行、重复、回退](part0/tip4.md) 12 | * [技巧 5. 查找并手动替换](part0/tip5.md) 13 | * [技巧 6. 结识.范式](part0/tip6.md) 14 | 15 | 16 | 17 | * [第一部分 模式](part1_pattern/chapter2_normal_pattern/tip7.md) 18 | 19 | * [第2章 普通模式](part1_pattern/chapter2_normal_pattern/tip7.md) 20 | ``` 21 | > 1. 普通模式在执行时可以指定执行次数 22 | > 2. 指定执行次数可以减少按键次数,但是有的时候多按几次更好: 计算按键次数可能费脑子, 不如直接next,next一直到目的地 23 | > 3. 普通模式:操作符+动作命令 24 | ``` 25 | * [技巧 7. 停顿时请移开画笔](part1_pattern/chapter2_normal_pattern/tip7.md) 26 | * [技巧 8. 把撤销的单元切成块](part1_pattern/chapter2_normal_pattern/tip8.md) 27 | * [技巧 9. 尽量构造可重复的修改](part1_pattern/chapter2_normal_pattern/tip9.md) 28 | * [技巧 10. 用次数做简单的算术运算](part1_pattern/chapter2_normal_pattern/tip10.md) 29 | * [技巧 11. 能够重复,就别用次数](part1_pattern/chapter2_normal_pattern/tip12.md) 30 | * [技巧 12. 操作+操作符 双剑合璧](part1_pattern/chapter2_normal_pattern/tip12.md) 31 | 32 | * [第3章 插入模式](part1_pattern/chapter3_insert_mode/tip13.md) 33 | ``` 34 | > 1. 大多数操作都在非插入模式中实现(复制\删除\剪切\黏贴) 35 | > 2. 不离开插入模式就可以黏贴寄存器中的文本 36 | > 3. 如何插入键盘上不存在的字符? 37 | > 4. 替换模式是插入模式的特例 38 | > 5. `插入-普通模式`是插入模式的子集 39 | ``` 40 | * [技巧 13. 在插入模式中回退/撤销](part1_pattern/chapter3_insert_mode/tip13.md): ``,``,`` 41 | * [技巧 14. 返回普通模式](part1_pattern/chapter3_insert_mode/tip14.md): `<` 42 | * [技巧 15. 不离开插入模式, 粘贴寄存器中的文本](part1_pattern/chapter3_insert_mode/tip15.md): `yt,`,`0` 43 | * [技巧 16. 随时随地做运算](part1_pattern/chapter3_insert_mode/tip16.md): `=`
44 | * [技巧 17. 用字符编码插入非常用字符](part1_pattern/chapter3_insert_mode/tip17.md): `{123}`,`u{1234}`,``
45 | * [技巧 18. 用二合字母(digraph)插入非常用字符](part1_pattern/chapter3_insert_mode/tip18.md): `35`,`?I`,`<<`
46 | * [技巧 19. 使用替换模式替换已有文本](part1_pattern/chapter3_insert_mode/tip19.md): `R`,`r`
47 | 48 | * [第4章 可视模式](part1_pattern/chapter4_visual_mode/tip20.md) 49 | ``` 50 | > 1. 可视模式允许在选中的文本区域上操作 51 | > 2. 可视模式分为在字符文本\行文本\块文本上的操作 52 | > 3. `.`命令对于行文本的操作用处较大, 其他可视模式里使用`.`意义不大 53 | ``` 54 | * [技巧 20. 深入理解可视模式](part1_pattern/chapter4_visual_mode/tip20.md): `viw`, ``,`c` 55 | * [技巧 21. 选择高亮区域](part1_pattern/chapter4_visual_mode/tip21.md): `v`,`V`,``,`o` 56 | * [技巧 22. 重复执行面向行的可视命令](part1_pattern/chapter4_visual_mode/tip22.md): `Vj>.` 57 | * [技巧 23. 尽可能使用操作符命令,而不是可视命令](part1_pattern/chapter4_visual_mode/tip23.md): `vitU`, `gUit` 58 | * [技巧 24. 用面向__列块__的可视模式编辑**表格数据**](part1_pattern/chapter4_visual_mode/tip24.md): `3jr|` 59 | * [技巧 25. 修改列文本](part1_pattern/chapter4_visual_mode/tip25.md): `jjec` 60 | * [技巧 26. 在长短不一的高亮块中添加文本](part1_pattern/chapter4_visual_mode/tip26.md): `jj$c` 61 | 62 | * [第5章 命令行模式](part1_pattern/chapter5_ex_mode/tip27.md) 63 | ``` 64 | > 1. `ex` 本来是一个行编辑器, 是`vi`的祖先 65 | > 2. 基于行的编辑任务, Ex 命令是最佳工具 66 | ``` 67 | * 技巧 27. 结识Vim的命令行模式](part1_pattern/chapter5_ex_mode/tip27.md): `:`,`` 68 | * 技巧 28. 在一行或多个连续行上执行命令](part1_pattern/chapter5_ex_mode/tip28.md): `:2,5p`,`:%s/old/new/gc`,`://-1,/<\/html>/+1p` 69 | * [技巧 29. 使用`:t` `:m` 进行复制和移动行](part1_pattern/chapter5_ex_mode/tip29.md): `:6t.`,`Vjj:m$` 70 | * [技巧 30. 在指定范围上执行普通模式命令](part1_pattern/chapter5_ex_mode/tip30.md): `:'<,'>normal .` 71 | * [技巧 31. 重复上次的Ex命令](part1_pattern/chapter5_ex_mode/tip31.md):`:@:`, `:bp`,`:bn` 72 | * [技巧 32. 自动补全Ex命令](part1_pattern/chapter5_ex_mode/tip32.md):``,``,`` 73 | * [技巧 33. 把当前单词插入到命令行](part1_pattern/chapter5_ex_mode/tip33.md): `/`, `*:%s///g` 74 | * [技巧 34. 回溯历史命令](part1_pattern/chapter5_ex_mode/tip34.md):`q:` 75 | * [技巧 35. 运行Shell命令](part1_pattern/chapter5_ex_mode/tip35.md): `:ls`,`:write! sh`,`:write !sh`,`:2,$!sort -t',' -k2,2` 76 | 77 | 78 | * [第二部分 文件 ](part2_file/chapter6_multi_files/tip36.md) 79 | 80 | * [第6章 管理多个文件](part2_file/chapter6_multi_files/tip36.md) 81 | ``` 82 | > 1. 缓冲区列表记录打开的所有文件 83 | > 2. 缓冲区文件分组方法 84 | > 3. 将Ex命令作用在缓冲区每个文件上 85 | > 4. 标签页分割窗口 86 | ``` 87 | * [技巧 36. 用缓冲区列表管理打开的文件](part2_file/chapter6_multi_files/tip36.md): `:bnext`, `:ls`, ``, `:bprev`, `:bfirst`, `:blast`, `:buffer N`, `:buffer {bufname}`, `:bufdo`, `:argdo`, `:bd[elete]` 88 | * [技巧 37. 用参数列表将缓冲区分组](part2_file/chapter6_multi_files/tip37.md): `:args {arglist}` 89 | * [技巧 38. 管理隐藏缓冲区](part2_file/chapter6_multi_files/tip38.md): `:wirte`, `:edit!`, `qall!`, `:wall` 90 | * [技巧 39. 将工作区分成窗口](part2_file/chapter6_multi_files/tip39.md): `s`, `v`, `:edit`, `:close`, `:only` 91 | * [技巧 40. 用标签页将窗口分组](part2_file/chapter6_multi_files/tip40.md): `:lcd{path}`, `:tabe[dit] {filename}`, `:tabmove [N]` 92 | 93 | * [第7章 打开及保存文件](part2_file/chapter7_file_opr/tip41.md) 94 | ``` 95 | > 1. 介绍在vim 中打开文件的方式 96 | > 2. 配置`path`选项之后利用`:find` 命令打开文件 97 | > 3. `netrw`插件查看目录树 98 | > 4. 保存文件的时候如果没有*写权限*或是目标路径不存在怎么办? 99 | ``` 100 | * [技巧 41. 用`:edit`命令打开文件](part2_file/chapter7_file_opr/tip41.md): `:edit %`, `:edit %:h` 101 | * [技巧 42. 使用`:find`打开文件](part2_file/chapter7_file_opr/tip42.md): `:find`, `:set path+=app/*` 102 | * [技巧 43. 使用netrw管理文件系统](part2_file/chapter7_file_opr/tip43.md):`:edit .`, `:e.`, `:Explore`, `:E.` 103 | * [技巧 44. 把文件保存到不存在的目录中](part2_file/chapter7_file_opr/tip44.md): ``, `:!mkdir -p %:h` 104 | * [技巧 45. 以超级用户权限保存文件](part2_file/chapter7_file_opr/tip45.md): `:w !sudo tee % > /dev/null` 105 | 106 | * [第三部分 更快的移动和跳转](part3_fast_move/chapter8_doc_jump/tip46.md) 107 | ``` 108 | > 学习vim如何在文件内、文件间快速跳转 109 | ``` 110 | * [第8章 用动作命令在文档中快速跳转](part3_fast_move/chapter8_doc_jump/tip46.md) 111 | ``` 112 | > 1. 使用动作(motion)命令在文档中跳转 113 | > 2. 上下左右移动、一次移动一个单词、通过查找命令快速移动 114 | > 3. 操作符待决模式 115 | > 4. 查看vim文档`:h motion` 116 | ``` 117 | * [技巧 46. 让手指保持在 `本位行(Home Row)`上](part3_fast_move/chapter8_doc_jump/tip46.md): `h,j,k,l` 118 | * [技巧 47. 区分实际行和屏幕行](part3_fast_move/chapter8_doc_jump/tip47.md):`gj`, `gk`, `g0`, `g$`, `g^` 119 | * [技巧 48. 基于单词移动](part3_fast_move/chapter8_doc_jump/tip48.md):`w`, `b`, `e`, `ge`, `ea`, `gea`, `W`, `cW` 120 | * [技巧 49. 对字符串进行查找](part3_fast_move/chapter8_doc_jump/tip49.md):`f{char}`, `;`, `,`, `F{char}`, `t{char}`, `T{char}`, `dt.` 121 | * [技巧 50. 通过查找进行移动](part3_fast_move/chapter8_doc_jump/tip50.md):`/{char}`, `n`, `N` 122 | * [技巧 51. 用精确的文本对象选择选取](part3_fast_move/chapter8_doc_jump/tip51.md):`vi}`, `a"`, `i"`, `at`, `it` 123 | * [技巧 52. 删除周边,修改内部](part3_fast_move/chapter8_doc_jump/tip52.md):`iw`, `iW`, `is`, `ip`, `aw`, `aW`, `as`, `ap` 124 | * [技巧 53. 设置位置标记,以便快速跳回](part3_fast_move/chapter8_doc_jump/tip53.md):`m{a-zA-Z}`, `'{mark}` 125 | * [技巧 54. 在匹配括号间跳转](part3_fast_move/chapter8_doc_jump/tip54.md):`%`, `S"` 126 | 127 | * [第9章 在文件间跳转](part3_fast_move/chapter9_file_jump/tip55.md) 128 | ``` 129 | ``` 130 | * [技巧 55. 遍历跳转列表](part3_fast_move/chapter9_file_jump/tip55.md): ``, `` 131 | * [技巧 56. 遍历改变列表](part3_fast_move/chapter9_file_jump/tip56.md): `:changes`, *`.*, *`^*, `gi` 132 | * [技巧 57. 跳转到光标下的文件](part3_fast_move/chapter9_file_jump/tip57.md): `gf`, `:set path?` 133 | * [技巧 58. 用全局位置标记在文件间快速跳转](part3_fast_move/chapter9_file_jump/tip58.md): `:vimgrep`, `` `{char}`` 134 | 135 | * [第四部分 寄存器](part4_register/chapter10_copy_paste/tip59.md) 136 | ``` 137 | > 1. 寄存器是保存文本的容器 138 | > 2. 寄存器可以实现复制、粘贴、剪切文本; 可以记录一系列按键操作,制作宏命令 139 | ``` 140 | * [第10章 复制和粘贴](part4_register/chapter10_copy_paste/tip59.md) 141 | ``` 142 | > 1. vim提供几十个寄存器保存文本,比系统单一的剪切板多很多 143 | > 2. vim的粘贴可以面向行和面向字符 144 | > 3. 可视模式下的粘贴、系统剪切板的使用 145 | ``` 146 | * [技巧 59. 用无名寄存器实现删除、复制和粘帖操作](part4_register/chapter10_copy_paste/tip59.md): `x`, `p`, `xp`, `dd`, `ddp`, `yyp`, `P`, `diw` 147 | * [技巧 60. 深入理解vim寄存器](part4_register/chapter10_copy_paste/tip60.md): `"{register}`, `"ayiw`, `"bdd`, `"ap`, `"bp`, `""p`, `"0P`, `:reg "0`, `"_d{motion}`, `"+`, `"+p +` 148 | * [技巧 61. 用寄存器中的内容替换高亮选取的文本](part4_register/chapter10_copy_paste/tip61.md):*`m{char}`, `` `{char}`` 149 | * [技巧 62. 把寄存器中的内容粘贴出来](part4_register/chapter10_copy_paste/tip62.md): `{register}`, `p`, `P`, `gp`, `gP` 150 | * [技巧 63. 与系统粘贴板进行交互](part4_register/chapter10_copy_paste/tip63.md): `:set pastetoggle=`, `"+p`* 151 | 152 | * [第11章 宏](part4_register/chapter11_macro/tip64.md) 153 | ``` 154 | > 1. 宏是`.`指令的加强版 155 | > 2. 宏适合对一系列相似的行、段落、文件上操作 156 | > 3. 宏的执行分2种方式:串行方式回放 和 并行方式多次运行 157 | ``` 158 | * [技巧 64. 宏的读取和执行](part4_register/chapter11_macro/tip64.md): `q`, `q{register}`, `:reg a`, `@{register}`, `@@` 159 | * [技巧 65. 规范光标位置、直达目标以及终止宏](part4_register/chapter11_macro/tip65.md):*`{number}@a` 160 | * [技巧 66. 加次数回放宏](part4_register/chapter11_macro/tip66.md):*`qq;.q` 161 | * [技巧 67. 在连续的文本行上重复修改](part4_register/chapter11_macro/tip67.md):*`0`, `:normal @a` 162 | * [技巧 68. 给宏追加命令](part4_register/chapter11_macro/tip68.md):*`qa`, `qA` 163 | * [技巧 69. 在一组文件中执行宏](part4_register/chapter11_macro/tip69.md):*`gg/class`, `:argdo`, `:edit!`, `:argdo normal @a`, `:argdo write`, `:wall`, `:wnext` 164 | * [技巧 70. 用迭代求值的方式给列表编号](part4_register/chapter11_macro/tip70.md):*`:let i=0`, `:echo i`, `=i` 165 | * [技巧 71. 编辑宏的内容](part4_register/chapter11_macro/tip71.md):*`~`, `vU`, `:put a`
166 | 167 | * [第五部分 模式](part5_pattern/chapter12_match/tip72.md) 168 | ``` 169 | > 1. pattern使得构造正则表达式和原义查找文本变得容易 170 | > 2. substitute和global是2个强大的Ex命令 171 | ``` 172 | * [第12章 按模式匹配和按原义匹配](part5_pattern/chapter12_match/tip72.md) 173 | ``` 174 | > 1. 查找时替换的前提,如何在查找时使用正则表达式? 175 | > 2. `very magic`、`very nomagic`模式、原义开关都是什么,什么用? 176 | > 3. 零宽度定界符有哪些?各自作用是? 177 | ``` 178 | * [技巧 72. 调整查找模式的大小写敏感性](part5_pattern/chapter12_match/tip72.md): `\c`, `\C` 179 | * [技巧 73. 使用`\v`模式进行正则表达式查找](part5_pattern/chapter12_match/tip73.md): `\v` 180 | * [技巧 74. 完全匹配字符串时,使用`\V` 查找](part5_pattern/chapter12_match/tip74.md): `\V` 181 | * [技巧 75. 使用圆括号`()`获取子匹配](part5_pattern/chapter12_match/tip75.md): `()` 182 | * [技巧 76. 使用`<`,`>`界定单词边界](part5_pattern/chapter12_match/tip76.md): `<`, `>` 183 | * [技巧 77. 界定匹配的边界(使用`\zs`, `\ze`)](part5_pattern/chapter12_match/tip77.md): `\zs`, `\ze` 184 | * [技巧 78. 转移问题字符](part5_pattern/chapter12_match/tip78.md): `/\?`需要转义 185 | 186 | * [第13章 查找](part5_pattern/chapter13_search/tip79.md) 187 | ``` 188 | > 1. 查找模式可以自动补全匹配、减少按键次数、统计匹配数量 189 | > 2. 构造正确的正则表达式一般需要调试多次,我们可以迭代的构造模式,减少调试代价 190 | > 3. 可以定制命令,查找高亮选区的文本 191 | > 4. 定制自己的`*`,在可视模式下也可快速查找选中的文本 192 | ``` 193 | * [技巧 79. 查找命令入门](part5_pattern/chapter13_search/tip79.md): `/`, `?`, `n`, `N` 194 | * [技巧 80. 高亮查找匹配](part5_pattern/chapter13_search/tip80.md): `hlsearch`, `noh`, `` 195 | * [技巧 81. 在执行查找前预览第一处匹配](part5_pattern/chapter13_search/tip81.md): `incsearch`, `` 196 | * [技巧 82. 统计当前模式的匹配个数](part5_pattern/chapter13_search/tip82.md): `:%s///gn` 197 | * [技巧 83. 将光标偏移到查找匹配的结尾](part5_pattern/chapter13_search/tip83.md): `/xxxx/e` 198 | * [技巧 84. 对完整的查找匹配进行操作](part5_pattern/chapter13_search/tip84.md): `/\vX(ht)?ml\C`,`gUfl` 199 | * [技巧 85. 利用查找历史, 迭代完成复杂的模式](part5_pattern/chapter13_search/tip85.md): `:%s/\v'(([^']|'\w)+)'/“\1”/g` 200 | * [技巧 86. 查找当前高亮选区中的文本](part5_pattern/chapter13_search/tip86.md): `y/"` 201 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 《Practical Vim》(《Vim实用技巧》)笔记,参考了[gitig/Practical-Vim-Notes](https://github.com/gitig/Practical-Vim-Notes) 和`中文版 Practical Vim`,加入了一些我的理解和例子, 教程的[写作方式](part0/tip1.markdown) 2 | 3 | ## 第1章 Vim 解决问题的方式 4 | 技巧 1. [认识`.`命令](part0/tip1.md): `.`,`x`,`u`,`dd`,`>G`,`h`,`j`,`k`,`l`
5 | 6 | 技巧 2. [不要自我重复](part0/tip2.md): `$`,`I`,`i`,`a`,`A`
7 | 8 | 技巧 3. [以退为进](part0/tip3.md): `f{char}`,`;`,`,`,`s`
9 | 10 | 技巧 4. [执行、重复、回退](part0/tip4.md): `.`,`u`
11 | 12 | 技巧 5. [查找并手动替换](part0/tip5.md): `:%s/content/copy/g`,`*`,`#`
13 | 14 | 技巧 6. [结识`.`范式](part0/tip6.md): `.`
15 | 16 | # 第一部分 模式 17 | 18 | > 在不同的模式上按键,产生的效果可能不同 19 | 20 | ## 第2章 普通模式 21 | 22 | > 1. 普通模式在执行时可以指定执行次数 23 | > 2. 指定执行次数可以减少按键次数,但是有的时候多按几次更好: 计算按键次数可能费脑子, 不如直接next,next一直到目的地 24 | > 3. 普通模式:操作符+动作命令 25 | 26 | 技巧 7. [停顿时请移开画笔](part1_pattern/chapter2_normal_pattern/tip7.md)
27 | 28 | 技巧 8. [把撤销的单元切成块](part1_pattern/chapter2_normal_pattern/tip8.md): `o`
29 | 30 | 技巧 9. [尽量构造可重复的修改](part1_pattern/chapter2_normal_pattern/tip9.md): [VimGolf](http://vimgolf.com), `daw` vs `dbw` vs `dbx`
31 | 32 | 技巧 10. [用次数做简单的算术运算](part1_pattern/chapter2_normal_pattern/tip10.md): ``,``,`yyp`,`cw`
33 | 34 | 技巧 11. [能够重复,就别用次数](part1_pattern/chapter2_normal_pattern/tip12.md): `d3w` vs `3dw` vs `dw..`
35 | 36 | 技巧 12. [操作+操作符 双剑合璧](part1_pattern/chapter2_normal_pattern/tip12.md): `gu`,`gU`,`g~`,`=`,`<`,`>`
37 | 38 | 39 | ## 第3章 插入模式 40 | 41 | > 1. 大多数操作都在非插入模式中实现(复制\删除\剪切\黏贴) 42 | > 2. 不离开插入模式就可以黏贴寄存器中的文本 43 | > 3. 如何插入键盘上不存在的字符? 44 | > 4. 替换模式是插入模式的特例 45 | > 5. `插入-普通模式`是插入模式的子集 46 | 47 | 48 | 技巧 13. [在插入模式中回退/撤销](part1_pattern/chapter3_insert_mode/tip13.md): ``,``,``
49 | 50 | 技巧 14. [返回普通模式](part1_pattern/chapter3_insert_mode/tip14.md): `<`
51 | 52 | 技巧 15. [不离开插入模式, 粘贴寄存器中的文本](part1_pattern/chapter3_insert_mode/tip15.md): `yt,`,`0`
53 | 54 | 技巧 16. [随时随地做运算](part1_pattern/chapter3_insert_mode/tip16.md): `=`
55 | 56 | 技巧 17. [用字符编码插入非常用字符](part1_pattern/chapter3_insert_mode/tip17.md): `{123}`,`u{1234}`,``
57 | 58 | 技巧 18. [用二合字母(digraph)插入非常用字符](part1_pattern/chapter3_insert_mode/tip18.md): `35`,`?I`,`<<`
59 | 60 | 技巧 19. [使用替换模式替换已有文本](part1_pattern/chapter3_insert_mode/tip19.md): `R`,`r`
61 | 62 | ## 第4章 可视模式 63 | 64 | > 1. 可视模式允许在选中的文本区域上操作 65 | > 2. 可视模式分为在字符文本\行文本\块文本上的操作 66 | > 3. `.`命令对于行文本的操作用处较大, 其他可视模式里使用`.`意义不大 67 | 68 | 技巧 20. [深入理解可视模式](part1_pattern/chapter4_visual_mode/tip20.md): `viw`, ``,`c`
69 | 70 | 技巧 21. [选择高亮区域](part1_pattern/chapter4_visual_mode/tip21.md): `v`,`V`,``,`o`
71 | 72 | 技巧 22. [重复执行面向行的可视命令](part1_pattern/chapter4_visual_mode/tip22.md): `Vj>.`
73 | 74 | 技巧 23. [尽可能使用操作符命令,而不是可视命令](part1_pattern/chapter4_visual_mode/tip23.md): `vitU`, `gUit`
75 | 76 | 技巧 24. [用面向__列块__的可视模式编辑**表格数据**](part1_pattern/chapter4_visual_mode/tip24.md): `3jr|`
77 | 78 | 技巧 25. [修改列文本](part1_pattern/chapter4_visual_mode/tip25.md): `jjec`
79 | 80 | 技巧 26. [在长短不一的高亮块中添加文本](part1_pattern/chapter4_visual_mode/tip26.md): `jj$c`
81 | 82 | ## 第5章 命令行模式 83 | 84 | > 1. `ex` 本来是一个行编辑器, 是`vi`的祖先 85 | > 2. 基于行的编辑任务, Ex 命令是最佳工具 86 | 87 | 技巧 27. [结识Vim的命令行模式](part1_pattern/chapter5_ex_mode/tip27.md): `:`,``
88 | 89 | 技巧 28. [在一行或多个连续行上执行命令](part1_pattern/chapter5_ex_mode/tip28.md): `:2,5p`,`:%s/old/new/gc`,`://-1,/<\/html>/+1p`
90 | 91 | 技巧 29. [使用`:t` `:m` 进行复制和移动行](part1_pattern/chapter5_ex_mode/tip29.md): `:6t.`,`Vjj:m$`
92 | 93 | 技巧 30. [在指定范围上执行普通模式命令](part1_pattern/chapter5_ex_mode/tip30.md): `:'<,'>normal .`
94 | 95 | 技巧 31. [重复上次的Ex命令](part1_pattern/chapter5_ex_mode/tip31.md):`:@:`, `:bp`,`:bn`
96 | 97 | 技巧 32. [自动补全Ex命令](part1_pattern/chapter5_ex_mode/tip32.md):``,``,``
98 | 99 | 技巧 33. [把当前单词插入到命令行](part1_pattern/chapter5_ex_mode/tip33.md): `/`, `*:%s///g`
100 | 101 | 技巧 34. [回溯历史命令](part1_pattern/chapter5_ex_mode/tip34.md):`q:`
102 | 103 | 技巧 35. [运行Shell命令](part1_pattern/chapter5_ex_mode/tip35.md): `:ls`,`:write! sh`,`:write !sh`,`:2,$!sort -t',' -k2,2`
104 | 105 | # 第二部分 文件 106 | 107 | ## 第6章 管理多个文件 108 | 109 | > 1. 缓冲区列表记录打开的所有文件 110 | > 2. 缓冲区文件分组方法 111 | > 3. 将Ex命令作用在缓冲区每个文件上 112 | > 4. 标签页分割窗口 113 | 114 | 技巧 36. [用缓冲区列表管理打开的文件](part2_file/chapter6_multi_files/tip36.md): `:bnext`, `:ls`, ``, `:bprev`, `:bfirst`, `:blast`, `:buffer N`, `:buffer {bufname}`, `:bufdo`, `:argdo`, `:bd[elete]`
115 | 116 | 技巧 37. [用参数列表将缓冲区分组](part2_file/chapter6_multi_files/tip37.md): `:args {arglist}`
117 | 118 | 技巧 38. [管理隐藏缓冲区](part2_file/chapter6_multi_files/tip38.md): `:wirte`, `:edit!`, `qall!`, `:wall`
119 | 120 | 技巧 39. [将工作区分成窗口](part2_file/chapter6_multi_files/tip39.md): `s`, `v`, `:edit`, `:close`, `:only`
121 | 122 | 技巧 40. [用标签页将窗口分组](part2_file/chapter6_multi_files/tip40.md): `:lcd{path}`, `:tabe[dit] {filename}`, `:tabmove [N]`
123 | 124 | ## 第7章 打开及保存文件 125 | 126 | > 1. 介绍在vim 中打开文件的方式 127 | > 2. 配置`path`选项之后利用`:find` 命令打开文件 128 | > 3. `netrw`插件查看目录树 129 | > 4. 保存文件的时候如果没有**写权限**或是目标路径不存在怎么办? 130 | 131 | 技巧 41. [用`:edit`命令打开文件](part2_file/chapter7_file_opr/tip41.md): `:edit %`, `:edit %:h`
132 | 133 | 技巧 42. [使用`:find`打开文件](part2_file/chapter7_file_opr/tip42.md): `:find`, `:set path+=app/**`
134 | 135 | 技巧 43. [使用netrw管理文件系统](part2_file/chapter7_file_opr/tip43.md):`:edit .`, `:e.`, `:Explore`, `:E.`
136 | 137 | 技巧 44. [把文件保存到不存在的目录中](part2_file/chapter7_file_opr/tip44.md): ``, `:!mkdir -p %:h`
138 | 139 | 技巧 45. [以超级用户权限保存文件](part2_file/chapter7_file_opr/tip45.md): `:w !sudo tee % > /dev/null`
140 | 141 | 142 | # 第三部分 更快的移动和跳转 143 | 144 | > 学习vim如何在文件内、文件间快速跳转 145 | 146 | ## 第8章 用动作命令在文档中快速跳转 147 | 148 | > 1. 使用动作(motion)命令在文档中跳转 149 | > 2. 上下左右移动、一次移动一个单词、通过查找命令快速移动 150 | > 3. 操作符待决模式 151 | > 4. 查看vim文档`:h motion` 152 | 153 | 技巧 46. [让手指保持在 `本位行(Home Row)`上](part3_fast_move/chapter8_doc_jump/tip46.md): `h,j,k,l`
154 | 155 | 技巧 47. [区分实际行和屏幕行](part3_fast_move/chapter8_doc_jump/tip47.md):`gj`, `gk`, `g0`, `g$`, `g^`
156 | 157 | 技巧 48. [基于单词移动](part3_fast_move/chapter8_doc_jump/tip48.md):`w`, `b`, `e`, `ge`, `ea`, `gea`, `W`, `cW`
158 | 159 | 技巧 49. [对字符串进行查找](part3_fast_move/chapter8_doc_jump/tip49.md):`f{char}`, `;`, `,`, `F{char}`, `t{char}`, `T{char}`, `dt.`
160 | 161 | 技巧 50. [通过查找进行移动](part3_fast_move/chapter8_doc_jump/tip50.md):`/{char}`, `n`, `N`
162 | 163 | 技巧 51. [用精确的文本对象选择选取](part3_fast_move/chapter8_doc_jump/tip51.md):`vi}`, `a"`, `i"`, `at`, `it`
164 | 165 | 技巧 52. [删除周边,修改内部](part3_fast_move/chapter8_doc_jump/tip52.md):`iw`, `iW`, `is`, `ip`, `aw`, `aW`, `as`, `ap`
166 | 167 | 技巧 53. [设置位置标记,以便快速跳回](part3_fast_move/chapter8_doc_jump/tip53.md):`m{a-zA-Z}`, `'{mark}`
168 | 169 | 技巧 54. [在匹配括号间跳转](part3_fast_move/chapter8_doc_jump/tip54.md):`%`, `S"`
170 | 171 | ## 第9章 在文件间跳转 172 | 173 | 174 | 技巧 55. [遍历跳转列表](part3_fast_move/chapter9_file_jump/tip55.md): ``, ``
175 | 176 | 技巧 56. [遍历改变列表](part3_fast_move/chapter9_file_jump/tip56.md): `:changes`, **`.**, **`^**, `gi`
177 | 178 | 技巧 57. [跳转到光标下的文件](part3_fast_move/chapter9_file_jump/tip57.md): `gf`, `:set path?`
179 | 180 | 技巧 58. [用全局位置标记在文件间快速跳转](part3_fast_move/chapter9_file_jump/tip58.md): `:vimgrep`, `` `{char}``
181 | 182 | # 第四部分 寄存器 183 | 184 | > 1. 寄存器是保存文本的容器 185 | > 2. 寄存器可以实现复制、粘贴、剪切文本; 可以记录一系列按键操作,制作宏命令 186 | 187 | ## 第10章 复制和粘贴 188 | 189 | > 1. vim提供几十个寄存器保存文本,比系统单一的剪切板多很多 190 | > 2. vim的粘贴可以面向行和面向字符 191 | > 3. 可视模式下的粘贴、系统剪切板的使用 192 | 193 | 技巧 59. [用无名寄存器实现删除、复制和粘帖操作](part4_register/chapter10_copy_paste/tip59.md): `x`, `p`, `xp`, `dd`, `ddp`, `yyp`, `P`, `diw`
194 | 195 | 技巧 60. [深入理解vim寄存器](part4_register/chapter10_copy_paste/tip60.md): `"{register}`, `"ayiw`, `"bdd`, `"ap`, `"bp`, `""p`, `"0P`, `:reg "0`, `"_d{motion}`, `"+`, `"+p +`
196 | 197 | 技巧 61. [用寄存器中的内容替换高亮选取的文本](part4_register/chapter10_copy_paste/tip61.md): `m{char}`, `` `{char}``
198 | 199 | 技巧 62. [把寄存器中的内容粘贴出来](part4_register/chapter10_copy_paste/tip62.md): `{register}`, `p`, `P`, `gp`, `gP`
200 | 201 | 技巧 63. [与系统粘贴板进行交互](part4_register/chapter10_copy_paste/tip63.md): `:set pastetoggle=`, `"+p`
202 | 203 | ## 第11章 宏 204 | 205 | > 1. 宏是`.`指令的加强版 206 | > 2. 宏适合对一系列相似的行、段落、文件上操作 207 | > 3. 宏的执行分2种方式:串行方式回放 和 并行方式多次运行 208 | 209 | 技巧 64. [宏的读取和执行](part4_register/chapter11_macro/tip64.md): `q`, `q{register}`, `:reg a`, `@{register}`, `@@`
210 | 211 | 技巧 65. [规范光标位置、直达目标以及终止宏](part4_register/chapter11_macro/tip65.md): `{number}@a`
212 | 213 | 技巧 66. [加次数回放宏](part4_register/chapter11_macro/tip66.md): `qq;.q`
214 | 215 | 技巧 67. [在连续的文本行上重复修改](part4_register/chapter11_macro/tip67.md): `0`, `:normal @a`
216 | 217 | 技巧 68. [给宏追加命令](part4_register/chapter11_macro/tip68.md): `qa`, `qA`
218 | 219 | 技巧 69. [在一组文件中执行宏](part4_register/chapter11_macro/tip69.md): `gg/class`, `:argdo`, `:edit!`, `:argdo normal @a`, `:argdo write`, `:wall`, `:wnext`
220 | 221 | 技巧 70. [用迭代求值的方式给列表编号](part4_register/chapter11_macro/tip70.md): `:let i=0`, `:echo i`, `=i`
222 | 223 | 技巧 71. [编辑宏的内容](part4_register/chapter11_macro/tip71.md): `~`, `vU`, `:put a`
224 | 225 | # 第五部分 模式 226 | 227 | > 1. pattern使得构造正则表达式和原义查找文本变得容易 228 | > 2. substitute和global是2个强大的Ex命令 229 | 230 | ## 第12章 按模式匹配和按原义匹配 231 | 232 | > 1. 查找时替换的前提,如何在查找时使用正则表达式? 233 | > 2. `very magic`、`very nomagic`模式、原义开关都是什么,什么用? 234 | > 3. 零宽度定界符有哪些?各自作用是? 235 | 236 | 技巧 72. [调整查找模式的大小写敏感性](part5_pattern/chapter12_match/tip72.md): `\c`, `\C` 237 | 238 | 技巧 73. [使用`\v`模式进行正则表达式查找](part5_pattern/chapter12_match/tip73.md): `\v` 239 | 240 | 技巧 74. [完全匹配字符串时,使用`\V` 查找](part5_pattern/chapter12_match/tip74.md): `\V` 241 | 242 | 技巧 75. [使用圆括号`()`获取子匹配](part5_pattern/chapter12_match/tip75.md): `()` 243 | 244 | 技巧 76. [使用`<`,`>`界定单词边界](part5_pattern/chapter12_match/tip76.md): `<`, `>` 245 | 246 | 技巧 77. [界定匹配的边界(使用`\zs`, `\ze`)](part5_pattern/chapter12_match/tip77.md): `\zs`, `\ze` 247 | 248 | 技巧 78. [转移问题字符](part5_pattern/chapter12_match/tip78.md): `/\?`需要转义 249 | 250 | ## 第13章 查找 251 | 252 | > 1. 查找模式可以自动补全匹配、减少按键次数、统计匹配数量 253 | > 2. 构造正确的正则表达式一般需要调试多次,我们可以迭代的构造模式,减少调试代价 254 | > 3. 可以定制命令,查找高亮选区的文本 255 | > 4. 定制自己的`*`,在可视模式下也可快速查找选中的文本 256 | 257 | 技巧 79. [查找命令入门](part5_pattern/chapter13_search/tip79.md): `/`, `?`, `n`, `N` 258 | 259 | 技巧 80. [高亮查找匹配](part5_pattern/chapter13_search/tip80.md): `hlsearch`, `noh`, `` 260 | 261 | 技巧 81. [在执行查找前预览第一处匹配](part5_pattern/chapter13_search/tip81.md): `incsearch`, `` 262 | 263 | 技巧 82. [统计当前模式的匹配个数](part5_pattern/chapter13_search/tip82.md): `:%s///gn` 264 | 265 | 技巧 83. [将光标偏移到查找匹配的结尾](part5_pattern/chapter13_search/tip83.md): `/xxxx/e` 266 | 267 | 技巧 84. [对完整的查找匹配进行操作](part5_pattern/chapter13_search/tip84.md): `/\vX(ht)?ml\C`,`gUfl` 268 | 269 | 技巧 85. [利用查找历史, 迭代完成复杂的模式](part5_pattern/chapter13_search/tip85.md): `:%s/\v'(([^']|'\w)+)'/“\1”/g` 270 | 271 | 技巧 86. [查找当前高亮选区中的文本](part5_pattern/chapter13_search/tip86.md): `y/"` 272 | 273 | ## 第14章 替换 274 | 275 | > 1. 替换和查找是最常用的vim命令 276 | > 2. 替换命令中的查找域可以为空 277 | > 3. 替换命令支持跨文件操作 278 | > 4. 替换命令中的替换域支持脚本表达式,实现复杂操作 279 | 280 | 技巧 87. [结识 substitute 命令](part5_pattern/chapter14_substitute/tip87.md): `:[range]s/{pattern}/{string}/[flags]` 281 | 282 | 技巧 88. [在文件范围内查找并替换每一处匹配](part5_pattern/chapter14_substitute/tip88.md): `:%s/going/rolling/g` 283 | 284 | 技巧 89. [手动控制每一次替换操作](part5_pattern/chapter14_substitute/tip89.md): `:%s/content/copy/gc` 285 | 286 | 技巧 90. [重用上次的查找模式](part5_pattern/chapter14_substitute/tip90.md): `:%s//“\1”/g`, `:%s/\n/,/g`, `:%s///“\1”/g` 287 | 288 | 技巧 91. [用寄存器的内容替换](part5_pattern/chapter14_substitute/tip91.md): `:%s//0/g` 289 | 290 | 技巧 92. [重复上一次 substitute 命令](part5_pattern/chapter14_substitute/tip92.md): `:%s//~/&`, `g&`, `:%s/Name/Number/g`, `:%&&` 291 | 292 | 技巧 93. [使用子匹配重排CSV文件的字段](part5_pattern/chapter14_substitute/tip93.md): `/\v^([^,]*),([^,]*),([^,]*)$`、`:%s//\3,\2,\1` 293 | 294 | 技巧 94. [在替换过程中执行算术运算 ](part5_pattern/chapter14_substitute/tip94.md): `/\v\<\/?h\zs\d`, `:%s//\=submatch(0)-1/g` 295 | 296 | 技巧 95. [交换两个或更多的单词](part5_pattern/chapter14_substitute/tip95.md): `:%s//\={"dog":"man","man":"dog"}[submatch(1)]/g` 297 | 298 | 技巧 96. [在多个文件中执行查找与替换](part5_pattern/chapter14_substitute/tip96.md): `:argdo %s//Practical/g`, `:vimgrep /// **/*.txt` 299 | 300 | ## 第15章 global 命令 301 | 302 | > 1. global 命令融合了Ex命令与Vim模式匹配的能力 303 | > 2. 可以在指定模式的所有匹配行上运行Ex命令 304 | > 3. global 命令是除了点范式和宏以外,最强大的Vim工具 305 | 306 | 技巧 97. [结识 global 命令](part5_pattern/chapter15_global_cmd/tip97.md): `:[range] global[!] /{pattern}/ [cmd]` 307 | 308 | 技巧 98. [删除所有包含模式的文本行](part5_pattern/chapter15_global_cmd/tip97.md): `/\v\<\/?\w+>`,`:g//d`,`:v/href/d`,`:g/re/p` 309 | 310 | 技巧 99. [将 TODO 项收集至寄存器](part5_pattern/chapter15_global_cmd/tip97.md): `:global`,`:yank` 311 | 312 | 技巧 100. [将 CSS 文件中所有规则的属性按照字母排序](part5_pattern/chapter15_global_cmd/tip100.md): `:g/{/ .+1,/}/-1 sort` 313 | 314 | 315 | # 第六部分 工具 316 | 317 | > 1. vim内可以方便调用make、grep等外部程序 318 | > 2. vim提供拼写检查和自动补全等命令 319 | 320 | ## 第16章 通过 ctags 建立索引,并用其浏览源代码 321 | 322 | > 1. ctags使我们可以快速跳到函数和类的定义处,实现浏览整个代码库 323 | > 2. ctags的结果也可以用于自动补全 324 | 325 | 技巧 101. [结识ctags](part6_tools/chapter16_ctags/tip101.md): `ctags *` 326 | 327 | 技巧 102. [配置 Vim 使用 ctags](part6_tools/chapter16_ctags/tip102.md): `:set tags?`,`:!ctags -R` 328 | 329 | 技巧 103. [使用 Vim 的标签跳转命令,浏览关键字的定义](part6_tools/chapter16_ctags/tip103.md): ``,``,`g`,`:tag {keyword}`,`:tjump {keyword}` 330 | 331 | ## 第17章 编译代码,并通过 Quickfix 列表浏览错误信息 332 | 333 | > 1. quickfix列表会维护乙组文件名、行号、列号(可选)与消息组成的注释定位信息 334 | > 2. 可以使用`:make`命令编译,并将错误信息进行解析,在quickfix列表中提供浏览 335 | 336 | 技巧 104. [不用离开 Vim 也能编译代码](part6_tools/chapter17_compile/tip104.md): `make`, `:cnext` 337 | 338 | 技巧 105. [浏览 Quickfix 列表](part6_tools/chapter17_compile/tip105.md): `:cprev`,`:cnext`,`:cfirst`,`:clast`,`:cnfile`,`:cpfile`,`:cc N`, `:copen` 339 | 340 | 技巧 106. [回溯以前的 Quickfix 列表](part6_tools/chapter17_compile/tip106.md): `:colder`,`:cnewer`, `:5colder` 341 | 342 | 技巧 107. [定制外部编译器](part6_tools/chapter17_compile/tip107.md): `:setglobal errorformat?` 343 | 344 | 345 | ## 第18章 通过 grep、vimgrep 以及其他工具对整个工程进行查找 346 | 347 | > 1. `:grep`可以在不离开vim下调用外部程序 348 | > 2. `:gep`可以调用grep,也可以调用ack 349 | > 3. `:vimgrep`允许在多个文件中指定查找模式 350 | 351 | 技巧 108. [不必离开 Vim 也能调用 grep](part6_tools/chapter18_grep_search/tip108.md): `:grep Waldo *` 352 | 353 | 技巧 109. [定制grep程序](part6_tools/chapter18_grep_search/tip109.md): `grepprg`,`grepformat` 354 | 355 | 技巧 110. [使用 Vim 内部的 Grep](part6_tools/chapter18_grep_search/tip110.md): `:vimgrep`,`vim /// **` 356 | 357 | 358 | ## 第19章 自动补全 359 | 360 | > 1. vim可以从限定的来源(缓冲区文件、头文件、标签文件)来进行自动补全 361 | > 2. 介绍如何从补全列表中获取正确的单词,以及如何获取相关度最高的补全建议 362 | 363 | 技巧 111. [结识 Vim 的关键字自动补全](part6_tools/chapter19_auto_complete/tip111.md): ``,``,`` 364 | 365 | 技巧 112. [与自动补全的弹出式菜单进行交互](part6_tools/chapter19_auto_complete/tip112.md): ``等价于``;``等价于`` 366 | 367 | 技巧 113. [掌握关键字的来龙去脉](part6_tools/chapter19_auto_complete/tip113.md): ``,``,`` 368 | 369 | 技巧 114. [使用字典中的单词进行自动补全](part6_tools/chapter19_auto_complete/tip114.md): ``,`:set spell` 370 | 371 | 技巧 115. [自动补全整行文本](part6_tools/chapter19_auto_complete/tip115.md) 372 | 373 | 技巧 116. [自动补全文件名](part6_tools/chapter19_auto_complete/tip116.md): `` 374 | 375 | 技巧 117. [根据上下文自动补全](part6_tools/chapter19_auto_complete/tip117.md): `` 376 | 377 | ## 第20章 利用 Vim 的拼写检查器,查找并更正拼写错误 378 | 379 | > 1. vim的拼写检查可以针对不同语言/地区使用不同的规则 380 | > 2. 插入模式下也可以使用拼写检查 381 | > 3. 可以对拼写检查的单词表进行自定义(添加/删除) 382 | 383 | 技巧 118. [对你的工作进行拼写检查](part6_tools/chapter20_spell_check/tip118.md): `[s`,`]s`,`2z=` 384 | 385 | 技巧 119. [使用其他拼写字典](part6_tools/chapter20_spell_check/tip119.md): `:set spelllang=en_us` 386 | 387 | 技巧 120. [将单词添加到拼写文件中](part6_tools/chapter20_spell_check/tip120.md): `zg`,`zw` 388 | 389 | 技巧 121. [在插入模式下更正拼写错误](part6_tools/chapter20_spell_check/tip121.md): `s` 390 | --------------------------------------------------------------------------------