Vim [m动作用c#

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; } } } 

我不认为]m系列映射可以定制。 在这种情况下,通常的做法是使用自定义逻辑覆盖它。 我想出了一些应该按照你的描述做的vimscript。 基本上,它跳过花括号,并查看相关的行来决定做什么。 在这种情况下,它只是忽略“类”和“命名空间”声明。

 nnoremap  ]m :call JumpMethod('{', 'W', 'n') nnoremap  [m :call JumpMethod('{', 'Wb', 'n') nnoremap  ]M :call JumpMethod('}', 'W', 'n') nnoremap  [M :call JumpMethod('}', 'Wb', 'n') xnoremap  ]m :call JumpMethod('{', 'W', 'v') xnoremap  [m :call JumpMethod('{', 'Wb', 'v') xnoremap  ]M :call JumpMethod('}', 'W', 'v') xnoremap  [M :call JumpMethod('}', 'Wb', 'v') onoremap  ]m :call JumpMethod('{', 'W', 'o') onoremap  [m :call JumpMethod('{', 'Wb', 'o') onoremap  ]M :call JumpMethod('}', 'W', 'o') onoremap  [M :call JumpMethod('}', 'Wb', 'o') 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#,所以在所有情况下都可能无法正常工作,但如果你给我一些破解的例子,我或许可以找出一些东西。

要尝试它,你应该把它放在你的vimfiles目录下的“ftplugin”下,作为“cs.vim”。 任何其他以“cs”开头并以“.vim”结尾的文件名也是好的,如果你已经有一个“cs.vim”文件。

OmniSharp现在拥有:OmniSharpNavigateUp:OmniSharpNavigateDown 。 它总是“开始”(因此这是为]m[m映射])。 我在ftplugin\cs.vim使用这些映射(取自此问题的另一个答案)

 nnoremap  ]m :OmniSharpNavigateDown nnoremap  [m :OmniSharpNavigateUp nnoremap  ]M :OmniSharpNavigateDown nnoremap  [M :OmniSharpNavigateUp xnoremap  ]m :OmniSharpNavigateDown xnoremap  [m :OmniSharpNavigateUp xnoremap  ]M :OmniSharpNavigateDown xnoremap  [M :OmniSharpNavigateUp onoremap  ]m :OmniSharpNavigateDown onoremap  [m :OmniSharpNavigateUp onoremap  ]M :OmniSharpNavigateDown onoremap  [M :OmniSharpNavigateUp 

几个星期前,在vim邮件列表上提出了类似的问题,但对于C ++。 这是我提出的解决方案 。

它依赖于ctags和我的一些其他插件:lh-dev,lh-tag和lh-vim-lib。 您可以通过vim-addon-manager安装lh-dev,这将依次安装lh-tag和lh-vim-lib。

HTH,

你可以使用9]}。 它有点被迫,但是嘿,它有效。