Comando de movimento dentro das funções vim

1

Eu quero exibir a função C à qual a linha atual pertence. Eu não quero usar nenhum plugin porque eu trabalho em vários sistemas operacionais com diferentes recursos e configurações da máquina. Eu tentei a maioria dos plugins e não funciona por um motivo ou outro. Eu tenho que escrever algo muito básico e mínimo e que funciona com recursos extremamente básicos do vim.

Solução atual:

Eu copiei uma função vim do colega que essencialmente procura por um reg-ex, combinando o início de um nome de função. Ele mostra o nome na tela inferior por alguns segundos e vai embora

fun! ShowFuncName()
        let lnum = line(".")
        let col = col(".")
        echohl ModeMsg
        echo getline(search("^[^ \t#/]\{2}.*[^:]\s*$", 'bW'))
        echohl None
        call search("\%" . lnum . "l" . "\%" . col . "c")
    endfun

Problema

O problema é que essa coisa não funciona com rótulos. Se houver um rótulo presente em uma linha entre a definição da função e a linha atual, o script mostrará o nome do rótulo em vez do nome da função.

Caso contrário, o script funciona porque é uma regra difícil e rápida em nossa base de código sempre iniciar a definição de função da coluna 1 e chaves a partir da segunda linha em diante.

Correção proposta

Em vez de pesquisar por regex, por que não usar as teclas de movimento do vim? Isso é o seguinte:

  1. Armazenar linha atual #, coluna #
  2. Ir para trás com as teclas de movimento '[[' para ir para a definição da função
  3. A linha logo acima disso terá a função C. (isso é estritamente aplicado nas diretrizes de codificação)
  4. imprima a linha
  5. Ir para a linha #, coluna # armazenada na etapa 1.

Eu não sei como fazer o passo 2. mencionado acima.

    
por thequark 31.12.2013 / 10:47

1 resposta

3

Eu acredito que você quer isso

function! ShowFuncName()
    let cursor_pos = getpos('.')
    echohl ModeMsg
    normal! [[k
    echo getline('.')
    echohl None
    call setpos('.', cursor_pos)
endfunction

O comando normal executa [[k no modo normal movendo o cursor para a definição da função. Em seguida, imprime a linha em que o cursor está.

A posição do cursor é restaurada para a posição em que estava originalmente usando as funções getpos() e setpos() .

    
por 01.01.2014 / 01:09