Vim [м движение с C # - PullRequest
       1

Vim [м движение с C #

13 голосов
/ 27 июля 2011

Vim предоставляет очень полезные команды движения для перехода к следующему начало / конец метода:] m,] M, [m и] m.

Это работает для Java или аналогичного структурированного языка. (как описано в: help] m и: help 29.3)

Кажется, это работает, рассматривая внешнюю пару фигурных скобок как класс объявление и следующий уровень фигурных скобок как объявления метода.

Эти команды движения не работают, когда есть внешняя пара фигурных скобок вокруг определения класса, что несколько распространено на языках как C #.

Мне было интересно, есть ли какой-то трюк для выполнения этих команд (один и с префиксом операторов, например, y [m, V] M) работают над этим кодом:

namespace ABC.DEF
{
    class A
    {
        protected string strID;
        public string PortID { get { return strID; } set { strID = value; } }

        protected MyType x;
        public MyType X
        {
            get { return x; }
            set { x = value; if ( x != null ) func1(); }
        }


        int func1()
        {
            return 1;
        }

        int func2(int flag)
        {
            if (flag == 0)
                return flag;


            if (flag > 3)
            {
                return flag;
            }
            return 2;
        }

        int func3()
        {
            return 3;
        }
    }
}

Ответы [ 4 ]

5 голосов
/ 28 июля 2011

Я не думаю, что семейство отображений ]m можно настроить. В таких случаях обычной практикой является переопределение его с помощью пользовательской логики. Я придумал какой-нибудь vimscript, который должен делать то, что вы описываете. По сути, он перепрыгивает через фигурные скобки и смотрит на соответствующую строку, чтобы решить, что делать. В этом случае он просто игнорирует объявления «class» и «namespace».

nnoremap <buffer> ]m :<c-u>call <SID>JumpMethod('{', 'W',  'n')<cr>
nnoremap <buffer> [m :<c-u>call <SID>JumpMethod('{', 'Wb', 'n')<cr>
nnoremap <buffer> ]M :<c-u>call <SID>JumpMethod('}', 'W',  'n')<cr>
nnoremap <buffer> [M :<c-u>call <SID>JumpMethod('}', 'Wb', 'n')<cr>

xnoremap <buffer> ]m :<c-u>call <SID>JumpMethod('{', 'W',  'v')<cr>
xnoremap <buffer> [m :<c-u>call <SID>JumpMethod('{', 'Wb', 'v')<cr>
xnoremap <buffer> ]M :<c-u>call <SID>JumpMethod('}', 'W',  'v')<cr>
xnoremap <buffer> [M :<c-u>call <SID>JumpMethod('}', 'Wb', 'v')<cr>

onoremap <buffer> ]m :<c-u>call <SID>JumpMethod('{', 'W',  'o')<cr>
onoremap <buffer> [m :<c-u>call <SID>JumpMethod('{', 'Wb', 'o')<cr>
onoremap <buffer> ]M :<c-u>call <SID>JumpMethod('}', 'W',  'o')<cr>
onoremap <buffer> [M :<c-u>call <SID>JumpMethod('}', 'Wb', 'o')<cr>

function! s:JumpMethod(char, flags, mode)
  let original_cursor = getpos('.')

  if a:mode == 'v'
    normal! gv
  elseif a:mode == 'o'
    normal! v
  endif

  while search(a:char, a:flags) > 0
    if a:char == '}'
      " jump to the opening one to analyze the definition
      normal! %
    endif

    let current_line = line('.')

    if getline(current_line) =~ '^\s*{'
      " it's alone on the line, check the above one
      let method_line = current_line - 1
    else
      let method_line = current_line
    endif

    let method_line_body = getline(method_line)

    if method_line_body =~ '\k\+\s*(.*)' && method_line_body !~ '\<\(for\|foreach\|if\|while\|switch\|using\|catch\|get\|set\)\>'
      " it's probably a function call

      if a:char == '}'
        " we need to go back to the closing bracket
        normal! %
      endif

      echo
      return
    else
      if a:char == '}'
        " we still need to go back to the closing bracket
        normal! %
      endif
    endif
  endwhile

  " if we're here, the search has failed, restore cursor position
  echo
  call setpos('.', original_cursor)
endfunction

Имейте в виду, что я не очень хорошо знаю C #, поэтому он может работать не во всех случаях, но если вы дадите мне примеры, которые ломаются, я могу кое-что выяснить.

Чтобы попробовать это, вы должны поместить его где-то в «ftplugin» в вашем каталоге vimfiles, как «cs.vim». Любое другое имя файла, начинающееся с "cs" и заканчивающееся на ".vim", тоже хорошо, если у вас уже есть файл "cs.vim".

3 голосов
/ 27 августа 2014

OmniSharp теперь имеет :OmniSharpNavigateUp и :OmniSharpNavigateDown. Он всегда идет в «начало» (следовательно, это для отображений ]m и [m). Я использую эти сопоставления (взяты из другого ответа на этот вопрос) в ftplugin\cs.vim

nnoremap <buffer> ]m :OmniSharpNavigateDown<cr>
nnoremap <buffer> [m :OmniSharpNavigateUp<cr>
nnoremap <buffer> ]M :OmniSharpNavigateDown<cr>
nnoremap <buffer> [M :OmniSharpNavigateUp<cr>

xnoremap <buffer> ]m :OmniSharpNavigateDown<cr>
xnoremap <buffer> [m :OmniSharpNavigateUp<cr>
xnoremap <buffer> ]M :OmniSharpNavigateDown<cr>
xnoremap <buffer> [M :OmniSharpNavigateUp<cr>

onoremap <buffer> ]m :OmniSharpNavigateDown<cr>
onoremap <buffer> [m :OmniSharpNavigateUp<cr>
onoremap <buffer> ]M :OmniSharpNavigateDown<cr>
onoremap <buffer> [M :OmniSharpNavigateUp<cr>
2 голосов
/ 28 июля 2011

Несколько недель назад аналогичный вопрос задавался в списке рассылки vim, но для C ++.Вот решение, которое я придумал .

Оно опирается на ctags и несколько других моих плагинов: lh-dev, lh-tag и lh-vim-lib.Вы можете установить lh-dev через vim-addon-manager, это по очереди установит lh-tag и lh-vim-lib.

HTH,

0 голосов
/ 28 июля 2011

Вы можете использовать 9]}. Это немного принудительно, но эй, это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...