人们谈论常见技巧的问题很多,特别是“Vim+ctags提示和技巧”。

然而,我并没有提到Vim新手会觉得很酷的常用快捷方式。我所说的是一位经验丰富的Unix用户(无论是开发人员、管理员,还是两者都有),他们认为自己知道99%的人从未听说过或梦想过的东西。这不仅让他们的工作更容易,而且很酷,很粗糙。毕竟,Vim位于世界上最黑暗的角落丰富的操作系统中,因此它应该具有只有少数特权人士知道并想与我们分享的复杂性。


当前回答

使用shebang创建一个函数来执行当前缓冲区(假设设置了一个),并使用crtl-x调用它。

map <C-X> :call CallInterpreter()<CR>

au BufEnter *
\ if match (getline(1) , '^\#!') == 0 |
\   execute("let b:interpreter = getline(1)[2:]") |
\ endif

fun! CallInterpreter()
    if exists("b:interpreter")
        exec("! ".b:interpreter." %")
    endif
endfun

其他回答

以下两项都不是真正的顽固,但我发现它非常有用。

琐碎的捆绑,但我不能没有。它在插入模式下启用hjkl风格的移动(使用ctrl键)。在正常模式下:ctrl-k/j向上/向下滚动半个屏幕,ctrl-l/h转到下一个/上一个缓冲区。µ和ù映射特别适用于AZERTY键盘,并转到下一个/上一个错误。

imap <c-j> <Down>
imap <c-k> <Up>
imap <c-h> <Left>
imap <c-l> <Right>
nmap <c-j> <c-d>
nmap <c-k> <c-u>
nmap <c-h> <c-left>
nmap <c-l> <c-right>

nmap ù :cp<RETURN>
nmap µ :cn<RETURN>

我编写了一个小函数来突出显示函数、全局、宏、结构和typedef。(对于非常大的文件可能会很慢)。每种类型都有不同的突出显示(请参阅“:help group name”了解当前颜色主题的设置)用法:使用ww(默认“\ww”)保存文件。你需要做这个。

nmap <Leader>ww :call SaveCtagsHighlight()<CR>

"Based on: http://stackoverflow.com/questions/736701/class-function-names-highlighting-in-vim
function SaveCtagsHighlight()
    write

    let extension = expand("%:e")
    if extension!="c" && extension!="cpp" && extension!="h" && extension!="hpp"
        return
    endif

    silent !ctags --fields=+KS *
    redraw!

    let list = taglist('.*')
    for item in list
        let kind = item.kind

        if     kind == 'member'
            let kw = 'Identifier'
        elseif kind == 'function'
            let kw = 'Function'
        elseif kind == 'macro'
            let kw = 'Macro'
        elseif kind == 'struct'
            let kw = 'Structure'
        elseif kind == 'typedef'
            let kw = 'Typedef'
        else
            continue
        endif

        let name = item.name
        if name != 'operator=' && name != 'operator ='
            exec 'syntax keyword '.kw.' '.name
        endif
    endfor
    echo expand("%")." written, tags updated"
endfunction

我有编写大量代码和函数的习惯,我不喜欢为它们编写原型。所以我做了一些函数,在C样式源文件中生成原型列表。它有两种风格:一种是删除形式参数的名称,另一种是保留它。每次需要更新原型时,我都会刷新整个列表。它避免了原型和函数定义不同步。还需要ctags。

"Usage: in normal mode, where you want the prototypes to be pasted:
":call GenerateProptotypes()
function GeneratePrototypes()
    execute "silent !ctags --fields=+KS ".expand("%")
    redraw!
    let list = taglist('.*')
    let line = line(".")
    for item in list
        if item.kind == "function"  &&  item.name != "main"
            let name = item.name
            let retType = item.cmd
            let retType = substitute( retType, '^/\^\s*','','' )
            let retType = substitute( retType, '\s*'.name.'.*', '', '' ) 

            if has_key( item, 'signature' )
                let sig = item.signature
                let sig = substitute( sig, '\s*\w\+\s*,',        ',',   'g')
                let sig = substitute( sig, '\s*\w\+\(\s)\)', '\1', '' )
            else
                let sig = '()'
            endif
            let proto = retType . "\t" . name . sig . ';'
            call append( line, proto )
            let line = line + 1
        endif
    endfor
endfunction


function GeneratePrototypesFullSignature()
    "execute "silent !ctags --fields=+KS ".expand("%")
    let dir = expand("%:p:h");
    execute "silent !ctags --fields=+KSi --extra=+q".dir."/* "
    redraw!
    let list = taglist('.*')
    let line = line(".")
    for item in list
        if item.kind == "function"  &&  item.name != "main"
            let name = item.name
            let retType = item.cmd
            let retType = substitute( retType, '^/\^\s*','','' )
            let retType = substitute( retType, '\s*'.name.'.*', '', '' ) 

            if has_key( item, 'signature' )
                let sig = item.signature
            else
                let sig = '(void)'
            endif
            let proto = retType . "\t" . name . sig . ';'
            call append( line, proto )
            let line = line + 1
        endif
    endfor
endfunction
:%!xxd

将vim制作成十六进制编辑器。

:%!xxd -r

还原

警告:如果不使用二进制(-b)进行编辑,可能会损坏文件。–Josh Lee在评论中写道。

我确信有人已经发布了这篇文章,但这里是这样的。

请选择任何构建系统;制造,mvn,蚂蚁,随便什么。在项目目录的根目录中,创建一个始终使用的命令文件,如下所示:

根项目上进行构建mvn清洁安装等等

要进行构建,请将光标放在线上并键入!!即过滤该线路;将其写入shell并替换为结果。

构建日志将替换行,随时可以滚动、搜索等。

查看完日志后,键入u以撤消,然后返回命令文件。

每个线程

要给一组行加前缀,我使用两种不同的方法之一:

一种方法是块选择(由某事物提及)。通常,可以使用ctrl-V键选择矩形区域,然后移动光标。高亮显示矩形后,按shift-I将在矩形左侧插入字符,或shift-a将在矩形右侧追加字符。因此,您可以使用此技术创建一个矩形,其中包含要添加前缀的行的最左列,单击shift-I,键入前缀,然后单击escape。

另一种方法是使用替换(如Brian Agnew所述)。Brian的替换将影响整个文件(命令中的%表示“所有行”)。要只影响几行,最简单的方法是在第一行/最后一行时按shift-V(启用视觉行模式),然后移动到最后一行/第一行。然后键入:

:s/^/您的前缀/

^是一个正则表达式(在本例中,是行的开头)。通过在视觉行模式下键入此项,您将看到“<,”>自动插入s之前。这意味着替代的范围将是视觉选择。

额外提示:如果前缀包含斜杠,可以用反斜杠转义,也可以在命令中使用不同的标点符号作为分隔符。例如,要添加C++行注释,我通常会写:

:s:^://:

对于添加后缀,替换方法通常更容易,除非所有行的长度完全相同。只需在模式中使用$而不是^,您的字符串将被追加而不是预挂起。

如果要同时添加前缀和后缀,可以执行以下操作:

:s/.*/前缀和后缀/

.*匹配整行。替换中的&将匹配的文本(整行)放回原处,但现在它将添加前缀和后缀。

顺便说一句:在注释代码时,您可能希望稍后取消注释。您可以使用视觉块(ctrl-V)选择斜线,然后单击d删除它们,或者可以使用替换(可能使用视觉线选择,使用shift-V)删除前导斜线,如下所示:

:s://::

我很少在大多数Vim教程中找到一个,但它非常有用(至少对我来说),那就是

g;和g,

在变更列表中移动(向前、向后)。

让我来演示一下我是如何使用它的。有时我需要复制并粘贴一段代码或字符串,比如CSS文件中的十六进制颜色代码,所以我搜索、跳转(不在乎匹配的位置)、复制它,然后跳回(g;)编辑代码的位置以最终粘贴它。不需要创建标记。更简单。

只是我的20美分。