فهرست منبع

g:ycm_semantic_triggers now only adds new triggers

Fixes #164.
Strahinja Val Markovic 11 سال پیش
والد
کامیت
04ca6ec4de

+ 4 - 0
README.md

@@ -953,6 +953,10 @@ completion engines. The option holds a dictionary of key-values, where the keys
 are Vim's filetype strings delimited by commas and values are lists of strings,
 where the strings are the triggers.
 
+Setting key-value pairs on the dictionary _adds_ semantic triggers to the
+internal default set (listed below). You cannot remove the default triggers,
+only add new ones.
+
 A "trigger" is a sequence of one or more characters that trigger semantic
 completion when typed. For instance, C++ (`cpp` filetype) has `.` listed as a
 trigger. So when the user types `foo.`, the semantic engine will trigger and

+ 3 - 12
plugin/youcompleteme.vim

@@ -138,19 +138,10 @@ let g:ycm_extra_conf_globlist =
 let g:ycm_filepath_completion_use_working_dir =
       \ get( g:, 'ycm_filepath_completion_use_working_dir', 0 )
 
+" Default semantic triggers are in python/ycm/completers/completer.py, these
+" just append new triggers to the default dict.
 let g:ycm_semantic_triggers =
-      \ get( g:, 'ycm_semantic_triggers', {
-      \   'c' : ['->', '.'],
-      \   'objc' : ['->', '.'],
-      \   'ocaml' : ['.', '#'],
-      \   'cpp,objcpp' : ['->', '.', '::'],
-      \   'perl' : ['->'],
-      \   'php' : ['->', '::'],
-      \   'cs,java,javascript,d,vim,python,perl6,scala,vb,elixir,go' : ['.'],
-      \   'ruby' : ['.', '::'],
-      \   'lua' : ['.', ':'],
-      \   'erlang' : [':'],
-      \ } )
+      \ get( g:, 'ycm_semantic_triggers', {} )
 
 let g:ycm_cache_omnifunc =
       \ get( g:, 'ycm_cache_omnifunc', 1 )

+ 2 - 13
python/ycm/completers/completer.py

@@ -1,6 +1,6 @@
 #!/usr/bin/env python
 #
-# Copyright (C) 2011, 2012  Strahinja Val Markovic  <val@markovic.io>
+# Copyright (C) 2011, 2012, 2013  Strahinja Val Markovic  <val@markovic.io>
 #
 # This file is part of YouCompleteMe.
 #
@@ -21,7 +21,7 @@ import abc
 import vim
 import ycm_core
 from ycm import vimsupport
-from collections import defaultdict
+from ycm.completers.completer_utils import TriggersForFiletype
 
 NO_USER_COMMANDS = 'This completer does not define any commands.'
 
@@ -336,14 +336,3 @@ class CompletionsCache( object ):
     return completion_line == self.line and completion_column == self.column
 
 
-def TriggersForFiletype():
-  triggers = vim.eval( 'g:ycm_semantic_triggers' )
-  triggers_for_filetype = defaultdict( list )
-
-  for key, value in triggers.iteritems():
-    filetypes = key.split( ',' )
-    for filetype in filetypes:
-      triggers_for_filetype[ filetype ].extend( value )
-
-  return triggers_for_filetype
-

+ 69 - 0
python/ycm/completers/completer_utils.py

@@ -0,0 +1,69 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2013  Strahinja Val Markovic  <val@markovic.io>
+#
+# This file is part of YouCompleteMe.
+#
+# YouCompleteMe is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# YouCompleteMe is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with YouCompleteMe.  If not, see <http://www.gnu.org/licenses/>.
+
+from collections import defaultdict
+from copy import deepcopy
+import vim
+
+DEFAULT_FILETYPE_TRIGGERS = {
+  'c' : ['->', '.'],
+  'objc' : ['->', '.'],
+  'ocaml' : ['.', '#'],
+  'cpp,objcpp' : ['->', '.', '::'],
+  'perl' : ['->'],
+  'php' : ['->', '::'],
+  'cs,java,javascript,d,vim,python,perl6,scala,vb,elixir,go' : ['.'],
+  'ruby' : ['.', '::'],
+  'lua' : ['.', ':'],
+  'erlang' : [':'],
+}
+
+
+def _FiletypeTriggerDictFromSpec( trigger_dict_spec ):
+  triggers_for_filetype = defaultdict( set )
+
+  for key, value in trigger_dict_spec.iteritems():
+    filetypes = key.split( ',' )
+    for filetype in filetypes:
+      triggers_for_filetype[ filetype ].update( value )
+
+  return triggers_for_filetype
+
+
+def _FiletypeDictUnion( dict_one, dict_two ):
+  """Returns a new filetye dict that's a union of the provided two dicts.
+  Dict params are supposed to be type defaultdict(set)."""
+
+  final_dict = deepcopy( dict_one )
+
+  for key, value in dict_two.iteritems():
+    final_dict[ key ].update( value )
+
+  return final_dict
+
+
+def TriggersForFiletype():
+  user_triggers = _FiletypeTriggerDictFromSpec(
+    vim.eval( 'g:ycm_semantic_triggers' ) )
+
+  default_triggers = _FiletypeTriggerDictFromSpec(
+    DEFAULT_FILETYPE_TRIGGERS )
+
+  return _FiletypeDictUnion( default_triggers, user_triggers )
+

+ 58 - 0
python/ycm/completers/completer_utils_test.py

@@ -0,0 +1,58 @@
+#!/usr/bin/env python
+#
+# Copyright (C) 2013  Strahinja Val Markovic  <val@markovic.io>
+#
+# This file is part of YouCompleteMe.
+#
+# YouCompleteMe is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# YouCompleteMe is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with YouCompleteMe.  If not, see <http://www.gnu.org/licenses/>.
+
+from collections import defaultdict
+from nose.tools import eq_
+from ycm.test_utils import MockVimModule
+vim_mock = MockVimModule()
+from ycm.completers import completer_utils
+
+
+def FiletypeTriggerDictFromSpec_Works_test():
+  eq_( defaultdict( set, {
+         'foo': set(['zoo', 'bar']),
+         'goo': set(['moo']),
+         'moo': set(['moo']),
+         'qux': set(['q'])
+       } ),
+       completer_utils._FiletypeTriggerDictFromSpec( {
+         'foo': ['zoo', 'bar'],
+         'goo,moo': ['moo'],
+         'qux': ['q']
+       } ) )
+
+
+def FiletypeDictUnion_Works_test():
+  eq_( defaultdict( set, {
+         'foo': set(['zoo', 'bar', 'maa']),
+         'goo': set(['moo']),
+         'bla': set(['boo']),
+         'qux': set(['q'])
+       } ),
+       completer_utils._FiletypeDictUnion( defaultdict( set, {
+         'foo': set(['zoo', 'bar']),
+         'goo': set(['moo']),
+         'qux': set(['q'])
+       } ), defaultdict( set, {
+         'foo': set(['maa']),
+         'bla': set(['boo']),
+         'qux': set(['q'])
+       } ) ) )
+
+