[转载] Vim技巧
如何将一串十进制数字转换为 16 进制数字,使用 VIM 完成转换的最简单方法如下: :%s//d/+//=printf(%X, submatch(0))/g 这条命令的原理是,把一串数字,用 printf() 函数的输出替换掉, printf() 函数输出的正是这串数字的 16 进制形式。 分解如下: %s 在
如何将一串十进制数字转换为16进制数字,使用VIM完成转换的最简单方法如下:
:%s//d/+//=printf("%X", submatch(0))/g
这条命令的原理是,把一串数字,用printf()函数的输出替换掉,printf()函数输出的正是这串数字的16进制形式。
分解如下:
%s 在整个文件中替换 (:help :s )
/d/+ 匹配一个或多个数字 (:help //d :help //+ )
/= 使用表达式的结果进行替换 (:help //w )
printf 按指定格式输出 (:help printf() )
submatch() 返回:s命令中的指定匹配字符串 (:help submatch() )
g 替换行内所有出现的匹配 (:help :s_flags)
看来,替换命令的巧妙使用可以完成很多意想不到的功能!
下面这个技巧是在VIM邮件列表中看到的,非常实用。
这里以编写C语言程序为例, 假设,我们最终想完成的代码如下:
#define BIT_MASK_1 (1
#define BIT_MASK_2 (1
#define BIT_MASK_3 (1
#define BIT_MASK_4 (1
#define BIT_MASK_5 (1
#define BIT_MASK_6 (1
#define BIT_MASK_7 (1
#define BIT_MASK_8 (1
#define BIT_MASK_9 (1
#define BIT_MASK_10 (1
#define BIT_MASK_11 (1
#define BIT_MASK_12 (1
#define BIT_MASK_13 (1
#define BIT_MASK_14 (1
#define BIT_MASK_15 (1
#define BIT_MASK_16 (1
#define BIT_MASK_17 (1
#define BIT_MASK_18 (1
#define BIT_MASK_19 (1
#define BIT_MASK_20 (1
#define BIT_MASK_21 (1
#define BIT_MASK_22 (1
#define BIT_MASK_23 (1
#define BIT_MASK_24 (1
#define BIT_MASK_25 (1
#define BIT_MASK_26 (1
#define BIT_MASK_27 (1
#define BIT_MASK_28 (1
#define BIT_MASK_29 (1
#define BIT_MASK_30 (1
#define BIT_MASK_31 (1
#define BIT_MASK_32 (1
我们不需要一行一行的去写,只需要先写好第一行,如下:
#define BIT_MASK_1 (1
然后,我们回到Normal模式,在这一行上输入“Y31p",拷贝此行,然后粘贴31次。这样,我们得到总共32行上面的内容。
现在使用"V31j"命令选中这32行,然后使用两次替换命令:
:''>s/BIT_MASK_/zs/d*/ze//=line(".") - line("'") + 1
:''>s//zs/d*/ze)$//=line(".")-line("'")
这样,我们就得到了我们想要的结果。
这种方式还可以用于数组下标的自动增加,以及文本的章节自动编号等功能。只要你能够用正则表达式准确的定位出你想要自动编号的的数字,那么就可以使用这种方法来自动编号。
以第一条命令为例,第二条命令和第一条命令类似:
:','>s/BIT_MASK_/zs/d*/ze//=line(".") - line("'") + 1
这条命令在我们选中的区域内进行替换,查找以“BIT_MASK_”开头,后面跟任意多个数字的字符串,并把匹配位置放在数字上,然后使用后面表达式计算出来的数字替换这些匹配的数字。
下面是这条命令中每个元素的含义:
' 我们所选中的区域 (:help ''> )
s 在选中的区域中进行替换 (:help :s )
/zs 指明匹配由此开始 (:help //zs )
/d* 查找任意位数的数字 (:help //d )
/ze 指明匹配到此为止 (:help //ze )
/= 指明后面是一个表达式 (:help :s/= )
line(".") 当前光标所在行的行号 (:help line() )
line("') 我们所选区域中第一行的行号 (:help line() )
“'”和“'>”是我们使用了“v”,“V”命令选中一个visual区域后,VIM设置的标记,分别用来标识visual区域的开始和结束。
“BIT_MASK_/zs/d*/ze”是一个正则表达式,用来查找以“BIT_MASK_”开头,后面跟任意多个数字的字符串。其中“/zs”、“/ze”用来指定匹配的开始和结束位置,因为我们只打算替换“BIT_MASK_0”中的数字,所以在查找时只把匹配区域置在数字上。
由于我们的替换操作要把不同行的数字替换成不同的值,所以在这里需要使用一个表达式来计算出替换后的值。当“:s”命令的替换字符串是以“/=”开头时,表明使用一个表达式计算的结果进行替换。我们这里的表达式就是“line(".") - line("'”,其中“line()”函数用来获得行号,它可以获得当前行的行号,以及指定的标记(mark)所在的行号。“line(".")”用来获得当前光标所在行的行号,“line("'”则用来获得“'”标记所在行的行号。这两个行号的差加上1就是我们想替换的值。
在上面的例子中,我们使用VIM的替换功能,实现高效的代码编写。现在介绍另外一种方法,实现相同的功能。
我们先看例子:
UniqueID2 = lview.focusedItem.subItems.opIndex(0).text;
Parent = lview.focusedItem.subItems.opIndex(0).text;
Children = lview.focusedItem.subItems.opIndex(0).text;
login = lview.focusedItem.subItems.opIndex(1).text;
txtCust.text = lview.focusedItem.subItems.opIndex(2).text;
txtProj.text = lview.focusedItem.subItems.opIndex(3).text;
txtbDate.text = lview.focusedItem.subItems.opIndex(4).text;
txtdDate.text = lview.focusedItem.subItems.opIndex(5).text;
txteDate.text = lview.focusedItem.subItems.opIndex(6).text;
txtPM.text = lview.focusedItem.subItems.opIndex(7).text;
txtLang.text = lview.focusedItem.subItems.opIndex(8).text;
txtVendor.text = lview.focusedItem.subItems.opIndex(9).text;
txtInvoice.text = lview.focusedItem.subItems.opIndex(10).text;
txtPMFund.text = lview.focusedItem.subItems.opIndex(11).text;
txtProjFund.text= lview.focusedItem.subItems.opIndex(12).text;
txtA_No.text = lview.focusedItem.subItems.opIndex(13).text;
txtNotes.text = lview.focusedItem.subItems.opIndex(14).text;
txtStatus.text = lview.focusedItem.subItems.opIndex(15).text;
我们要把上面代码中括号中的数字,替换成由0开始的一个顺序递增序列,例如:
UniqueID2 = lview.focusedItem.subItems.opIndex(0).text;
Parent = lview.focusedItem.subItems.opIndex(1).text;
Children = lview.focusedItem.subItems.opIndex(2).text;
……
实现以上需求,除了用前面介绍的方法外,还可以用下面的命令:
:let n=0 | g/opIndex(/zs/d/+/s///=n/|let n+=1
下面简单讲解一下这条命令各个组成元素:
let 为变量赋值 (:help let )
| 用来分隔不同的命令 (:help :bar )
g 在匹配后面模式的行中执行指定的ex命令 (:help :g )
/zs 指明匹配由此开始 (:help //zs )
/d/+ 查找1个或多个数字 (:help //d )
s 对匹配模式进行替换 (:help :s )
/= 指明后面是一个表达式 (:help :s/= )
所以,这条命令的执行过程为:
1. 给变量n赋值为0;
2. 查找模式” opIndex(/zs/d/+”,使用变量n的值替换匹配的模式字符串;
3. 给变量n加1;
需要说明一下”|”,它用来分隔不同的命令。
另外,在substitute命令中,如果省略匹配模式字符串,它会使用之前定义的匹配模式字符串,在本例中就是由”global”命令定义的”opIndex(/zs/d/+”。
除了上面介绍的方法外,还有一个VIM插件专门实现数字、日期等的增、减,可以在下面的网址下载此插件:
http://vim.sourceforge.net/scripts/script.php?script_id=670
或
http://mysite.verizon.net/astronaut/vim/index.html#VISINCR

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Petua praktikal untuk menukar huruf Inggeris lebar penuh kepada bentuk separuh lebar Dalam kehidupan moden, kita sering bersentuhan dengan huruf Inggeris, dan kita sering perlu memasukkan huruf Inggeris apabila menggunakan komputer, telefon bimbit dan peranti lain. Walau bagaimanapun, kadangkala kita menemui huruf Inggeris lebar penuh, dan kita perlu menggunakan bentuk separuh lebar. Jadi, bagaimana untuk menukar huruf Inggeris lebar penuh kepada bentuk separuh lebar? Berikut adalah beberapa petua praktikal untuk anda. Pertama sekali, huruf dan nombor Inggeris lebar penuh merujuk kepada aksara yang menduduki kedudukan lebar penuh dalam kaedah input, manakala huruf dan nombor Inggeris separuh lebar menduduki kedudukan lebar penuh.

Perkongsian Petua Win11: Satu helah untuk melangkau log masuk akaun Microsoft Windows 11 ialah sistem pengendalian terkini yang dilancarkan oleh Microsoft, dengan gaya reka bentuk baharu dan banyak fungsi praktikal. Walau bagaimanapun, bagi sesetengah pengguna, perlu log masuk ke akaun Microsoft mereka setiap kali mereka boot sistem boleh menjadi agak menjengkelkan. Jika anda salah seorang daripada mereka, anda juga boleh mencuba petua berikut, yang akan membolehkan anda melangkau log masuk dengan akaun Microsoft dan memasuki antara muka desktop secara langsung. Pertama, kita perlu mencipta akaun tempatan dalam sistem untuk log masuk dan bukannya akaun Microsoft. Kelebihan melakukan ini ialah

Dalam bahasa C, ia mewakili penunjuk, yang menyimpan alamat pembolehubah lain & mewakili pengendali alamat, yang mengembalikan alamat memori pembolehubah. Petua untuk menggunakan penunjuk termasuk mentakrifkan penunjuk, membatalkan rujukan dan memastikan bahawa penunjuk menunjuk ke alamat yang sah & termasuk mendapatkan alamat pembolehubah, dan mengembalikan alamat elemen pertama tatasusunan apabila mendapatkan alamat elemen tatasusunan; . Contoh praktikal yang menggambarkan penggunaan penunjuk dan pengendali alamat untuk membalikkan rentetan.

Cara menukar huruf Inggeris lebar penuh kepada huruf separuh lebar Dalam kehidupan harian dan kerja, kadangkala kita menghadapi situasi di mana kita perlu menukar huruf Inggeris lebar penuh kepada huruf separuh lebar, seperti semasa memasukkan kata laluan komputer, mengedit dokumen atau mereka bentuk susun atur. Huruf dan nombor Inggeris lebar penuh merujuk kepada aksara dengan lebar yang sama dengan aksara Cina, manakala huruf Inggeris separuh lebar merujuk kepada aksara dengan lebar yang lebih sempit. Dalam operasi sebenar, kita perlu menguasai beberapa kaedah mudah untuk menukar huruf Inggeris lebar penuh kepada huruf separuh lebar supaya kita boleh memproses teks dan nombor dengan lebih mudah. 1. Huruf Inggeris lebar penuh dan huruf Inggeris separuh lebar

VSCode (Visual Studio Code) ialah editor kod sumber terbuka yang dibangunkan oleh Microsoft Ia mempunyai fungsi yang berkuasa dan sokongan pemalam yang kaya, menjadikannya salah satu alat pilihan untuk pembangun. Artikel ini akan menyediakan panduan pengenalan untuk pemula untuk membantu mereka menguasai kemahiran menggunakan VSCode dengan cepat. Dalam artikel ini, kami akan memperkenalkan cara memasang VSCode, operasi penyuntingan asas, kekunci pintasan, pemasangan pemalam, dsb., dan menyediakan contoh kod khusus kepada pembaca. 1. Pasang VSCode dahulu, kita perlu

Tutorial PHP: Cara Menukar Jenis Int kepada Rentetan Dalam PHP, menukar data integer kepada rentetan adalah operasi biasa. Tutorial ini akan memperkenalkan cara menggunakan fungsi terbina dalam PHP untuk menukar jenis int kepada rentetan, sambil memberikan contoh kod khusus. Gunakan cast: Dalam PHP, anda boleh menggunakan cast untuk menukar data integer kepada rentetan. Kaedah ini sangat mudah Anda hanya perlu menambah (rentetan) sebelum data integer untuk menukarnya menjadi rentetan. Di bawah ialah kod contoh mudah

Penukaran nilai ASCII dalam PHP adalah masalah yang sering dihadapi dalam pengaturcaraan. ASCII (American Standard Code for Information Interchange) ialah sistem pengekodan standard untuk menukar aksara kepada nombor. Dalam PHP, kita selalunya perlu menukar antara aksara dan nombor melalui kod ASCII. Artikel ini akan memperkenalkan cara menukar nilai ASCII dalam PHP dan memberikan contoh kod tertentu. 1. Tukar aksara

Helah Win11 didedahkan: Cara memintas log masuk akaun Microsoft Baru-baru ini, Microsoft melancarkan sistem pengendalian baharu Windows11, yang telah menarik perhatian meluas. Berbanding dengan versi sebelumnya, Windows 11 telah membuat banyak pelarasan baharu dari segi reka bentuk antara muka dan penambahbaikan fungsi, tetapi ia juga telah menyebabkan beberapa kontroversi Perkara yang paling menarik perhatian ialah ia memaksa pengguna untuk log masuk ke sistem dengan akaun Microsoft . Bagi sesetengah pengguna, mereka mungkin lebih terbiasa log masuk dengan akaun tempatan dan tidak bersedia untuk mengikat maklumat peribadi mereka ke akaun Microsoft.
