5

好吧,这是一个相当复杂的愿望。它源于这样一个事实,即我的大多数 fortran 行都包含一个“调用”语句,而且我厌倦了键入调用、调用、调用、调用...

我想要的是以下内容:

  • 每次我按回车,下一行都会在前面自动添加一个“call”字符串。
  • 如果我按下制表符,制表符会添加到字符串调用的前面(以便我可以缩进)
  • 如果我在该行的开头,并且按一次退格键,它将删除“调用”条目,但保留选项卡。同样,如果我键入“i​​f”、“do”、“enddo”和所有相关的,它可以自动删除该条目会很好

您是否知道这样的事情是否已经存在,是否可能,如果您有任何提示或类似的脚本我可以从中获取,我们将不胜感激。

例如,在 C 风格的注释中,每次我按下回车键时,都会在行首自动添加一个星号。执行此操作的代码在哪里(我假设它是插件功能,而不是在 vim 中硬编码)?

4

2 回答 2

3

我按照您对 C 注释的提示提出了以下建议:

:set formatoptions+=ro
:set comments+=s:call,m:call,e:call

如果一行以 'call' 开头,这应该会自动添加具有相同文本的连续行。它仅在上一行包含“呼叫”并且未在您指定的关键字上删除“呼叫”时才有效。随意使用这些选项,也许您会根据您的喜好对其进行自定义。

用于>>在正常模式下缩进或在插入模式下使用Ctrl+ 。T要删除行开头的“呼叫”,请使用Ctrl+W而不是Backspace.

或者,您可以使用缩写来加快打字速度:

:iab ,, call
于 2012-05-10T11:03:03.227 回答
0

在我看来,当需要改变 and 的行为时<CR><BS>这意味着有问题,或者迟早会出错,因为有很多边缘情况。

我发现的最大问题之一是我无法猜测光标是在函数内的第一列还是第二列,重要的是要知道能够正确处理制表符和退格键。但在这里你有一个开始。我没有彻底测试它,因为它是一团糟。我不推荐它,我认为myki的方法要好得多。

将此注释良好的代码添加到您的vimrc文件中并进行测试。

"" When pressed 'return' in insert mode:
"" <Esc>: Exit from Insert Mode to Normal Mode.
"" o: Add a new line below the current one and set Insert Mode.
"" call <Esc>: Write literal 'call ' and exit from Insert Mode.
"" A: Set cursor at end of line and enter Insert Mode to begin writting.
inoremap <cr> <Esc>ocall <Esc>A

function! SpecialTab()

    "" Get cursor position.
    let cursor_pos = getpos('.')

    "" If line is empty, insert a tab, update current position and finish
    let line_len = strlen( getline( line('.') ) ) 
    if empty( getline( line('.') ) ) || line_len == 1
        s/\%#/\t/   
        let cursor_pos[2] += 1
        call setpos( '.', cursor_pos )
        return
    endif

    "" Search for a line beginning with 'call', omitting spaces. If found
    "" insert a tab at the beginning of line.
    if match( getline( line('.') ), "\s*call" ) != -1
        s/^/\t/
    else
        "" Insert a normal tab in current cursor position. I cannot use
        "" the regular <Tab> command because function would entry in a 
        "" infinite recursion due to the mapping.
        s/\%#\(.\)/\1\t/
    endif

    "" Set cursor column in the character it was before adding tab character.
    let cursor_pos[2] += 2
    call setpos( '.', cursor_pos )
endfunction

"" Map the tab character.
inoremap <Tab> <Esc>:call SpecialTab()<cr>:startinsert<cr>

function! SpecialBackspace()
    "" Do nothing if line is empty.
    if empty( getline( line('.') ) ) 
        return
    endif

    "" Get cursor position.
    let cursor_pos = getpos( '.' )

    "" If cursor is not in first column press 'delete' button and done.
    if col('.') > 1 
        execute "normal \<Del>"
        return
    endif

    "" Search for 'call' string. If found delete it and set cursor in
    "" previous position.
    if match( getline( line('.') ), "\s*call" ) != -1
        s/call//
        let cursor_pos[2] = 1 
        call setpos( '.', cursor_pos )
        return
    endif

    "" A line with one character is a special case. I delete the complete
    "" line.
    let line_len = strlen( getline( line('.') ) )
    if line_len == 1
        s/^.*$//
        return
    endif

    "" If cursor is in first column, delete character. Messy behavior, I
    "" think :-/
    if col('.') == 1
        s/^.//
    endif
endfunction

"" Map the 'backspace' character.
inoremap <BS> <Esc>:call SpecialBackspace()<cr>:startinsert<cr>
于 2012-05-10T14:19:07.213 回答