Coder Social home page Coder Social logo

ycm-core / lsp-examples Goto Github PK

View Code? Open in Web Editor NEW
77.0 8.0 26.0 196 KB

Use any language server with YouCompleteMe.

Home Page: https://ycm-core.github.io/YouCompleteMe

License: Apache License 2.0

PHP 1.01% Ruby 1.15% Python 58.65% Dockerfile 0.15% TypeScript 11.12% Shell 11.43% Vim Script 10.77% Kotlin 1.00% JavaScript 0.39% HTML 0.84% Vue 3.49%
language-servers vim lsp youcompleteme rust-analyzer ycmd

lsp-examples's Introduction

Overview

This repo includes a simple way to install some language servers that might work with YouCompleteMe (strictly ycmd).

This repo comes with no warranty, and these engines are not officially supported by YCM, though they should work for the most part.

Languages Tested

Working:

  • Angular
  • Bash
  • CSS
  • Cmake
  • Crystal
  • D
  • Dart
  • Dockerfile
  • Godot (gdscript)
  • Groovy
  • Jai
  • Kotlin
  • PHP
  • Python (pyright)
  • Racket
  • Ruby
  • Vala
  • Vim (vimscript)
  • Vue
  • Zig

Broken or partially working:

  • JSON
  • Lua
  • YAML

See also:

Quick start

Assuming you installed this repo in /path/to/this/directory:

  • Decide which languages you want. Each language is a directory in this repo.
  • Run python3 ./install.py --enable-LANG1 --enable-LANG2 .... Replace LANG1/LANG2 etc. with the language dirs. e.g. ./install.py --enable-dart --enable-bash. You can also use --all and --disable-LANG.
  • Add the line to your vimrc that it tells you to, this will be similar to:
source /path/to/this/directory/vimrc.generated
  • Optionally: edit vimrc.generated to customise g:ycm_language_server

  • NOTE: YCM will regard the path of .ycm_extra_conf.py as root path of project folder. So please make sure you put your .ycm_extra_conf.py at right place (root of current project)

Configuration

The g:ycm_language_server option is used to tell YCM (strictly, ycmd) to use its 'generic' language server completer. It's a list of dictionaries with the following keys:

  • 'name' (string): Name of the language server
  • 'filetypes' (list): List of Vim filetypes to use this language server for
  • 'cmdline' (list): List of words forming a command line to execute. Note: must be a list, even if it has only one element (such as [ 'executable' ]. If not supplied, no server is started and a port must be supplied.
  • 'port' (number): A TCP port on localhost to connect to if stdio is not possible.
  • 'project_root_files' (list, optional): List of filename to search for when trying to determine the 'root' of the project. THis is useful for languages or language servers which don't automatically detect the 'workspace' root.

For full documentation, please see the YouCompleteMe docs.

Purescript

Ycmd currently doesn't support showMessageRequest, so users need to manually build their projects on the command line before starting the server. To do this execute pulp build in the project root.

Scala

Ycmd currently doesn't support showMessageRequest, so users need to "import build" manually. Unlike purescript, for scala, this can be done in the editor by executing :YcmCompleter ExecuteCommand build-import. For this operation to succeed sbt and bloop need to be in the $PATH. metals also requires java 8.

For completions to work make sure the version of metals has this bug fix.

Haskell

haskell-ide-engine is not actively being developed anymore, in favour of haskell-language-server (installation instructions).

Fortran

The server causes a spurious error:

  • fortls doesn't support didChangeConfiguration.

This error can be ignored, as they don't interfere with normal work of ycmd/fortls.

Python (e.g. pyright)

If configuring a language server for Python, this will completely disable the built-in Jedi completer in YCM.

Pyright

Example extra conf (actually for ycmd itself):

import sys.path as p

DIR_OF_THIS_SCRIPT = p.abspath( p.dirname( __file__ ) )
DIR_OF_THIRD_PARTY = p.join( DIR_OF_THIS_SCRIPT, 'third_party' )
DIR_OF_WATCHDOG_DEPS = p.join( DIR_OF_THIRD_PARTY, 'watchdog_deps' )

def Settings( **kwargs ):
  if language == 'python':
    return {
      'ls': {
        'python': {
          'analysis': {
            'extraPaths': [
              p.join( DIR_OF_THIS_SCRIPT ),
              p.join( DIR_OF_THIRD_PARTY, 'bottle' ),
              p.join( DIR_OF_THIRD_PARTY, 'regex-build' ),
              p.join( DIR_OF_THIRD_PARTY, 'frozendict' ),
              p.join( DIR_OF_THIRD_PARTY, 'jedi_deps', 'jedi' ),
              p.join( DIR_OF_THIRD_PARTY, 'jedi_deps', 'parso' ),
              p.join( DIR_OF_WATCHDOG_DEPS, 'watchdog', 'build', 'lib3' ),
              p.join( DIR_OF_WATCHDOG_DEPS, 'pathtools' ),
              p.join( DIR_OF_THIRD_PARTY, 'waitress' )
            ],
            'useLibraryCodeForTypes': True
          }
        }
      }
    }

Racket

You need to have racket installed so you can use raco to install the required packages for the language server. You can install racket through the racket website or your package manager.

Ruby

You need to be running a version of ruby that the parser understands: https://github.com/whitequark/parser#compatibility-with-ruby-mri

Recommend running in rbenv for that:

$ rbenv shell 2.3.8
$ cd ruby
$ ./install
$ vim test/test.rb

D

There is a number of external dependencies that you will want to install:

  • libphobos/liblphobos - the D standard library
  • dmd - the D compiler
  • dscanner - at the very least responsible for diagnostics
  • dcd - the D compiler daemon
  • Potentially dfmt - serve-d seems to be able to format code even without it.
  • dub - the D package manager

On top of that, you will want to configure the server, at least to let serve-d know about your modules. The configuration is done through ycmd's extra confs and the full list of serve-d's configuration options can be found here.

Note that the server executable on Windows is called serve-d.exe.

Godot

Godot must be running and you must go to Project -> Project Settings -> Global and set Language Server to On. At least since Godot 3.4, Language Server options are under Editor Settings and On by default.

If Godot is closed or restarted, you might need to force YCM to reconnect (this isn't automatic). Use :YcmCompleter RestartServer to reconnect.

You can check the status of the connection with :YcmDebugInfo.

Recommend vim-godot for syntax, etc. (don't believe the hype about using other completion systems though, of course).

Kotlin

For whatever reason, the server expects you to have maven in your PATH and, just like serve-d, kotlin-language-server has its own configuration.

The server executable is actually a shell script and the build process produces server for Linux and server.bat for Windows.

Make sure to put a .ycm_extra_conf.py file in the root of your project, otherwise the language server may fail.

Julia

The command line for starting the server is:

let g:julia_cmdline = ['julia', '--startup-file=no', '--history-file=no', '-e', '
\       using LanguageServer;
\       using Pkg;
\       import StaticLint;
\       import SymbolServer;
\       env_path = dirname(Pkg.Types.Context().env.project_file);
\       debug = false;
\
\       server = LanguageServer.LanguageServerInstance(stdin, stdout, debug, env_path, "", Dict());
\       server.runlinter = true;
\       run(server);
\   ']

You can replace the first command line argument ('julia') with an absolute path, if julia isn't in your $PATH. With the above list in your vimrc, you can set 'cmdline' in g:ycm_language_server to just g:julia_cmdline.

Julia server does support configuration via the extra conf, but it doesn't seem to be documented anywhere.

Lua

Uses lua-language-server.

Quick testing suggests that:

  • It returns snippets even though YCM explicitly opted out, meaning completions don't work unless you use Ben's Fork
  • It violates a number of other items of the protocol other than that such as missing mandatory fields.
  • Signature help doesn't seem to work.

However, it looks like diagnostics and GoTo work.

The command line requeired depends on your OS:

  • Windows: /path/to/lua-language-server/bin/Windows/lua-language-server.exe
  • Linux: /path/to/lua-language-server/bin/Linux/lua-language-server
  • macOS: /path/to/lua-language-server/bin/macOS/lua-language-server

There is one command line argument. It needs to be the absolute path to /path/to/lua-language-server/main.lua.

The install.py for Lua downloads the pre-built visual studio code extension, but you can build lua-language-server yourself easily if you have ninja installed:

git clone https://github.com/sumneko/lua-language-server
cd lua-language-server
cd 3rd/luamake
ninja ninja/<your os>.ninja
cd ../../
./3rd/luamake/luamake rebuild

This will put the binaries in bin/<your os>.

Zig

Uses zls

For this to work sometimes, one needs to run the zls executable to create a user/global config json file by running the executable in /zig/zls/zig-out/bin/zls after running the install.py. [NOTE] if your workspace directory has a zls.json file, it should would also work.

CSS

Uses css

PHP

Uses phpactor.

Crystal

Uses Crystalline as an LSP server and vim-crystal to determine file type.

Keep in mind, that Crystalline version must match crystal version (see details on crystalline page).

The configuration is pretty straightforward. Add this to your .vimrc:

let g:ycm_language_server =
  \ [
  \   {
  \     'name': 'crystal',
  \     'cmdline': [ 'crystalline'],
  \     'project_root_files' : [ 'shard.yml' ],
  \     'filetypes': [ 'crystal' ]
  \   }
  \ ]

Place crystalline in the path (i.e. /usr/local/bin) or use absolute path in the example above..

Jai

This is using Jails, which is very much "work in progress", so many things aren't fully working yet, but it's easy enough to set up.

You may need to create a jails.json in your project root to tell Jails where to find modules.

Example jails.json:

{
    "workspaces": [
        {
            "entry": "/foo/main.jai",
            "local_modules": "/modules"
        }
    ]
}

Vala

Installing vala-language-server from source automatically takes a long time and would be difficult to get right generically.

Please install vala-language-server through your system package manager before enabling vala support through YCM.

For formatting support you will need uncrustify as well.

Known Issues

  • yaml completer completions don't work because the server bugs always returns snippets, even though ycmd claims not to support them. Validation works though.
  • json completer completions don't work because the server bugs always returns snippets, even though ycmd claims not to support them. Validation works though.
  • lua - yet another completer that returns snippets even if client doesn't support them.

There is highly experimental (essentially unsupported) support for snippet completions in Ben's Fork of YCM. For example, the following makes json work with that fork:

    \   {
    \     'name': 'json',
    \     'cmdline': [ 'node', s:lsp_dir . '/json/node_modules/.bin/vscode-json-languageserver', '--stdio' ],
    \     'filetypes': [ 'json' ],
    \     'capabilities': #{ textDocument: #{ completion: #{ completionItem: #{ snippetSupport: v:true } } } },
    \   },

lsp-examples's People

Contributors

anton7c3 avatar aster89 avatar barabas5532 avatar borwe avatar bstaletic avatar fudesign2008 avatar gnikit avatar jackey-huo avatar kanitkameh avatar puremourning avatar reality avatar supersandro2000 avatar xphyro avatar zverik avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

lsp-examples's Issues

vim-language-server settings didn't work

Hi
vim-language-server settings didn't work at all, neither completion or gotocmd.

vim-language-server version: 1.3.1 installed with npm install -g --production

...
      \ {"name": "vim", "filetypes": ["vim"], "cmdline": ["vim-language-server", '--stdio'] },
...

I think there should be some extra config like the samples(for coc.nvim) in https://github.com/iamcco/vim-language-server . But I have no idea how to put this into .ycm_extra_conf. Any suggestions?


here is the log:

click to unfold

2019-10-29 17:27:33,024 - DEBUG - Global extra conf not loaded or no function YcmCorePreload
2019-10-29 17:27:33,121 - INFO - Received ready request
2019-10-29 17:27:33,170 - INFO - Received event notification
2019-10-29 17:27:33,170 - DEBUG - Event name: BufferVisit
2019-10-29 17:27:33,221 - INFO - Received event notification
2019-10-29 17:27:33,222 - DEBUG - Event name: FileReadyToParse
2019-10-29 17:27:33,222 - INFO - Adding buffer identifiers for file: /tmp/x.vim
2019-10-29 17:27:33,231 - INFO - Starting vimCompleter: ['/usr/local/bin/vim-language-server', '--stdio']
2019-10-29 17:27:33,235 - INFO - vimCompleter started
2019-10-29 17:27:33,235 - DEBUG - TX: Sending message: b'Content-Length: 689\r\n\r\n{"id":1,"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{"textDocument":{"completion":{"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]}}}},"initializationOptions":{"css":{},"emmet":{},"html":{"suggest":{}},"javascript":{"format":{}},"stylusSupremacy":{},"typescript":{"format":{}},"vetur":{"completion":{"autoImport":false,"useScaffoldSnippets":false},"format":{"defaultFormatter":{"js":"prettier","ts":"prettier"},"defaultFormatterOptions":{},"scriptInitialIndent":false,"styleInitialIndent":false},"validation":{"script":true,"style":true,"template":true}}},"processId":23564,"rootPath":"/tmp","rootUri":"file:///tmp"}}'
2019-10-29 17:27:33,324 - INFO - Received filetype completion available request
2019-10-29 17:27:33,382 - INFO - Received completion request
2019-10-29 17:27:33,382 - DEBUG - Using filetype completion: False
2019-10-29 17:27:33,442 - INFO - Received completion request
2019-10-29 17:27:33,442 - DEBUG - Using filetype completion: False
2019-10-29 17:27:33,535 - INFO - Received completion request
2019-10-29 17:27:33,536 - DEBUG - Using filetype completion: False
2019-10-29 17:27:33,597 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":1,"result":{"capabilities":{"textDocumentSync":1,"hoverProvider":true,"completionProvider":{"triggerCharacters":[".",":","#","[","&","$","<","\\"","\'"],"resolveProvider":true},"signatureHelpProvider":{"triggerCharacters":["(",","]},"definitionProvider":true,"referencesProvider":true,"renameProvider":{"prepareProvider":true}}}}'
2019-10-29 17:27:33,597 - INFO - Language server requires sync type of Full
2019-10-29 17:27:33,598 - DEBUG - vim: Server declares trigger characters: ['.', ':', '#', '[', '&', '$', '<', '"', "'"]
2019-10-29 17:27:33,598 - INFO - vim: Using trigger characters for semantic triggers: .,:,#,[,&,$,<,",'
2019-10-29 17:27:33,598 - DEBUG - TX: Sending notification: b'Content-Length: 52\r\n\r\n{"jsonrpc":"2.0","method":"initialized","params":{}}'
2019-10-29 17:27:33,598 - DEBUG - TX: Sending notification: b'Content-Length: 480\r\n\r\n{"jsonrpc":"2.0","method":"workspace/didChangeConfiguration","params":{"settings":{"css":{},"emmet":{},"html":{"suggest":{}},"javascript":{"format":{}},"stylusSupremacy":{},"typescript":{"format":{}},"vetur":{"completion":{"autoImport":false,"useScaffoldSnippets":false},"format":{"defaultFormatter":{"js":"prettier","ts":"prettier"},"defaultFormatterOptions":{},"scriptInitialIndent":false,"styleInitialIndent":false},"validation":{"script":true,"style":true,"template":true}}}}}'
2019-10-29 17:27:33,598 - DEBUG - Refreshing file /tmp/x.vim: State is Open/action Open
2019-10-29 17:27:33,598 - DEBUG - TX: Sending notification: b'Content-Length: 146\r\n\r\n{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"languageId":"vim","text":"\\n","uri":"file:///tmp/x.vim","version":1}}}'
2019-10-29 17:27:33,705 - INFO - Received event notification
2019-10-29 17:27:33,705 - DEBUG - Event name: CurrentIdentifierFinished
2019-10-29 17:27:33,706 - INFO - Adding ONE buffer identifier for file: /tmp/x.vim
2019-10-29 17:27:33,709 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///tmp/x.vim","diagnostics":[]}}'
2019-10-29 17:27:33,709 - INFO - Received completion request
2019-10-29 17:27:33,710 - DEBUG - Using filetype completion: False
2019-10-29 17:27:33,852 - INFO - Received completion request
2019-10-29 17:27:33,852 - DEBUG - Using filetype completion: False
2019-10-29 17:27:33,944 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":3,"message":"parser: child_log: Index Workspace Error: /tmp/**/*.vim\\nError => Error: EACCES: permission denied, scandir \'/tmp/ssh-xcIgWjTK0LaS\'"}}'
2019-10-29 17:27:33,944 - INFO - Server reported: parser: child_log: Index Workspace Error: /tmp/**/*.vim
Error => Error: EACCES: permission denied, scandir '/tmp/ssh-xcIgWjTK0LaS'
2019-10-29 17:27:33,997 - INFO - Received event notification
2019-10-29 17:27:33,998 - DEBUG - Event name: CurrentIdentifierFinished
2019-10-29 17:27:34,001 - INFO - Received completion request
2019-10-29 17:27:34,002 - DEBUG - Using filetype completion: False
2019-10-29 17:27:34,107 - INFO - Received completion request
2019-10-29 17:27:34,108 - DEBUG - Using filetype completion: False
2019-10-29 17:27:34,189 - INFO - Received completion request
2019-10-29 17:27:34,189 - DEBUG - Using filetype completion: False
2019-10-29 17:27:34,421 - INFO - Received completion request
2019-10-29 17:27:34,422 - DEBUG - Using filetype completion: False
2019-10-29 17:27:35,717 - INFO - Received completion request
2019-10-29 17:27:35,717 - DEBUG - Using filetype completion: True
2019-10-29 17:27:35,718 - DEBUG - Refreshing file /tmp/x.vim: State is Open/action Change
2019-10-29 17:27:35,718 - DEBUG - TX: Sending notification: b'Content-Length: 164\r\n\r\n{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"contentChanges":[{"text":"let a = {\\"\\"}\\n"}],"textDocument":{"uri":"file:///tmp/x.vim","version":2}}}'
2019-10-29 17:27:35,720 - DEBUG - TX: Sending message: b'Content-Length: 150\r\n\r\n{"id":2,"jsonrpc":"2.0","method":"textDocument/completion","params":{"position":{"character":10,"line":0},"textDocument":{"uri":"file:///tmp/x.vim"}}}'
2019-10-29 17:27:35,727 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":2,"result":[]}'
2019-10-29 17:27:35,837 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///tmp/x.vim","diagnostics":[]}}'
2019-10-29 17:27:36,991 - INFO - Received completion request
2019-10-29 17:27:36,992 - DEBUG - Using filetype completion: False
2019-10-29 17:27:37,710 - INFO - Received completion request
2019-10-29 17:27:37,711 - DEBUG - Using filetype completion: True
2019-10-29 17:27:37,711 - DEBUG - Refreshing file /tmp/x.vim: State is Open/action Change
2019-10-29 17:27:37,712 - DEBUG - TX: Sending notification: b'Content-Length: 166\r\n\r\n{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"contentChanges":[{"text":"let a = {\\"x\\":}\\n"}],"textDocument":{"uri":"file:///tmp/x.vim","version":3}}}'
2019-10-29 17:27:37,712 - DEBUG - TX: Sending message: b'Content-Length: 150\r\n\r\n{"id":3,"jsonrpc":"2.0","method":"textDocument/completion","params":{"position":{"character":13,"line":0},"textDocument":{"uri":"file:///tmp/x.vim"}}}'
2019-10-29 17:27:37,715 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":3,"result":[]}'
2019-10-29 17:27:37,817 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///tmp/x.vim","diagnostics":[{"message":"unexpected token: }","range":{"start":{"line":0,"character":13},"end":{"line":0,"character":14}},"severity":1}]}}'
2019-10-29 17:27:37,930 - INFO - Received completion request
2019-10-29 17:27:37,931 - DEBUG - Using filetype completion: False
2019-10-29 17:27:38,238 - INFO - Received completion request
2019-10-29 17:27:38,239 - DEBUG - Using filetype completion: True
2019-10-29 17:27:38,239 - DEBUG - Refreshing file /tmp/x.vim: State is Open/action Change
2019-10-29 17:27:38,239 - DEBUG - TX: Sending notification: b'Content-Length: 171\r\n\r\n{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"contentChanges":[{"text":"let a = {\\"x\\": \\"\\"}\\n"}],"textDocument":{"uri":"file:///tmp/x.vim","version":4}}}'
2019-10-29 17:27:38,240 - DEBUG - TX: Sending message: b'Content-Length: 150\r\n\r\n{"id":4,"jsonrpc":"2.0","method":"textDocument/completion","params":{"position":{"character":15,"line":0},"textDocument":{"uri":"file:///tmp/x.vim"}}}'
2019-10-29 17:27:38,241 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":4,"result":[]}'
2019-10-29 17:27:38,343 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///tmp/x.vim","diagnostics":[]}}'
2019-10-29 17:27:38,540 - INFO - Received completion request
2019-10-29 17:27:38,541 - DEBUG - Using filetype completion: False
2019-10-29 17:27:39,601 - INFO - Received event notification
2019-10-29 17:27:39,602 - DEBUG - Event name: FileReadyToParse
2019-10-29 17:27:39,602 - INFO - Adding buffer identifiers for file: /tmp/x.vim
2019-10-29 17:27:39,602 - DEBUG - Refreshing file /tmp/x.vim: State is Open/action Change
2019-10-29 17:27:39,603 - DEBUG - TX: Sending notification: b'Content-Length: 172\r\n\r\n{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"contentChanges":[{"text":"let a = {\\"x\\": \\"y\\"}\\n"}],"textDocument":{"uri":"file:///tmp/x.vim","version":5}}}'
2019-10-29 17:27:39,609 - INFO - Received event notification
2019-10-29 17:27:39,610 - DEBUG - Event name: InsertLeave
2019-10-29 17:27:39,705 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///tmp/x.vim","diagnostics":[]}}'
2019-10-29 17:27:39,905 - INFO - Received event notification
2019-10-29 17:27:39,905 - DEBUG - Event name: CurrentIdentifierFinished
2019-10-29 17:27:40,283 - INFO - Received completion request
2019-10-29 17:27:40,284 - DEBUG - Using filetype completion: False
2019-10-29 17:27:40,445 - INFO - Received event notification
2019-10-29 17:27:40,445 - DEBUG - Event name: CurrentIdentifierFinished
2019-10-29 17:27:40,456 - INFO - Received completion request
2019-10-29 17:27:40,456 - DEBUG - Using filetype completion: True
2019-10-29 17:27:40,457 - DEBUG - Refreshing file /tmp/x.vim: State is Open/action Change
2019-10-29 17:27:40,457 - DEBUG - TX: Sending notification: b'Content-Length: 176\r\n\r\n{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"contentChanges":[{"text":"let a = {\\"x\\": \\"y\\"}\\na.\\n"}],"textDocument":{"uri":"file:///tmp/x.vim","version":6}}}'
2019-10-29 17:27:40,457 - DEBUG - TX: Sending message: b'Content-Length: 149\r\n\r\n{"id":5,"jsonrpc":"2.0","method":"textDocument/completion","params":{"position":{"character":2,"line":1},"textDocument":{"uri":"file:///tmp/x.vim"}}}'
2019-10-29 17:27:40,462 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":5,"result":[{"label":"a","kind":6,"sortText":"00003","documentation":"User defined variable","insertText":"a","insertTextFormat":1,"data":[{"name":"a","startLine":1,"startCol":5}]}]}'
2019-10-29 17:27:40,463 - DEBUG - TX: Sending message: b'Content-Length: 236\r\n\r\n{"id":6,"jsonrpc":"2.0","method":"completionItem/resolve","params":{"data":[{"name":"a","startCol":5,"startLine":1}],"documentation":"User defined variable","insertText":"a","insertTextFormat":1,"kind":6,"label":"a","sortText":"00003"}}'
2019-10-29 17:27:40,464 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":6,"result":null}'
2019-10-29 17:27:40,465 - ERROR - Exception from semantic completer (using general)
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/handlers.py", line 100, in GetCompletions
    .ComputeCandidates( request_data ) )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/completer.py", line 238, in ComputeCandidates
    return self.DetailCandidates( request_data, candidates )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 953, in DetailCandidates
    request_data )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 1025, in _CandidatesFromCompletionItems
    self._ResolveCompletionItem( item )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 965, in _ResolveCompletionItem
    item.update( response[ 'result' ] )
TypeError: 'NoneType' object is not iterable
2019-10-29 17:27:40,559 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///tmp/x.vim","diagnostics":[]}}'
2019-10-29 17:27:42,808 - INFO - Received completion request
2019-10-29 17:27:42,809 - DEBUG - Using filetype completion: False
2019-10-29 17:27:43,035 - INFO - Received event notification
2019-10-29 17:27:43,035 - DEBUG - Event name: CurrentIdentifierFinished
2019-10-29 17:27:46,908 - INFO - Received completion request
2019-10-29 17:27:46,908 - DEBUG - Using filetype completion: False
2019-10-29 17:27:47,140 - INFO - Received completion request
2019-10-29 17:27:47,141 - DEBUG - Using filetype completion: False
2019-10-29 17:27:47,305 - INFO - Received completion request
2019-10-29 17:27:47,306 - DEBUG - Using filetype completion: False
2019-10-29 17:27:47,439 - INFO - Received completion request
2019-10-29 17:27:47,440 - DEBUG - Using filetype completion: False
2019-10-29 17:27:47,614 - INFO - Received event notification
2019-10-29 17:27:47,614 - DEBUG - Event name: CurrentIdentifierFinished
2019-10-29 17:27:47,615 - INFO - Adding ONE buffer identifier for file: /tmp/x.vim
2019-10-29 17:27:47,621 - INFO - Received completion request
2019-10-29 17:27:47,622 - DEBUG - Using filetype completion: False
2019-10-29 17:27:47,796 - INFO - Received completion request
2019-10-29 17:27:47,797 - DEBUG - Using filetype completion: False
2019-10-29 17:27:47,967 - INFO - Received completion request
2019-10-29 17:27:47,968 - DEBUG - Using filetype completion: False
2019-10-29 17:27:48,034 - INFO - Received completion request
2019-10-29 17:27:48,035 - DEBUG - Using filetype completion: False
2019-10-29 17:27:48,375 - INFO - Received completion request
2019-10-29 17:27:48,375 - DEBUG - Using filetype completion: False
2019-10-29 17:27:48,639 - INFO - Received completion request
2019-10-29 17:27:48,640 - DEBUG - Using filetype completion: False
2019-10-29 17:27:48,817 - INFO - Received completion request
2019-10-29 17:27:48,818 - DEBUG - Using filetype completion: False
2019-10-29 17:27:49,079 - INFO - Received completion request
2019-10-29 17:27:49,080 - DEBUG - Using filetype completion: False
2019-10-29 17:27:49,199 - INFO - Received completion request
2019-10-29 17:27:49,199 - DEBUG - Using filetype completion: False
2019-10-29 17:27:49,721 - INFO - Received completion request
2019-10-29 17:27:49,721 - DEBUG - Using filetype completion: False
2019-10-29 17:27:49,932 - INFO - Received completion request
2019-10-29 17:27:49,933 - DEBUG - Using filetype completion: False
2019-10-29 17:27:52,043 - INFO - Received event notification
2019-10-29 17:27:52,043 - DEBUG - Event name: CurrentIdentifierFinished
2019-10-29 17:27:52,044 - INFO - Adding ONE buffer identifier for file: /tmp/x.vim
2019-10-29 17:27:52,055 - INFO - Received completion request
2019-10-29 17:27:52,055 - DEBUG - Using filetype completion: False
2019-10-29 17:27:53,036 - INFO - Received event notification
2019-10-29 17:27:53,036 - DEBUG - Event name: FileReadyToParse
2019-10-29 17:27:53,036 - INFO - Adding buffer identifiers for file: /tmp/x.vim
2019-10-29 17:27:53,037 - DEBUG - Refreshing file /tmp/x.vim: State is Open/action Change
2019-10-29 17:27:53,037 - DEBUG - TX: Sending notification: b'Content-Length: 191\r\n\r\n{"jsonrpc":"2.0","method":"textDocument/didChange","params":{"contentChanges":[{"text":"let a = {\\"x\\": \\"y\\"}\\necho substitute()\\n"}],"textDocument":{"uri":"file:///tmp/x.vim","version":7}}}'
2019-10-29 17:27:53,045 - INFO - Received event notification
2019-10-29 17:27:53,045 - DEBUG - Event name: InsertLeave
2019-10-29 17:27:53,141 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///tmp/x.vim","diagnostics":[]}}'
2019-10-29 17:27:56,255 - INFO - Received debug info request
2019-10-29 17:27:57,149 - INFO - Received debug info request

Dart completer broken after flutter update

After full system update (Arch Linux with AUR package), dart completion is no longer working.

Flutter doctor is clean, and flutter CLI (including flutter format) is working fine.

Printing YouCompleteMe debug information...
-- Resolve completions: Up front
-- Client logfile: /tmp/ycm_lyxq56r9.log
-- Server Python interpreter: /usr/bin/python
-- Server Python version: 3.10.2
-- Server has Clang support compiled in: False
-- Clang version: None
-- Extra configuration file found and loaded
-- Extra configuration path: /home/barabas/.vim/.ycm_extra_conf.py
-- GenericLSP completer debug information:
--   dartCompleter not running
--   dartCompleter executable: ['/opt/flutter/bin/dart', '/home/barabas/.vim/ycm-lsp-examples/dart/analysis_server.dart.snapshot', '--lsp']
--   dartCompleter logfiles:
--     /tmp/dartcompleter_stderr98f8btlb.log
--   dartCompleter Server State: Dead
--   dartCompleter Project Directory: /home/barabas/projects/hardware/guitar_dsp_platform/monorepo/core/frontend
--   dartCompleter Settings: {}
-- Server running at: http://127.0.0.1:41457
-- Server process ID: 64508
-- Server logfiles:
--   /tmp/ycmd_41457_stdout_72iqrnja.log
--   /tmp/ycmd_41457_stderr_vjhn6w6h.log

The dartcompleter logs show this:
Wrong full snapshot version, expected 'd56742caf7b3b3f4bd2df93a9bbb5503' found 'adf563436d12ba0d50ea5beb7f3be1bb'

Installation failed, vueCompleter Server State: Dead

Hello tried, to make project work on vue files. I have followed installation process but does not seem to work, here is debug info telling that server is dead

Printing YouCompleteMe debug information...
-- Client logfile: /var/folders/f3/zmf684px0_31cvv2cf463zqr0000gn/T/ycm__u27rimx.log
-- Server Python interpreter: /usr/bin/python
-- Server Python version: 2.7.10
-- Server has Clang support compiled in: False
-- Clang version: None
-- Extra configuration file found and loaded
-- Extra configuration path: /Users/nbossard/OtherProjects/mahali/front/webapp/.ycm_extra_conf.py
-- GenericLSP completer debug information:
--   vueCompleter not running
--   vueCompleter executable: ['/Users/nbossard/.vim/bundle/lsp-examples/vue/node_modules/.bin/vls']
--   vueCompleter logfiles:
--     /var/folders/f3/zmf684px0_31cvv2cf463zqr0000gn/T/vuecompleter_stderr42NXPM.log
**--   vueCompleter Server State: Dead**
--   vueCompleter Project Directory: /Users/nbossard/OtherProjects/mahali/front/webapp
--   vueCompleter Settings: {}
-- Server running at: http://127.0.0.1:49699
-- Server process ID: 60603
-- Server logfiles:
--   /var/folders/f3/zmf684px0_31cvv2cf463zqr0000gn/T/ycmd_49699_stdout_21gu97xr.log
--   /var/folders/f3/zmf684px0_31cvv2cf463zqr0000gn/T/ycmd_49699_stderr_dt97yaf6.log

and here is an extract of log file

33 2019-08-25.15:13:18,448.-.INFO.-.Received.filetype.completion.available.request
  34 2019-08-25.15:13:21,165.-.INFO.-.Received.extra.conf.load.request
  35 2019-08-25.15:13:21,170.-.INFO.-.Received.event.notification
  36 2019-08-25.15:13:21,170.-.INFO.-.Adding.buffer.identifiers.for.file:./Users/nbossard/OtherProjects/mahali/front/webapp/src/views/About.vue
  37 2019-08-25.15:13:21,176.-.INFO.-.Starting.vueCompleter:.[u'/Users/nbossard/.vim/bundle/lsp-examples/vue/node_modules/.bin/vls']
  38 2019-08-25.15:13:21,183.-.INFO.-.vueCompleter.started
  39 2019-08-25.15:13:21,734.-.ERROR.-.The.language.server.communication.channel.closed.unexpectedly..Issue.a.RestartServer.command.to.recover.
  40 Traceback.(most.recent.call.last):
  41 ..File."/Users/nbossard/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py",.line.318,.in.run
  42 ....self._ReadMessages()
  43 ..File."/Users/nbossard/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py",.line.473,.in._ReadMessages
  44 ....self._DispatchMessage(.lsp.Parse(.content.).)
  45 ..File."/Users/nbossard/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py",.line.549,.in._DispatchMessage
  46 ....self._responses[.message_id.].ResponseReceived(.message.)
  47 ..File."/Users/nbossard/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py",.line.174,.in.ResponseReceived
  48 ....self._response_callback(.self,.message.)
  49 ..File."/Users/nbossard/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py",.line.1564,.in.response_handler
  50 ....self._HandleInitializeInPollThread(.message.)
  51 ..File."/Users/nbossard/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py",.line.1587,.in._HandleInitializeInPollThread
  52 ....self._server_capabilities.=.response[.'result'.][.'capabilities'.]
  53 KeyError:.u'result'

and if I start vls by hand I get :

/Users/nbossard/.vim/bundle/lsp-examples/vue/node_modules/.bin/vls -v             ๎‚ฒ SIGINT(2) โ†ต ๎‚ฒ 3 โš™ ๎‚ฒ 5428 ๎‚ฒ 15:50:50
/Users/nbossard/.vim/bundle/lsp-examples/vue/node_modules/vscode-languageserver/lib/main.js:799
        throw new Error("Connection input stream is not set. " + commandLineMessage);
        ^

Error: Connection input stream is not set. Use arguments of createConnection or set command line parameters: '--node-ipc', '--stdio' or '--socket={number}'
    at _createConnection (/Users/nbossard/.vim/bundle/lsp-examples/vue/node_modules/vscode-languageserver/lib/main.js:799:15)
    at Object.createConnection (/Users/nbossard/.vim/bundle/lsp-examples/vue/node_modules/vscode-languageserver/lib/main.js:746:12)
    at Object.<anonymous> (/Users/nbossard/.vim/bundle/lsp-examples/vue/node_modules/vue-language-server/dist/vueServerMain.js:13:145)
    at Module._compile (internal/modules/cjs/loader.js:759:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:770:10)
    at Module.load (internal/modules/cjs/loader.js:628:32)
    at Function.Module._load (internal/modules/cjs/loader.js:555:12)
    at Module.require (internal/modules/cjs/loader.js:666:19)
    at require (internal/modules/cjs/helpers.js:16:16)
    at Object.<anonymous> (/Users/nbossard/.vim/bundle/lsp-examples/vue/node_modules/vue-language-server/bin/vls:2:1)
 ~/OtherProjects/mahali/front/webapp ๎‚ฐ ๎‚  feature/install_help_other_browsers โœš โ— ? โŸ2 ๎‚ฐ   

Kotlin completer donot work

Hi~
I try to use the kotlin settings for a gradle project, but there is no semantic completion at all. The stderr log file output as below:

2019-08-09 14:47:34,756 - INFO - Received ready request
2019-08-09 14:47:34,809 - INFO - Received event notification
2019-08-09 14:47:34,811 - INFO - Received event notification
2019-08-09 14:47:34,811 - INFO - Adding buffer identifiers for file: /home/jackey/My_project/kotlin/hello/hello.kt
Traceback (most recent call last):
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/bottle/bottle.py", line 862, in _handle
    return route.call(**args)
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/bottle/bottle.py", line 1740, in wrapper
    rv = callback(*a, **ka)
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/watchdog_plugin.py", line 104, in wrapper
    return callback( *args, **kwargs )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/hmac_plugin.py", line 68, in wrapper
    body = callback( *args, **kwargs )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/handlers.py", line 67, in EventNotification
    event_handler )( request_data )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 1186, in OnFileReadyToParse
    self._StartAndInitializeServer( request_data )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 1172, in _StartAndInitializeServer
    extra_conf_dir = self._GetSettingsFromExtraConf( request_data )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 1152, in _GetSettingsFromExtraConf
    module = extra_conf_store.ModuleForSourceFile( request_data[ 'filepath' ] )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/extra_conf_store.py", line 62, in ModuleForSourceFile
    return Load( ModuleFileForSourceFile( filename ) )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/extra_conf_store.py", line 73, in ModuleFileForSourceFile
    if Load( module_file ):
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/extra_conf_store.py", line 158, in Load
    if not force and not _ShouldLoad( module_file, is_global ):
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/extra_conf_store.py", line 141, in _ShouldLoad
    raise UnknownExtraConf( module_file )
UnknownExtraConf: Found /home/jackey/.ycm_extra_conf.py. Load? 

(Question can be turned off with options, see YCM docs)
2019-08-09 14:47:34,916 - INFO - Received filetype completion available request
2019-08-09 14:47:36,676 - INFO - Received extra conf load request
2019-08-09 14:47:36,689 - INFO - Received event notification
2019-08-09 14:47:36,689 - INFO - Adding buffer identifiers for file: /home/jackey/My_project/kotlin/hello/hello.kt
2019-08-09 14:47:36,690 - INFO - Starting kotlinCompleter: [u'/home/jackey/Development/lsp/kotlin/KotlinLanguageServer/server/build/install/server/bin/kotlin-language-server']
2019-08-09 14:47:36,706 - INFO - kotlinCompleter started
2019-08-09 14:47:44,252 - ERROR - The language server communication channel closed unexpectedly. Issue a RestartServer command to recover.
Traceback (most recent call last):
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 318, in run
    self._ReadMessages()
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 473, in _ReadMessages
    self._DispatchMessage( lsp.Parse( content ) )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 549, in _DispatchMessage
    self._responses[ message_id ].ResponseReceived( message )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 174, in ResponseReceived
    self._response_callback( self, message )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 1566, in response_handler
    self._HandleInitializeInPollThread( message )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 1589, in _HandleInitializeInPollThread
    self._server_capabilities = response[ 'result' ][ 'capabilities' ]
KeyError: u'result'
2019-08-09 14:47:49,437 - INFO - Received debug info request

After set log level into debug mode, I found some useful info here:

(Question can be turned off with options, see YCM docs)
2019-08-09 14:49:38,564 - INFO - Received filetype completion available request
2019-08-09 14:49:38,893 - INFO - Received extra conf load request
2019-08-09 14:49:38,906 - INFO - Received event notification
2019-08-09 14:49:38,907 - DEBUG - Event name: FileReadyToParse
2019-08-09 14:49:38,907 - INFO - Adding buffer identifiers for file: /home/jackey/My_project/kotlin/hello/hello.kt
2019-08-09 14:49:38,908 - DEBUG - No Settings function defined in /home/jackey/.ycm_extra_conf.py
2019-08-09 14:49:38,908 - DEBUG - Using path /home/jackey for extra_conf_dir
2019-08-09 14:49:38,908 - INFO - Starting kotlinCompleter: [u'/home/jackey/Development/lsp/kotlin/KotlinLanguageServer/server/build/install/server/bin/kotlin-language-server']
2019-08-09 14:49:38,924 - INFO - kotlinCompleter started
2019-08-09 14:49:38,926 - DEBUG - TX: Sending message: b'Content-Length: 357\r\n\r\n{"id": "1", "jsonrpc": "2.0", "method": "initialize", "params": {"capabilities": {"textDocument": {"completion": {"completionItemKind": {"valueSet": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]}}}}, "initializationOptions": {}, "processId": 29394, "rootPath": "/home/jackey", "rootUri": "file:///home/jackey"}}'
2019-08-09 14:49:39,814 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":3,"message":"main      Connected to client"}}'
2019-08-09 14:49:39,844 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":3,"message":"client    Adding workspace file:///home/jackey to source path"}}'
2019-08-09 14:49:44,503 - INFO - Received debug info request
2019-08-09 14:49:46,473 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":1,"message":"client    Internal error: java.lang.reflect.InvocationTargetException"}}'
2019-08-09 14:49:46,474 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":"1","error":{"code":-32603,"message":"Internal error.","data":"java.lang.RuntimeException: java.lang.reflect.InvocationTargetException\\n\\tat org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint.lambda$null$0(GenericEndpoint.java:67)\\n\\tat org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint.request(GenericEndpoint.java:120)\\n\\tat org.eclipse.lsp4j.jsonrpc.RemoteEndpoint.handleRequest(RemoteEndpoint.java:261)\\n\\tat org.eclipse.lsp4j.jsonrpc.RemoteEndpoint.consume(RemoteEndpoint.java:190)\\n\\tat org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer.handleMessage(StreamMessageProducer.java:192)\\n\\tat org.eclipse.lsp4j.jsonrpc.json.StreamMessageProducer.listen(StreamMessageProducer.java:94)\\n\\tat org.eclipse.lsp4j.jsonrpc.json.ConcurrentMessageProcessor.run(ConcurrentMessageProcessor.java:99)\\n\\tat java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)\\n\\tat java.util.concurrent.FutureTask.run(FutureTask.java:266)\\n\\tat java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)\\n\\tat java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)\\n\\tat java.lang.Thread.run(Thread.java:748)\\nCaused by: java.lang.reflect.InvocationTargetException\\n\\tat sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)\\n\\tat sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)\\n\\tat sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)\\n\\tat java.lang.reflect.Method.invoke(Method.java:498)\\n\\tat org.eclipse.lsp4j.jsonrpc.services.GenericEndpoint.lambda$null$0(GenericEndpoint.java:65)\\n\\t... 11 more\\nCaused by: java.io.UncheckedIOException: java.nio.file.AccessDeniedException: /home/jackey/.cache/dconf\\n\\tat java.nio.file.FileTreeIterator.fetchNextIfNeeded(FileTreeIterator.java:88)\\n\\tat java.nio.file.FileTreeIterator.hasNext(FileTreeIterator.java:104)\\n\\tat java.util.Iterator.forEachRemaining(Iterator.java:115)\\n\\tat java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)\\n\\tat java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)\\n\\tat java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)\\n\\tat java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)\\n\\tat java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)\\n\\tat java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:566)\\n\\tat org.javacs.kt.SourceFilesKt.findSourceFiles(SourceFiles.kt:197)\\n\\tat org.javacs.kt.SourceFilesKt.access$findSourceFiles(SourceFiles.kt:1)\\n\\tat org.javacs.kt.SourceFiles.addWorkspaceRoot(SourceFiles.kt:129)\\n\\tat org.javacs.kt.KotlinLanguageServer.initialize(KotlinLanguageServer.kt:70)\\n\\t... 16 more\\nCaused by: java.nio.file.AccessDeniedException: /home/jackey/.cache/dconf\\n\\tat sun.nio.fs.UnixException.translateToIOException(UnixException.java:84)\\n\\tat sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)\\n\\tat sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)\\n\\tat sun.nio.fs.UnixFileSystemProvider.newDirectoryStream(UnixFileSystemProvider.java:427)\\n\\tat java.nio.file.Files.newDirectoryStream(Files.java:457)\\n\\tat java.nio.file.FileTreeWalker.visit(FileTreeWalker.java:300)\\n\\tat java.nio.file.FileTreeWalker.next(FileTreeWalker.java:372)\\n\\tat java.nio.file.FileTreeIterator.fetchNextIfNeeded(FileTreeIterator.java:95)\\n\\t... 28 more\\n"}}'
2019-08-09 14:49:46,475 - ERROR - The language server communication channel closed unexpectedly. Issue a RestartServer command to recover.
Traceback (most recent call last):
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 318, in run
    self._ReadMessages()
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 473, in _ReadMessages
    self._DispatchMessage( lsp.Parse( content ) )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 549, in _DispatchMessage
    self._responses[ message_id ].ResponseReceived( message )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 174, in ResponseReceived
    self._response_callback( self, message )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 1566, in response_handler
    self._HandleInitializeInPollThread( message )
  File "/home/jackey/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 1589, in _HandleInitializeInPollThread
    self._server_capabilities = response[ 'result' ][ 'capabilities' ]
KeyError: u'result'

After some analysis, I finally found that this error is caused by the missing of .ycm_extra_conf.py file, YCM treats the path of conf file as workspace of the project and send it to kotlin-language-server, but the server does not set properly try-catch block for file parsing. After put .ycm_extra_conf.py into the root path of gradle project, everything work fine now ;)

Thus for an easy start for new users, I think it's better to add this notice in README file. And I provide a pr for it ;)

dartfmt is being deprecated

I'm trying to set up Dart to use with Flutter. My Flutter version is:

Flutter 2.8.1 โ€ข channel stable โ€ข https://github.com/flutter/flutter.git
Framework โ€ข revision 77d935af4d (2 weeks ago) โ€ข 2021-12-16 08:37:33 -0800
Engine โ€ข revision 890a5fca2e
Tools โ€ข Dart 2.15.1

python3 ./install.py --enable-dart fails because dartfmt is not in my path:

*** Entering direcory /home/barabas/.vim/ycm-lsp-examples/dart ***
Traceback (most recent call last):
  File "/home/barabas/.vim/ycm-lsp-examples/dart/install.py", line 38, in <module>
    raise UserWarning( '`dart` and `dartfmt` are needed in $PATH for proper operation' )
UserWarning: `dart` and `dartfmt` are needed in $PATH for proper operation
** FAILED **: dart

According to dart-lang/dart_style#986, dartfmt is being replaced by dart format. The latter works on my install.

I think the installer should check for both dart format and dartfmt to check if the formatter is installed.


After some more investigation I think dartfmt is not required at all. It is only mentioned in the installer, unless it is used internally by the language server?

Vue completer not working

Issue Prelude

Please complete these steps and check these boxes (by putting an x inside
the brackets) before filing your issue:

  • I have read and understood YCM's CONTRIBUTING document.
  • I have read and understood YCM's CODE_OF_CONDUCT document.
  • I have read and understood YCM's README, especially the
    Frequently Asked Questions section.
  • I have searched YCM's issue tracker to find issues similar to the one I'm
    about to report and couldn't find an answer to my problem. (Example Google
    search.
    )
  • If filing a bug report, I have included the output of vim --version.
  • If filing a bug report, I have included the output of :YcmDebugInfo.
  • If filing a bug report, I have attached the contents of the logfiles using
    the :YcmToggleLogs command.
  • If filing a bug report, I have included which OS (including specific OS
    version) I am using.
  • If filing a bug report, I have included a minimal test case that reproduces
    my issue, using vim -Nu /path/to/YCM/vimrc_ycm_minimal, including what I
    expected to happen and what actually happened.
  • If filing a installation failure report, I have included the entire output
    of install.py (or cmake/make/ninja) including its invocation
  • I understand this is an open-source project staffed by volunteers and
    that any help I receive is a selfless, heartfelt gift of their free time. I
    know I am not entitled to anything and will be polite and courteous.
  • I understand my issue may be closed if it becomes obvious I didn't
    actually perform all of these steps.

Thank you for adhering to this process! It ensures your issue is resolved
quickly and that neither your nor our time is needlessly wasted.

Issue Details

Provide a clear description of the problem, including the following key
questions:

  • What did you do?

Include steps to reproduce here.

  1. Clone this repository
  2. Run ./install.py --all
  3. Append source /path/to/clone/vimrc.generated to .vimrc
  4. Open a vue file
  5. Use :YcmCompleter GoToDefinition

Include description of a minimal test case, including any actual code required
to reproduce the issue.

If you made changes to vimrc_ycm_minimal, pase them here:

None

  • What did you expect to happen?

Include description of the expected behaviour.

Go to the definition of a method.

  • What actually happened?

Include description of the observed behaviour, including actual output,
screenshots, etc.

vim shows

RuntimeError: Server is initializing. Please wait.

Diagnostic data

Output of vim --version

VIM - Vi IMproved 8.2 (2019 Dec 12, compiled Aug 11 2020 17:00:59)
Included patches: 1-716
Modified by [email protected]
Compiled by [email protected]
Huge version with GTK3 GUI.  Features included (+) or not (-):
+acl               -farsi             +mouse_sgr         +tag_binary
+arabic            +file_in_path      -mouse_sysmouse    -tag_old_static
+autocmd           +find_in_path      +mouse_urxvt       -tag_any_white
+autochdir         +float             +mouse_xterm       +tcl
-autoservername    +folding           +multi_byte        +termguicolors
+balloon_eval      -footer            +multi_lang        +terminal
+balloon_eval_term +fork()            -mzscheme          +terminfo
+browse            +gettext           +netbeans_intg     +termresponse
++builtin_terms    -hangul_input      +num64             +textobjects
+byte_offset       +iconv             +packages          +textprop
+channel           +insert_expand     +path_extra        +timers
+cindent           +ipv6              +perl              +title
+clientserver      +job               +persistent_undo   +toolbar
+clipboard         +jumplist          +popupwin          +user_commands
+cmdline_compl     +keymap            +postscript        +vartabs
+cmdline_hist      +lambda            +printer           +vertsplit
+cmdline_info      +langmap           +profile           +virtualedit
+comments          +libcall           -python            +visual
+conceal           +linebreak         +python3           +visualextra
+cryptv            +lispindent        +quickfix          +viminfo
+cscope            +listcmds          +reltime           +vreplace
+cursorbind        +localmap          +rightleft         +wildignore
+cursorshape       +lua               -ruby              +wildmenu
+dialog_con_gui    +menu              +scrollbind        +windows
+diff              +mksession         +signs             +writebackup
+digraphs          +modify_fname      +smartindent       +X11
+dnd               +mouse             +sound             -xfontset
-ebcdic            +mouseshape        +spell             +xim
+emacs_tags        +mouse_dec         +startuptime       +xpm
+eval              +mouse_gpm         +statusline        +xsmp_interact
+ex_extra          -mouse_jsbterm     -sun_workshop      +xterm_clipboard
+extra_search      +mouse_netterm     +syntax            -xterm_save
   system vimrc file: "$VIM/vimrc"
     user vimrc file: "$HOME/.vimrc"
 2nd user vimrc file: "~/.vim/vimrc"
      user exrc file: "$HOME/.exrc"
  system gvimrc file: "$VIM/gvimrc"
    user gvimrc file: "$HOME/.gvimrc"
2nd user gvimrc file: "~/.vim/gvimrc"
       defaults file: "$VIMRUNTIME/defaults.vim"
    system menu file: "$VIMRUNTIME/menu.vim"
  fall-back for $VIM: "/usr/share/vim"
Compilation: gcc -c -I. -Iproto -DHAVE_CONFIG_H -DFEAT_GUI_GTK  -pthread -I/usr/include/gtk-3.0 -I/usr/include/at-spi2-atk/2.0 -I/usr/include/at-spi-2.0 -I/usr/include/dbus-1.0 -I/usr/lib/x86_64-linux-gnu/dbus-1.0/include -I/usr/include/gtk-3.0 -I/usr/include/gio-unix-2.0 -I/usr/include/cairo -I/usr/include/pango-1.0 -I/usr/include/fribidi -I/usr/include/harfbuzz -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/pixman-1 -I/usr/include/uuid -I/usr/include/freetype2 -I/usr/include/libpng16 -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/libmount -I/usr/include/blkid -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -Wdate-time  -g -O2 -fdebug-prefix-map=/build/vim-It0QT5/vim-8.2.0716=. -fstack-protector-strong -Wformat -Werror=format-security -D_REENTRANT -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1       
Linking: gcc   -Wl,-E  -Wl,-Bsymbolic-functions -Wl,-z,relro -Wl,-z,now -Wl,--as-needed -o vim   -lgtk-3 -lgdk-3 -lpangocairo-1.0 -lpango-1.0 -lharfbuzz -latk-1.0 -lcairo-gobject -lcairo -lgdk_pixbuf-2.0 -lgio-2.0 -lgobject-2.0 -lglib-2.0 -lSM -lICE -lXpm -lXt -lX11 -lXdmcp -lSM -lICE  -lm -ltinfo  -lselinux  -lcanberra -lacl -lattr -lgpm -ldl  -L/usr/lib -llua5.2 -Wl,-E  -fstack-protector-strong -L/usr/local/lib  -L/usr/lib/x86_64-linux-gnu/perl/5.30/CORE -lperl -ldl -lm -lpthread -lcrypt  -L/usr/lib/python3.8/config-3.8-x86_64-linux-gnu -lpython3.8 -lcrypt -lpthread -ldl -lutil -lm -lm -L/usr/lib/x86_64-linux-gnu -ltcl8.6 -ldl -lz -lpthread -lm     

Output of YcmDebugInfo

Printing YouCompleteMe debug information...
-- Resolve completions: Up front
-- Client logfile: /tmp/ycm_k7bq2qjw.log
-- Server Python interpreter: /usr/bin/python3
-- Server Python version: 3.8.6
-- Server has Clang support compiled in: True
-- Clang version: clang version 11.0.0 ([email protected]:ycm-core/llvm ff1d9b2bb8f62c1924db137b544598b8e974ada8)
-- Extra configuration file found and loaded
-- Extra configuration path: /home/hyundeok/.vim/.ycm_extra_conf.py
-- GenericLSP completer debug information:
--   vueCompleter not running
--   vueCompleter executable: ['/home/hyundeok/git/lsp-examples/vue/node_modules/.bin/vls']
--   vueCompleter logfiles:
--     /tmp/vuecompleter_stderr22qkzu8o.log
--   vueCompleter Server State: Dead
--   vueCompleter Project Directory: /home/hyundeok/Programming/JavaScript/rest-api-example/js/client
--   vueCompleter Settings: {}
-- Server running at: http://127.0.0.1:45201
-- Server process ID: 23122
-- Server logfiles:
--   /tmp/ycmd_45201_stdout_k7x76hsm.log
--   /tmp/ycmd_45201_stderr_sp0igbjy.log

Output of YcmDiags

No warning or error detected.

Output of git rev-parse HEAD in YouCompleteMe installation directory

2434b104065be4590f07ad950d0943b7194f01e6

Contents of YCM, ycmd and completion engine logfiles

Reproduce the issue with vim -Nu /path/to/YCM/vimrc_ycm_minimal, which
enabled debug logging and other useful diagnostics. Include a link to a
gist containing all of the log files listed by :YcmToggleLogs.

Output of YcmToggleLogs

/tmp/vuecompleter_stderr22qkzu8o.log
/tmp/ycm_k7bq2qjw.log
/tmp/ycmd_45201_stderr_sp0igbjy.log
/tmp/ycmd_45201_stdout_k7x76hsm.log

Output of /tmp/vuecompleter_stderr22qkzu8o.log is here.

Output of /tmp/ycm_k7bq2qjw.log is here.

Output of /tmp/ycmd_45201_stderr_sp0igbjy.log is here.

Output of /tmp/ycmd_45201_stdout_k7x76hsm.log is here.

OS version, distribution, etc.

Include system information here.

Output of uname -a:

Linux LAPTOP-PNJMVIIU 4.19.128-microsoft-standard #1 SMP Tue Jun 23 12:58:10 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

Output of build/install commands

Include link to a gist containing the invocation and entire output of
install.py if reporting an installation issue.

The excerpt from my .vimrc:

Plug 'ycm-core/YouCompleteMe', {'do': './install.py --all --clangd-completer'}

The installation of lsp-examples is mentioned above, but restate here:

./install.py --all

Reported error for comment after an indented let=<<

Well, I too hurriedly posted this issue on Vim, vim/vim#11642, but in reality it belongs here. Below is a copy of the text.

Steps to reproduce

  1. Open a vimscript file and fill it with the following content:
fun SomeFun()
  let text =<< trim END
  Some text
  END
endf
" a comment
  1. Observe the syntax coloring of "
  2. Hit EscapeGAEnterEnter.
  3. See the error.

Here's a screencast:

asciicast


Note there's nothing after the closing END and there's as much space before as before let. This is consistent with let {var-name} =<< [trim] [eval] {endmarker}'s documentation, specifically

The last line should end only with the {endmarker} string without any other character.

and

The marker must line up with "let".

Expected behaviour

Correct syntax coloring and no error.

Version of Vim

9.0 patch 1-910

Environment

Operating system: up-to-date Archlinux
Terminal: URxvt
Value of $TERM: rxvt-unicode-256color
Shell: Bash

Logs and stack traces

No response

[neovim] sourcing vimrc.generated in vimrc greets on startup with press enter

Press Enter or Type command to continue

Nov12::052217

vimrc.generated


     let g:ycm_lsp_dir = '/home/lain/.dotfiles-darwin/.dotfiles-vim/plugged/lsp-examples'
     let g:ycm_language_server = []
  let g:ycm_language_server += [
  \   { 'name': 'rust',
  \     'filetypes': [ 'rust' ],
  \     'cmdline': [ expand( g:ycm_lsp_dir .  '/rust/rust-analyzer/target/release/rust-analyzer' ) ],
  \     'project_root_files': [ 'Cargo.toml' ],
  \   },
  \ ]
let g:ycm_language_server += [
  \   {
  \     'name': 'yaml',
  \     'cmdline': [ 'node', expand( g:ycm_lsp_dir . '/yaml/node_modules/.bin/yaml-language-server' ), '--stdio' ],
  \     'filetypes': [ 'yaml' ],
  \     'capabilities': { 'textDocument': { 'completion': { 'completionItem': { 'snippetSupport': v:true } } } },
  \   },
  \ ]
let g:ycm_language_server += [
  \   { 'name': 'purescript',
  \     'filetypes': [ 'purescript' ],
  \     'cmdline': [ expand( g:ycm_lsp_dir . '/purescript/node_modules/.bin/purescript-language-server' ), '--stdio' ]
  \   },
  \ ]
let g:ycm_language_server += [
  \   { 'name': 'd',
  \     'filetypes': [ 'd' ],
  \     'cmdline': [ expand( g:ycm_lsp_dir . '/d/serve-d' ) ],
  \   },
  \ ]
let g:ycm_language_server += [
  \   {
  \     'name': 'haskell-language-server',
  \     'cmdline': [ 'haskell-language-server-wrapper', '--lsp' ],
  \     'filetypes': [ 'haskell', 'lhaskell' ],
  \     'project_root_files': [ 'stack.yaml', 'cabal.project', 'package.yaml', 'hie.yaml' ],
  \   },
  \ ]
let g:ycm_language_server += [
  \   {
  \     'name': 'json',
  \     'cmdline': [ 'node', expand( g:ycm_lsp_dir . '/json/node_modules/.bin/vscode-json-languageserver' ), '--stdio' ],
  \     'filetypes': [ 'json' ],
  \     'capabilities': { 'textDocument': { 'completion': { 'completionItem': { 'snippetSupport': v:true } } } },
  \   },
  \ ]
let g:ycm_language_server += [
  \   {
  \     'name': 'godot',
  \     'filetypes': [ 'gdscript' ],
  \     'project_root_files': [ 'project.godot' ],
  \     'port': 6008
  \   },
  \ ]
let g:ycm_language_server += [
  \   { 'name': 'vue',
  \     'filetypes': [ 'vue' ],
  \     'cmdline': [ expand( g:ycm_lsp_dir . '/vue/node_modules/.bin/vls' ) ]
  \   },
  \ ]
let g:ycm_language_server += [
  \   { 'name': 'scala',
  \     'filetypes': [ 'scala' ],
  \     'cmdline': [ 'metals-vim' ],
  \     'project_root_files': [ 'build.sbt' ]
  \   },
  \ ]
let g:ycm_language_server += [
  \   { 'name': 'docker',
  \     'filetypes': [ 'dockerfile' ],
  \     'cmdline': [ expand( g:ycm_lsp_dir . '/docker/node_modules/.bin/docker-langserver' ), '--stdio' ]
  \   },
  \ ]
let g:ycm_language_server += [
  \   { 'name': 'fortran',
  \     'filetypes': [ 'fortran' ],
  \     'cmdline': [ 'fortls' ],
  \   },
  \ ]
let g:ycm_language_server += [
  \   {
  \     'name': 'bash',
  \     'cmdline': [ 'node', expand( g:ycm_lsp_dir . '/bash/node_modules/.bin/bash-language-server' ), 'start' ],
  \     'filetypes': [ 'sh', 'bash' ],
  \   },
  \ ]
let g:ycm_language_server += [
  \   { 'name': 'vim',
  \     'filetypes': [ 'vim' ],
  \     'cmdline': [ expand( g:ycm_lsp_dir . '/viml/node_modules/.bin/vim-language-server' ), '--stdio' ]
  \   },
  \ ]
let g:ycm_language_server += [
  \   {
  \     'name': 'angular',
  \     'cmdline': [ 'node' ,
  \        expand( g:ycm_lsp_dir . '/angular/node_modules/@angular/language-server' ),
  \        '--ngProbeLocations',
  \        expand( g:ycm_lsp_dir . '/angular/node_modules/' ),
  \        '--tsProbeLocations',
  \        expand( g:ycm_lsp_dir . '/angular/node_modules/' ),
  \        '--stdio' ],
  \     'filetypes': [ 'ts','html' ],
  \   },
  \ ]

fortran/install.py report error at line 49

when I try to run "python install.py --enable-fortran" , it report fail.
It failed at line 49 of file fortran/install.py
subprocess.check_call( [ pip, 'install', 'fortran-language-server' ] )

I try to change the code as the following, it is worked .
subprocess.check_call( [ 'pip', 'install', 'fortran-language-server' ] )

I hop it is useful .

Vue completer didn't work

env

vls version: 0.0.62 (installed with npm install -g --production)
neovim: NVIM v0.4.0-1809-ge3e0574cb

problem

Neither completer or goto command worked.

detail

Running vls --stdio from the directory where I started vim just blocked.

And these are logs after setting let g:ycm_keep_logfiles = 1 let g:ycm_log_level = 'debug':

vuecompleter_xxx.log: empty
ycm_xxx.log:

2019-10-16 15:28:29,511 - ERROR - HTTPConnectionPool(host='127.0.0.1', port=41791): Max retries exceeded with url: /ready (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f968d89b9e8>: Failed to establish a new connection: [Errno 111] Connection refused',))

ycmd_xxx_stdout_xxx.log:

serving on http://localhost.localdomain:41791

ycmd_xxx_stderr_xxx.log:

2019-10-16 15:28:29,551 - DEBUG - Global extra conf not loaded or no function YcmCorePreload
2019-10-16 15:28:29,613 - INFO - Received ready request
2019-10-16 15:28:29,632 - INFO - Received event notification
2019-10-16 15:28:29,632 - DEBUG - Event name: BufferVisit
2019-10-16 15:28:29,633 - ERROR - Semantic completion not available for ['startify']
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 111, in FiletypeCompletionAvailable
    self.GetFiletypeCompleter( filetypes )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 100, in GetFiletypeCompleter
    current_filetypes ) )
ValueError: No semantic completer exists for filetypes: ['startify']
2019-10-16 15:28:29,635 - INFO - Received event notification
2019-10-16 15:28:29,635 - DEBUG - Event name: FileReadyToParse
2019-10-16 15:28:29,635 - INFO - Adding buffer identifiers for file: /home/qk/Workspace/stability/vue/branch/v0.0.1/1
2019-10-16 15:28:29,636 - ERROR - Semantic completion not available for ['startify']
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 111, in FiletypeCompletionAvailable
    self.GetFiletypeCompleter( filetypes )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 100, in GetFiletypeCompleter
    current_filetypes ) )
ValueError: No semantic completer exists for filetypes: ['startify']
2019-10-16 15:28:29,746 - INFO - Received filetype completion available request
2019-10-16 15:28:29,746 - ERROR - Semantic completion not available for ['startify']
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 111, in FiletypeCompletionAvailable
    self.GetFiletypeCompleter( filetypes )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 100, in GetFiletypeCompleter
    current_filetypes ) )
ValueError: No semantic completer exists for filetypes: ['startify']
2019-10-16 15:28:33,225 - INFO - Received event notification
2019-10-16 15:28:33,225 - DEBUG - Event name: BufferUnload
2019-10-16 15:28:33,226 - ERROR - Semantic completion not available for ['startify']
Traceback (most recent call last):
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 111, in FiletypeCompletionAvailable
    self.GetFiletypeCompleter( filetypes )
  File "/home/qk/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/server_state.py", line 100, in GetFiletypeCompleter
    current_filetypes ) )
ValueError: No semantic completer exists for filetypes: ['startify']
2019-10-16 15:28:33,626 - INFO - Received event notification
2019-10-16 15:28:33,628 - DEBUG - Event name: BufferVisit
2019-10-16 15:28:33,810 - INFO - Received event notification
2019-10-16 15:28:33,811 - DEBUG - Event name: FileReadyToParse
2019-10-16 15:28:33,811 - INFO - Adding buffer identifiers for file: /home/qk/Workspace/stability/vue/branch/v0.0.1/src/components/dialog/productMonitor.vue
2019-10-16 15:28:33,858 - DEBUG - No Settings function defined in /home/qk/.vim/.ycm_extra_conf.py
2019-10-16 15:28:33,858 - INFO - Starting vueCompleter: ['/usr/local/bin/vls']
2019-10-16 15:28:33,863 - INFO - vueCompleter started
2019-10-16 15:28:33,863 - DEBUG - TX: Sending message: b'Content-Length: 379\r\n\r\n{"id":1,"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{"textDocument":{"completion":{"completionItemKind":{"valueSet":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]}}}},"initializationOptions":{},"processId":15100,"rootPath":"/home/qk/Workspace/stability/vue/branch/v0.0.1","rootUri":"file:///home/qk/Workspace/stability/vue/branch/v0.0.1"}}'
2019-10-16 15:28:33,949 - INFO - Received filetype completion available request
2019-10-16 15:28:34,856 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":4,"message":"Loaded bundled [email protected]."}}'
2019-10-16 15:28:34,887 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":4,"message":"Vetur initialized"}}'
2019-10-16 15:28:34,887 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","id":1,"result":{"capabilities":{"textDocumentSync":1,"completionProvider":{"resolveProvider":true,"triggerCharacters":[".",":","<","\\"","\'","/","@","*"]},"signatureHelpProvider":{"triggerCharacters":["("]},"documentFormattingProvider":false,"hoverProvider":true,"documentHighlightProvider":true,"documentLinkProvider":{"resolveProvider":false},"documentSymbolProvider":true,"definitionProvider":true,"referencesProvider":true,"codeActionProvider":true,"colorProvider":true}}}'
2019-10-16 15:28:34,887 - INFO - Language server requires sync type of Full
2019-10-16 15:28:34,887 - DEBUG - vue: Server declares trigger characters: ['.', ':', '<', '"', "'", '/', '@', '*']
2019-10-16 15:28:34,887 - INFO - vue: Using trigger characters for semantic triggers: .,:,<,",',/,@,*
2019-10-16 15:28:34,888 - DEBUG - TX: Sending notification: b'Content-Length: 52\r\n\r\n{"jsonrpc":"2.0","method":"initialized","params":{}}'
2019-10-16 15:28:34,888 - DEBUG - TX: Sending notification: b'Content-Length: 86\r\n\r\n{"jsonrpc":"2.0","method":"workspace/didChangeConfiguration","params":{"settings":{}}}'
2019-10-16 15:28:34,888 - DEBUG - Refreshing file /home/qk/Workspace/stability/vue/branch/v0.0.1/src/components/dialog/productMonitor.vue: State is Open/action Open
2019-10-16 15:28:34,889 - DEBUG - TX: Sending notification: b'Content-Length: 103782\r\n\r\n{"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"languageId":"vue","text":"<template>\\n  <span class=\\"productMonitor\\" :style=\\"{padding:0,margin:0,marginLeft:type==\'text\' ? \'0px\':0}\\">\\n    <el-button v-if=\\"type==\'text\'\\" type=\\"text\\" :disabled=\\"testObjSelDataList.length <= 0\\" @click.native=\\"getConfigMonitor(productData)\\">\\n      <font-awesome-icon title=\\"\\u76d1\\u63a7\\u914d\\u7f6e\\" :icon=\\"[\'fas\', \'cog\']\\"/> \\n     \\u76d1\\u63a7\\u914d\\u7f6e\\n    </el-button>\\n    <el-button v-else-if=\\"type==\'normal\'\\" :disabled=\\"testObjSelDataList.length <= 0\\" @click.native=\\"getConfigMonitor(productData)\\">\\n      <font-awesome-icon title=\\"\\u76d1\\u63a7\\u914d\\u7f6e\\" :icon=\\"[\'fas\', \'cog\']\\"/>\\n      \\u76d1\\u63a7\\u914d\\u7f6e \\n    </el-button>\\n    <div v-else @click=\\"getConfigMonitor(productData)\\">\\n        \\u76d1\\u63a7\\u914d\\u7f6e \\n    </div>\\n    <el-dialog \\n      :title=\\"monitorTitle\\"\\n      :show-close=\\"false\\"\\n      :close-on-click-modal=\\"false\\"\\n      :close-on-press-escape=\\"false\\"\\n      :append-to-body=\\"true\\"\\n      width=\\"60%\\"\\n      :visible.sync=\\"monitorSetModel\\">\\n      <div class=\\"productMonitor-dialog\\">\\n      <el-row\\n        v-show=\\"!isViewKeyDialogShow\\">\\n        <el-form size=\\"small\\" class=\\"demo-form-inline\\">\\n          <el-form-item label=\\"\\u662f\\u5426\\u4ece\\u5176\\u5b83\\u8bbe\\u5907\\u540c\\u6b65\\u914d\\u7f6e\\uff1a\\">\\n            <el-switch\\n              @change=\\"handelSyncConfigSwitch\\"\\n              v-model=\\"syncConfigSwitch\\">\\n            </el-switch>\\n            <el-tooltip \\n              class=\\"item\\" \\n              effect=\\"dark\\" \\n              content=\\"\\u5f53\\u9009\\u62e9\\u4ece\\u5176\\u5b83\\u8bbe\\u5907\\u540c\\u6b65\\u4fe1\\u606f\\u7684\\u65f6\\u5019\\uff0c\\u8bf7\\u9009\\u62e9\\u8bbe\\u5907\\uff0c\\u9009\\u62e9\\u540e\\u4e0b\\u9762\\u5c55\\u793a\\u7684\\u662f\\u8981\\u540c\\u6b65\\u7684\\u8bbe\\u5907\\u7684\\u914d\\u7f6e\\uff1b\\u5982\\u6ca1\\u6709\\u9009\\u62e9\\u8bbe\\u5907\\uff0c\\u5219\\u6309\\u7167\\u4e0b\\u9762\\u7684\\u914d\\u7f6e\\u8fdb\\u884c\\u8bbe\\u7f6e\\uff01\\" \\n              placement=\\"right\\">\\n              <i class=\\"el-icon-question\\" style=\'color:#e6a23c;margin-left:5px;\'></i>  \\n            </el-tooltip>\\n            <el-select \\n              v-model=\\"syncBindValue\\" \\n              v-show=\\"syncConfigSwitch\\" \\n              filterable\\n              clearable\\n              :loading=\\"configLoading\\"\\n              :loading-text=\\"configLoadingText\\"\\n              placeholder=\\"\\u8bf7\\u9009\\u62e9\\u8bbe\\u5907\\uff0c\\u652f\\u6301\\u6309\\u7167\\u8bbe\\u5907\\u540d\\u79f0\\u8fdb\\u884c\\u641c\\u7d22\\"\\n              @change=\\"getDeviceMonitorConfig\\"\\n              @visible-change=\\"getSyncNeedData\\"\\n              style=\\"margin-left:25px; width:400px\\">\\n                <el-option\\n                  v-for=\\"item in syncNeedData\\"\\n                  :key=\\"item.tlabObjectId\\"\\n                  :label=\\"item.name\\"\\n                  :value=\\"item\\"\\n                  >\\n                  <span style=\\"float: left\\">\\u540d\\u79f0: {{ item.name }}</span>\\n                  <span style=\\"float: right; color: #8492a6; font-size: 13px\\">IP: {{ item.ip }}</span>\\n              </el-option>\\n            </el-select>\\n          </el-form-item>\\n        </el-form>\\n        <el-form size=\\"small\\" class=\\"demo-form-inline\\">\\n          <el-form-item label=\\"\\u90ae\\u4ef6\\u901a\\u77e5\\uff1a\\">\\n            <span style=\\"font-size:10px;color:#e6a23c;\\">\\uff08\\u7ea2\\u8272 <span style=\\"color:red\\">*</span> \\u53f7\\u4e3a\\u8be5\\u8fed\\u4ee3\\u4efb\\u52a1\\u7684\\u6210\\u5458\\uff09</span>\\n            <user-select-form \\n              @changeSelected=\\"getManager\\"\\n              :shareData=\\"email_list\\" \\n              :shareDataLabel=\\"email_list_map\\"\\n              :sourceType=\\"sourceType\\">\\n            </user-select-form>\\n          </el-form-item>\\n        </el-form>\\n        <el-checkbox-group v-model=\\"checkList\\" style=\\"margin-bottom:15px;\\" @change=\\"getTypes\\">\\n          <el-checkbox label=\\"\\u57fa\\u672c\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u5b9e\\u65f6\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u5185\\u5b58\\u6cc4\\u6f0f\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u8fdb\\u7a0b\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u98ce\\u6247\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u6e29\\u5ea6\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u7535\\u6e90\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u7f51\\u7edc\\u72b6\\u6001\\"></el-checkbox>\\n          <el-checkbox label=\\"GPU\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u4e3b\\u63a7/\\u5b50\\u7cfb\\u7edf\\u7f51\\u7edc\\u3001pcie\\u72b6\\u6001\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u4e32\\u53e3\\u65e5\\u5fd7\\u76d1\\u63a7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u8fdc\\u7a0b\\u65e5\\u5fd7\\"></el-checkbox>\\n          <el-checkbox label=\\"\\u7cfb\\u7edf\\u65e5\\u5fd7\\"></el-checkbox>\\n          <el-checkbox label=\\"core\\u6587\\u4ef6\\"></el-checkbox>\\n        </el-checkbox-group>\\n        <el-tabs  v-model=\\"monitorActiveName\\"  @tab-click=\\"tagClick\\">\\n          <el-tab-pane label=\\"\\u57fa\\u672c\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u57fa\\u672c\\u76d1\\u63a7\') != -1\\" name=\\"basicMonitor\\">\\n            <el-table \\n              class=\\"monitorTable\\"\\n              :data=\\"monitorData\\" \\n              border\\n              size=\\"mini\\"\\n              header-cell-class-name=\\"tableHeaderClass\\"\\n              height=\\"350\\"\\n              style=\\"width: 100%\\">\\n              <el-table-column :show-overflow-tooltip=\\"true\\" prop=\\"category_display\\" label=\\"\\u76d1\\u63a7\\u9879\\" width=\\"100px\\"></el-table-column>\\n              <el-table-column prop=\\"is_open\\" label=\\"\\u662f\\u5426\\u5f00\\u542f\\u76d1\\u63a7\\">\\n                <template slot-scope=\\"scope\\">\\n                  <el-switch \\n                    :title=\\"scope.row.category_display == \'\\u65ad\\u7f51\\u76d1\\u63a7\'?\'\\u7981\\u6b62\\u5173\\u95ed\\u65ad\\u7f51\\u76d1\\u63a7\':\'\'\\"\\n                    :disabled=\\"scope.row.category_display == \'\\u65ad\\u7f51\\u76d1\\u63a7\'\\"\\n                    v-model=\\"scope.row.is_open\\"\\n                    @change=\\"handelBasicOpenMonitor($event,scope.row)\\"\\n                    active-text=\\"\\" inactive-text=\\"\\">\\n                  </el-switch>\\n                </template>\\n              </el-table-column>\\n              <el-table-column label=\\"\\u9608\\u503c\\">\\n                <template slot-scope=\\"scope\\">\\n                  <span v-if=\\"scope.row.category != \'deviceReboot\' && scope.row.category != \'disconnect_net\'\\">\\n                    \\u4f7f\\u7528\\u7387 > \\n                    <el-input-number\\n                    v-model=\\"scope.row.threshold.max_value\\"\\n                    :disabled=\\"!scope.row.is_open\\"\\n                    title=\\"\\u8bf7\\u5148\\u5f00\\u542f\\u76d1\\u63a7\\"\\n                    size=\\"small\\" \\n                    style=\\"width:80px\\" \\n                    :controls=\\"false\\"\\n                    :min=\\"1\\"\\n                    :max=\\"100\\">\\n                    </el-input-number> % \\u6216\\n                    \\u4f7f\\u7528\\u7387 &lt;\\n                    <el-input-number\\n                    v-model=\\"scope.row.threshold.min_value\\"\\n                    :disabled=\\"!scope.row.is_open\\"\\n                    title=\\"\\u8bf7\\u5148\\u5f00\\u542f\\u76d1\\u63a7\\"\\n                    size=\\"small\\" \\n                    style=\\"width:80px\\" \\n                    :controls=\\"false\\"\\n                    :min=\\"0\\"\\n                    :max=\\"100\\">\\n                    </el-input-number> %\\n                  </span>\\n                  <el-select \\n                    v-model=\\"scope.row.threshold.keyword\\" \\n                    size=\\"mini\\"\\n                    style=\\"width:80%\\"\\n                    v-if=\\"scope.row.is_open && scope.row.category == \'log\'\\"\\n                    remote default-first-option multiple filterable allow-create\\n                    placeholder=\\"\\u8bf7\\u8bbe\\u7f6e\\u5173\\u952e\\u5b57\\">\\n                  </el-select>\\n                  <el-tooltip \\n                    class=\\"item\\" effect=\\"dark\\" \\n                    content=\\"\\u5982\\u9700\\u540c\\u65f6\\u8bbe\\u7f6e\\u5f00\\u542f\\u547d\\u4ee4\\u548c\\u5173\\u95ed\\u547d\\u4ee4\\uff0c\\u8bf7\\u5148\\u8f93\\u5165\\u65e5\\u5fd7\\u5173\\u95ed\\u7684\\u547d\\u4ee4\\uff0c\\u518d\\u8f93\\u5165\\u65e5\\u5fd7\\u5f00\\u542f\\u7684\\u547d\\u4ee4\\" \\n                    placement=\\"top\\">\\n                    <span>\\n                    <el-select \\n                      v-model=\\"scope.row.threshold.cmd\\" \\n                      size=\\"mini\\"\\n                      style=\\"width:80%;margin-top:5px;\\"\\n                      v-if=\\"scope.row.is_open && scope.row.category == \'log\'\\"\\n                      remote default-first-option multiple filterable allow-create\\n                      placeholder=\\"\\u8bf7\\u8bbe\\u7f6e\\u547d\\u4ee4\\">\\n                    </el-select>\\n                    </span>\\n                  </el-tooltip>\\n                </template>\\n              </el-table-column >\\n            </el-table>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setBasicMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n          <el-tab-pane label=\\"\\u5b9e\\u65f6\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u5b9e\\u65f6\\u76d1\\u63a7\') != -1\\" name=\\"timeMonitor\\">\\n            <el-table \\n              class=\\"timeMonitorTable\\"\\n              :data=\\"timeMonitorData\\" \\n              border\\n              size=\\"mini\\"\\n              header-cell-class-name=\\"tableHeaderClass\\"\\n              height=\\"170\\"\\n              style=\\"width: 100%\\">\\n              <el-table-column :show-overflow-tooltip=\\"true\\" prop=\\"category_display\\" label=\\"\\u76d1\\u63a7\\u9879\\" width=\\"100%\\"></el-table-column>\\n              <el-table-column prop=\\"is_open\\" label=\\"\\u662f\\u5426\\u5f00\\u542f\\u76d1\\u63a7\\">\\n                <template slot-scope=\\"scope\\">\\n                  <el-switch\\n                    v-model=\\"scope.row.is_open\\"\\n                    active-text=\\"\\" inactive-text=\\"\\">\\n                  </el-switch>\\n                </template>\\n              </el-table-column>\\n              <el-table-column label=\\"\\u64cd\\u4f5c\\">\\n                <template slot-scope=\\"scope\\">\\n                  <el-button \\n                    size=\\"small\\"\\n                    type=\\"text\\"\\n                    @click=\\"downMonitorLog(scope.row.category)\\">\\n                    <font-awesome-icon title=\\"\\u4e0b\\u8f7d\\" :icon=\\"[\'fas\', \'download\']\\"/> \\u4e0b\\u8f7d\\n                  </el-button>\\n                  <el-button \\n                    size=\\"small\\"\\n                    type=\\"text\\"\\n                    @click=\\"dumpLink(\'monitor\')\\">\\n                    <font-awesome-icon title=\\"\\u5b9e\\u65f6\\u76d1\\u63a7\\u67e5\\u770b\\" :icon=\\"[\'fas\', \'chart-area\']\\"/> \\u5b9e\\u65f6\\u76d1\\u63a7\\u67e5\\u770b\\n                  </el-button>\\n                </template>\\n              </el-table-column >\\n            </el-table>\\n            <el-alert type=\\"warning\\" title=\\"\\u5b9e\\u65f6\\u76d1\\u63a7\\u4e3a\\u5b9a\\u5236\\u9700\\u8981\\uff0c\\u4f7f\\u7528\\u8be5\\u529f\\u80fd\\u524d\\u8bf7\\u6ce8\\u610f\\u4ee5\\u4e0b\\u51e0\\u70b9:\\" :closable=\\"false\\" style=\\"width:100%;white-space:normal;\\" show-icon simple>\\n              <span style=\\"color:#c29d0b\\">\\n                1. \\u76d1\\u63a7\\u6570\\u636e\\u9700\\u8981\\u5173\\u95ed\\u76d1\\u63a7\\u540e\\u624d\\u80fd\\u4e0b\\u8f7d\\uff1b <br>\\n                2. \\u5b9e\\u65f6\\u76d1\\u63a7CPU\\u76d1\\u63a7\\u95f4\\u9694\\u4e3a1\\u79d2\\u4e00\\u6b21\\uff0c\\u5185\\u5b58\\u4e3a3\\u79d2\\u4e00\\u6b21\\uff1b <br>\\n                3. \\u5b9e\\u65f6\\u76d1\\u63a7\\u8bbe\\u7f6e\\u4e86\\u76d1\\u63a7\\u6301\\u7eed\\u65f6\\u95f4\\uff0c\\u76ee\\u524d\\u4e3a20\\u5206\\u949f\\uff0c20\\u5206\\u949f\\u540e\\u76d1\\u63a7\\u4f1a\\u81ea\\u52a8\\u5173\\u95ed\\uff1b            \\n              </span>\\n            </el-alert>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setTimeMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n          <el-tab-pane label=\\"\\u5185\\u5b58\\u6cc4\\u9732\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u5185\\u5b58\\u6cc4\\u6f0f\\u76d1\\u63a7\') != -1\\" name=\\"outOfMem\\">\\n            <el-table \\n              class=\\"outOfMemTable\\"\\n              :data=\\"outOfMemData\\" \\n              border\\n              size=\\"mini\\"\\n              header-cell-class-name=\\"tableHeaderClass\\"\\n              height=\\"350\\"\\n              style=\\"width: 100%\\">\\n              <el-table-column :show-overflow-tooltip=\\"true\\" prop=\\"category_display\\" label=\\"\\u76d1\\u63a7\\u9879\\" width=\\"100px\\"></el-table-column>\\n              <el-table-column prop=\\"is_open\\" label=\\"\\u662f\\u5426\\u5f00\\u542f\\u76d1\\u63a7\\">\\n                <template slot-scope=\\"scope\\">\\n                  <el-switch\\n                    v-model=\\"scope.row.is_open\\"\\n                    active-text=\\"\\" inactive-text=\\"\\">\\n                  </el-switch>\\n                </template>\\n              </el-table-column>\\n              <el-table-column label=\\"\\u95f4\\u9694\\" width=\\"185px\\">\\n                <template slot-scope=\\"scope\\">\\n                  <el-input-number \\n                    style=\\"width:130px;\\"\\n                    v-model=\\"scope.row.interval\\"\\n                    :min=\\"1\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694\\">\\n                  </el-input-number> \\u79d2\\n                </template>\\n              </el-table-column >\\n              <el-table-column label=\\"\\u8bbe\\u5907\\u578b\\u53f7\\">\\n                <template slot-scope=\\"scope\\">\\n                  <el-select v-model=\\"scope.row.device_model\\" placeholder=\\"\\u8bf7\\u9009\\u62e9\\">\\n                    <el-option\\n                      v-for=\\"item in deviceOptions\\"\\n                      :key=\\"item\\"\\n                      :label=\\"item\\"\\n                      :value=\\"item\\">\\n                    </el-option>\\n                  </el-select>\\n                </template>\\n              </el-table-column>\\n              <el-table-column label=\\"\\u64cd\\u4f5c\\">\\n                <template>\\n                  <el-button \\n                    size=\\"small\\"\\n                    type=\\"text\\"\\n                    @click=\\"dumpLink(\'outOfMem\')\\">\\n                    <font-awesome-icon title=\\"\\u76d1\\u63a7\\u67e5\\u770b\\" :icon=\\"[\'fas\', \'chart-area\']\\"/> \\u76d1\\u63a7\\u67e5\\u770b\\n                  </el-button>\\n                </template>\\n              </el-table-column >\\n            </el-table>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setOutOfMemMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n          <el-tab-pane label=\\"\\u8fdb\\u7a0b\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u8fdb\\u7a0b\\u76d1\\u63a7\') != -1\\" name=\\"processMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"processref\\"   size=\\"mini\\" >\\n              <el-form-item label=\\"\\u5f00\\u542f\\u76d1\\u63a7\\uff1a\\">\\n                <el-switch\\n                  @change=\\"handelProcessSwitch\\"\\n                  v-model=\\"processSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"processSwitch\\" label=\\"\\u8fdb\\u7a0b\\u540d\\u79f0\\uff1a\\">\\n                <el-col :span=\\"20\\" >\\n                  <el-select \\n                    style=\\"width: 80%;\\"\\n                    v-model=\\"processNames\\" \\n                    size=\\"small\\"\\n                    remote default-first-option multiple filterable allow-create\\n                    placeholder=\\"\\u8bf7\\u8f93\\u5165\\u8fdb\\u7a0b\\u540d\\u79f0\\">\\n                  </el-select>\\n                  <el-button size=\\"small\\" style=\\"margin-left:10px\\"\\n                    @click=\\"deleteProcess\\">\\n                    \\u6e05\\u7a7a\\u8fdb\\u7a0b\\n                  </el-button>\\n                </el-col>\\n              </el-form-item>\\n              <el-form-item v-if=\\"processSwitch\\" label=\\"\\u76d1\\u63a7\\u95f4\\u9694\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"processInterval\\"\\n                    :min=\\"30\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694, \\u6700\\u5c0f\\u503c30\\">\\n                  </el-input-number> \\u79d2\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setProcessMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n\\n          <el-tab-pane label=\\"\\u98ce\\u6247\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u98ce\\u6247\\u76d1\\u63a7\') != -1\\" name=\\"fanMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"fanRef\\"   size=\\"mini\\" >\\n              <el-form-item label=\\"\\u5f00\\u542f\\u76d1\\u63a7\\uff1a\\">\\n                <el-switch\\n                  @change=\\"handelFanSwitch\\"\\n                  v-model=\\"fanSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"fanSwitch\\" label=\\"\\u76d1\\u63a7\\u95f4\\u9694\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"fanInterval\\"\\n                    :min=\\"30\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694, \\u6700\\u5c0f\\u503c30\\">\\n                  </el-input-number> \\u79d2\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setFanMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n\\n          <el-tab-pane label=\\"\\u6e29\\u5ea6\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u6e29\\u5ea6\\u76d1\\u63a7\') != -1\\" name=\\"temperatureMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"temperatureRef\\" size=\\"mini\\" >\\n              <el-form-item label=\\"\\u5f00\\u542f\\u76d1\\u63a7\\uff1a\\">\\n                <el-switch\\n                  @change=\\"handelTemperatureSwitch\\"\\n                  v-model=\\"temperatureSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"temperatureSwitch\\" label=\\"\\u9608\\u503c\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"temperatureValue\\"\\n                    :min=\\"1\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u9608\\u503c\\">\\n                  </el-input-number> \\u6444\\u6c0f\\u5ea6\\n                </el-col>\\n              </el-form-item>\\n              <el-form-item v-if=\\"temperatureSwitch\\" label=\\"\\u76d1\\u63a7\\u95f4\\u9694\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"temperatureInterval\\"\\n                    :min=\\"30\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694, \\u6700\\u5c0f\\u503c30\\">\\n                  </el-input-number> \\u79d2\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setTemperatureMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n\\n          <el-tab-pane label=\\"\\u7535\\u6e90\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u7535\\u6e90\\u76d1\\u63a7\') != -1\\" name=\\"powerMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"powerRef\\" size=\\"mini\\" >\\n              <el-form-item label=\\"\\u5f00\\u542f\\u76d1\\u63a7\\uff1a\\">\\n                <el-switch\\n                  @change=\\"handelPowerSwitch\\"\\n                  v-model=\\"powerSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"powerSwitch\\" label=\\"\\u76d1\\u63a7\\u95f4\\u9694\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"powerInterval\\"\\n                    :min=\\"30\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694, \\u6700\\u5c0f\\u503c30\\">\\n                  </el-input-number> \\u79d2\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setPowerMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n\\n          <el-tab-pane label=\\"\\u7f51\\u7edc\\u72b6\\u6001\\" v-if=\\"checkList.indexOf(\'\\u7f51\\u7edc\\u72b6\\u6001\') != -1\\" name=\\"disNetworkMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"disNetworkRef\\" size=\\"mini\\" >\\n              <el-form-item label=\\"\\u5f00\\u542f\\u76d1\\u63a7\\uff1a\\">\\n                <el-switch \\n                  @change=\\"handelDisNetworkSwitch\\"\\n                  v-model=\\"disNetworkSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"disNetworkSwitch\\" label=\\"\\u76d1\\u63a7\\u95f4\\u9694\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"disNetworkInterval\\"\\n                    :min=\\"30\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694, \\u6700\\u5c0f\\u503c30\\">\\n                  </el-input-number> \\u79d2\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setDisNetworkMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n\\n          <el-tab-pane label=\\"GPU\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'GPU\\u76d1\\u63a7\') != -1\\" name=\\"gpuMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"gpuRef\\" size=\\"mini\\" >\\n              <el-form-item label=\\"\\u5f00\\u542f\\u76d1\\u63a7\\uff1a\\">\\n                <el-switch \\n                  @change=\\"handelGpuSwitch\\"\\n                  v-model=\\"gpuSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"gpuSwitch\\" label=\\"\\u76d1\\u63a7\\u95f4\\u9694\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"gpuInterval\\"\\n                    :min=\\"30\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694, \\u6700\\u5c0f\\u503c30\\">\\n                  </el-input-number> \\u79d2\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setGpuMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n\\n          <el-tab-pane label=\\"\\u4e3b\\u63a7/\\u5b50\\u7cfb\\u7edf\\u7f51\\u7edc\\u3001pcie\\u72b6\\u6001\\" v-if=\\"checkList.indexOf(\'\\u4e3b\\u63a7/\\u5b50\\u7cfb\\u7edf\\u7f51\\u7edc\\u3001pcie\\u72b6\\u6001\') != -1\\" name=\\"systemNetworkMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"systemNetworkRef\\" size=\\"mini\\" >\\n              <el-form-item label=\\"\\u5f00\\u542f\\u76d1\\u63a7\\uff1a\\">\\n                <el-switch \\n                  @change=\\"handelSystemNetworkSwitch\\"\\n                  v-model=\\"systemNetworkSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"systemNetworkSwitch\\" label=\\"\\u76d1\\u63a7\\u95f4\\u9694\\uff1a\\">              \\n                <el-col :span=\\"20\\" >\\n                  <el-input-number \\n                    style=\\"width:200px;\\"\\n                    v-model=\\"systemNetworkInterval\\"\\n                    :min=\\"30\\"\\n                    label=\\"\\u8bf7\\u8f93\\u5165\\u76d1\\u63a7\\u95f4\\u9694, \\u6700\\u5c0f\\u503c30\\">\\n                  </el-input-number> \\u79d2\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"setSystemNetworkMonitor\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n\\n          <el-tab-pane label=\\"\\u4e32\\u53e3\\u65e5\\u5fd7\\u76d1\\u63a7\\" v-if=\\"checkList.indexOf(\'\\u4e32\\u53e3\\u65e5\\u5fd7\\u76d1\\u63a7\') != -1\\" name=\\"logMonitor\\">\\n            <el-form   :label-position=\\"labelPosition\\" label-width=\\"118px\\" ref=\\"logref\\"   size=\\"mini\\" >\\n              <el-form-item label=\\"\\u8bb0\\u5f55\\u65e5\\u5fd7\\uff1a\\">\\n                <el-switch\\n                  @change=\\"handelSwitch\\"\\n                  v-model=\\"logSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"logSwitch\\" label=\\"\\u5b9e\\u65f6\\u90ae\\u4ef6\\uff1a\\">\\n                <el-switch\\n                  \\n                  v-model=\\"notifyImmediately\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"logSwitch\\" label=\\"\\u76d1\\u63a7\\u5173\\u952e\\u5b57\\uff1a\\">\\n                <el-col :span=\\"20\\" >\\n                  <el-select \\n                    style=\\"width: 70%;\\"\\n                    v-model=\\"keyword\\" \\n                    size=\\"small\\"\\n                    remote default-first-option multiple filterable allow-create\\n                    placeholder=\\"\\u8bf7\\u8bbe\\u7f6e\\u5173\\u952e\\u5b57\\">\\n                  </el-select>\\n                  <el-tooltip class=\\"item\\" effect=\\"dark\\" content=\\"\\u5f53\\u6240\\u8bbe\\u7f6e\\u7684\\u5173\\u952e\\u5b57\\u5728\\u8bbe\\u5907\\u4e32\\u53e3\\u65e5\\u5fd7\\u4e2d\\u51fa\\u73b0\\u540e\\uff0c\\u7cfb\\u7edf\\u4f1a\\u81ea\\u52a8\\u63a8\\u9001\\u544a\\u8b66\\u90ae\\u4ef6\\u7ed9\\u7528\\u6237\\" placement=\\"top-start\\">\\n                    <i class=\\"el-icon-question\\" style=\'color:#e6a23c;margin-left:5px;\'></i>  \\n                  </el-tooltip>\\n                  <el-button size=\\"small\\" style=\\"margin-left:10px\\"\\n                    @click=\\"viewKeys\\">\\n                    \\u9009\\u62e9\\u5173\\u952e\\u5b57\\n                  </el-button>\\n                  <el-button size=\\"small\\" style=\\"margin-left:10px\\"\\n                    @click=\\"deleteLogKeys\\">\\n                    \\u6e05\\u7a7a\\u5173\\u952e\\u5b57\\n                  </el-button>\\n                </el-col>\\n              </el-form-item>\\n            </el-form>\\n            <div  v-if=\\"logSwitch\\">\\n              <el-table\\n                height=\\"48\\"\\n                style=\\"width: 100%;\\">\\n                <el-table-column width=\\"150\\" label=\\"\\u5173\\u952e\\u5b57\\" :render-header=\\"renderHeader\\"></el-table-column>\\n                <el-table-column width=\\"328\\" label=\\"\\u6267\\u884c\\u547d\\u4ee4\\" :render-header=\\"renderHeaderCmd\\"></el-table-column>\\n                <el-table-column label=\\"\\u6267\\u884c\\u6b21\\u6570\\"></el-table-column>\\n                <el-table-column label=\\"\\u95f4\\u9694\\u65f6\\u95f4(\\u79d2)\\"></el-table-column>\\n                <el-table-column label=\\"\\u64cd\\u4f5c\\" width=\\"50\\"></el-table-column >\\n              </el-table>\\n              <el-table\\n                :show-header=\\"false\\"\\n                :data=\\"cmdsItem\\"\\n                :span-method=\\"objectSpanMethod\\"\\n                style=\\"width: 100%\\">\\n                <el-table-column width=\\"150\\" prop=\\"keyword\\"  label=\\"\\u5173\\u952e\\u5b57\\">\\n                  <template slot-scope=\\"scope\\"  >\\n                    <el-select  clearable v-model=\\"scope.row.keyword\\" placeholder=\\"\\u8bf7\\u9009\\u62e9\\">\\n                      <el-option :key=\\"i\\" :label=\\"item\\" :value=\\"item\\" v-for=\\"(item,i) in keyword\\"></el-option>\\n                    </el-select>\\n                  </template>\\n                </el-table-column>\\n                <el-table-column width=\\"328\\" prop=\\"cmd\\"  label=\\"\\u6267\\u884c\\u547d\\u4ee4\\">\\n                  <template slot-scope=\\"scope\\">\\n                    <div  class=\\"cmd-select\\">\\n                    <el-select\\n                        v-model=\\"scope.row.cmd\\" \\n                        size=\\"mini\\"\\n                        remote default-first-option multiple filterable allow-create\\n                        placeholder=\\"\\u8bf7\\u8bbe\\u7f6e\\u547d\\u4ee4\\">\\n                    </el-select>\\n                    </div>\\n                  </template>\\n                </el-table-column>\\n                <el-table-column   prop=\\"count\\"  label=\\"\\u6267\\u884c\\u6b21\\u6570\\">\\n                  <template slot-scope=\\"scope\\" >\\n                    <el-input-number  :min=\\"1\\"  :controls=\\"false\\"\\n                        v-model=\\"scope.row.count\\" placeholder=\\"\\u6267\\u884c\\u6b21\\u6570(>0)\\">\\n                    </el-input-number>\\n                  </template>\\n                </el-table-column>\\n                <el-table-column  prop=\\"interval\\" label=\\"\\u95f4\\u9694\\u65f6\\u95f4(\\u79d2)\\">\\n                  <template slot-scope=\\"scope\\" >\\n                    <el-input-number  :min=\\"1\\"  :controls=\\"false\\"\\n                        v-model=\\"scope.row.interval\\" placeholder=\\"\\u89e6\\u53d1\\u65f6\\u95f4(>0)\\">\\n                    </el-input-number>\\n                  </template>\\n                </el-table-column>\\n                <el-table-column label=\\"\\u64cd\\u4f5c\\" width=\\"70\\">\\n                <template slot-scope=\\"scope\\" >\\n                  <a-icon type=\\"plus-circle\\"\\n                      theme=\\"twoTone\\"\\n                      twoToneColor=\\"#3598dc\\"\\n                      style=\\"font-size: 20px;cursor: pointer;\\"\\n                      @click=\\"addCmdData(scope)\\"\\n                    />\\n                   <a-icon type=\\"minus-circle\\" v-if=\\"cmdsItem.length>1\\"\\n                    theme=\\"twoTone\\"\\n                    twoToneColor=\\"#f56c6c\\"\\n                    style=\\"font-size: 20px;cursor: pointer;\\"\\n                    @click=\\"deleteCmdData(scope.$index)\\"\\n                   />\\n                </template>\\n                </el-table-column >\\n              </el-table>\\n              <div style=\\"text-align: center;margin-top: 5px;\\">\\n              <a-icon type=\\"plus-circle\\"\\n                      theme=\\"twoTone\\"\\n                      twoToneColor=\\"#3598dc\\"\\n                      style=\\"font-size: 30px;cursor: pointer;\\"\\n                      @click=\\"addCmdDataNew\\"\\n                    />\\n              </div>\\n            </div>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"saveChanelLog\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n          <el-tab-pane label=\\"\\u8fdc\\u7a0b\\u65e5\\u5fd7\\"  v-if=\\"checkList.indexOf(\'\\u8fdc\\u7a0b\\u65e5\\u5fd7\') != -1\\" name=\\"remoteMonitor\\">\\n            <el-form   label-position=\\"right\\" label-width=\\"118px\\" ref=\\"remoteMonitor\\"   size=\\"mini\\" >\\n              <el-form-item label=\\"\\u8fdc\\u7a0b\\u65e5\\u5fd7\\uff1a\\">\\n                <el-switch\\n                  v-model=\\"sysLogSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n               <el-form-item v-if=\\"sysLogSwitch\\" label=\\"\\u5173\\u952e\\u5b57\\uff1a\\">\\n                <el-select \\n                    style=\\"width: 70%;\\"\\n                    v-model=\\"sysLogKeyword\\" \\n                    size=\\"small\\"\\n                    remote default-first-option multiple filterable allow-create\\n                    placeholder=\\"\\u8bf7\\u8bbe\\u7f6e\\u5173\\u952e\\u5b57\\">\\n                </el-select>\\n                <el-button size=\\"small\\" style=\\"margin-left:10px\\"\\n                  @click=\\"viewKeys\\">\\n                  \\u9009\\u62e9\\u5173\\u952e\\u5b57\\n                </el-button>\\n                <el-button size=\\"small\\" style=\\"margin-left:10px\\"\\n                  @click=\\"deleteRemoteKeys\\">\\n                  \\u6e05\\u7a7a\\u5173\\u952e\\u5b57\\n                </el-button>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"saveRemotesLog\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n          <el-tab-pane label=\\"\\u7cfb\\u7edf\\u65e5\\u5fd7\\"  v-if=\\"checkList.indexOf(\'\\u7cfb\\u7edf\\u65e5\\u5fd7\') != -1\\" name=\\"sysLogMonitor\\">\\n            <el-form   label-position=\\"right\\" label-width=\\"118px\\" ref=\\"sysMonitor\\"   size=\\"mini\\" >\\n             <el-form-item label=\\"\\u7cfb\\u7edf\\u65e5\\u5fd7\\uff1a\\">\\n                <el-switch\\n                  v-model=\\"mtlogSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"mtlogSwitch\\" label=\\"\\u65e5\\u5fd7\\u76ee\\u5f55\\uff1a\\">\\n                <el-input v-model=\\"mtlogPath\\" size=\\"small\\" style=\\"width: 70%;\\"></el-input>\\n              </el-form-item>\\n              <el-form-item v-if=\\"mtlogSwitch\\" label=\\"\\u65e5\\u5fd7\\u5173\\u952e\\u5b57\\uff1a\\">\\n                <el-select \\n                    style=\\"width: 70%;\\"\\n                    v-model=\\"mtkeyword\\" \\n                    size=\\"small\\"\\n                    remote default-first-option multiple filterable allow-create\\n                    placeholder=\\"\\u8bf7\\u8bbe\\u7f6e\\u5173\\u952e\\u5b57\\">\\n                  </el-select>\\n                <el-button size=\\"small\\" style=\\"margin-left:10px\\"\\n                  @click=\\"viewKeys\\">\\n                  \\u9009\\u62e9\\u5173\\u952e\\u5b57\\n                </el-button>\\n                <el-button size=\\"small\\" style=\\"margin-left:10px\\"\\n                  @click=\\"deleteSystemKeys\\">\\n                  \\u6e05\\u7a7a\\u5173\\u952e\\u5b57\\n                </el-button>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"saveSystemLog\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n          <el-tab-pane label=\\"core\\u6587\\u4ef6\\"  v-if=\\"checkList.indexOf(\'core\\u6587\\u4ef6\') != -1\\" name=\\"coreMonitor\\">\\n            <el-form   :model=\\"coreForm\\" label-position=\\"right\\" label-width=\\"118px\\" ref=\\"coreMonitor\\"   size=\\"mini\\" >\\n              <el-form-item label=\\"core\\u6587\\u4ef6\\uff1a\\">\\n                <el-switch\\n                  v-model=\\"coreForm.coreLogSwitch\\"\\n                  >\\n                </el-switch>\\n              </el-form-item>\\n              <el-form-item v-if=\\"coreForm.coreLogSwitch\\" label=\\"core\\u6587\\u4ef6\\u8def\\u5f84\\uff1a\\">\\n                <el-input v-model=\\"coreForm.corelogPath\\" size=\\"small\\" style=\\"width: 70%;\\"></el-input>\\n              </el-form-item>\\n              <el-form-item v-if=\\"coreForm.coreLogSwitch\\" label=\\"\\u76f8\\u5173\\u8054\\u6587\\u4ef6\\uff1a\\">\\n                  <div  v-if=\\"coreForm.coreLogSwitch\\">\\n                    <el-table\\n                      height=\\"48\\"\\n                      style=\\"width: 100%;\\">\\n                      <el-table-column label=\\"\\u5f02\\u5e38\\u6587\\u4ef6\\u76ee\\u5f55\\"></el-table-column>\\n                      <el-table-column label=\\"\\u5339\\u914d\\u6587\\u4ef6\\u540d\\"></el-table-column>\\n                      <el-table-column label=\\"\\u64cd\\u4f5c\\" width=\\"80\\"></el-table-column >\\n                    </el-table>\\n                    <el-table\\n                      :show-header=\\"false\\"\\n                      :data=\\"coreForm.coreItems\\"\\n                      style=\\"width: 100%\\">\\n                      <el-table-column  prop=\\"path\\"  label=\\"\\u5f02\\u5e38\\u6587\\u4ef6\\u76ee\\u5f55\\">\\n                        <template slot-scope=\\"scope\\"  >\\n                          <el-input v-model=\\"scope.row.path\\" size=\\"small\\" style=\\"width: 90%;\\"></el-input>\\n                        </template>\\n                      </el-table-column>\\n                      <el-table-column  prop=\\"keywords\\"  label=\\"\\u5339\\u914d\\u6587\\u4ef6\\u540d\\">\\n                        <template slot-scope=\\"scope\\"  >\\n                          <el-select \\n                              style=\\"width: 90%;\\"\\n                              v-model=\\"scope.row.keywords\\" \\n                              size=\\"small\\"\\n                              remote default-first-option multiple filterable allow-create\\n                              placeholder=\\"\\u8bf7\\u8bbe\\u7f6e\\u76f8\\u5173\\u5339\\u914d\\u6587\\u4ef6\\u540d\\">\\n                          </el-select>\\n                        </template>\\n                      </el-table-column>\\n                      <el-table-column label=\\"\\u64cd\\u4f5c\\" width=\\"80\\">\\n                        <template slot-scope=\\"scope\\" >\\n                          <a-icon type=\\"plus-circle\\"\\n                            theme=\\"twoTone\\"\\n                            twoToneColor=\\"#3598dc\\"\\n                            style=\\"font-size: 20px;cursor: pointer;\\"\\n                            @click=\\"addCoreItem\\"\\n                          />\\n                          <a-icon type=\\"minus-circle\\" v-if=\\"coreForm.coreItems.length>1\\"\\n                            theme=\\"twoTone\\"\\n                            twoToneColor=\\"#f56c6c\\"\\n                            style=\\"font-size: 20px;cursor: pointer;\\"\\n                            @click=\\"deleteCoreItem(scope.$index)\\"\\n                          />\\n                        </template>\\n                      </el-table-column >\\n                    </el-table>\\n                  </div>\\n              </el-form-item>\\n            </el-form>\\n            <div class=\\"save-container\\">\\n              <el-button title=\\"\\u4fdd\\u5b58\\u5f53\\u524d\\u9875\\u914d\\u7f6e\\" type=\\"danger\\" @click=\\"saveCoreLog\\">\\u4fdd \\u5b58</el-button>\\n            </div>\\n          </el-tab-pane>\\n        </el-tabs>\\n      </el-row>\\n      <el-row \\n        v-show=\\"isViewKeyDialogShow\\">\\n        <view-keywords\\n        :viewKeywordsList=\\"viewKeywordsList\\"\\n        :alreadyKeyword=\\"keyword\\"\\n        :isViewKeyDialogShow=\\"isViewKeyDialogShow\\"\\n        @listenToChildEvent=\\"setKeywordsFromSelect\\">\\n        </view-keywords>\\n      </el-row>\\n      <div v-if=\\"isViewKeyDialogShow\\" slot=\\"footer\\" class=\\"dialog-footer\\">\\n        <el-divider></el-divider>\\n        <el-button @click=\\"closeViewKeywordsDialog\\">\\u8fd4 \\u56de</el-button>\\n        <el-button type=\\"danger\\" @click=\\"setKeywords\\">\\u786e \\u5b9a</el-button>\\n        <el-button type=\\"danger\\" @click=\\"addKeyword\\">\\u6dfb\\u52a0\\u5173\\u952e\\u5b57</el-button>\\n        <execute-list-dialog ref=\\"executeList\\" :activeName=\\"activeName\\"></execute-list-dialog>\\n      </div>\\n      <div v-else slot=\\"footer\\" class=\\"dialog-footer\\">\\n        <el-divider></el-divider>\\n        <el-button @click=\\"closeMonitorDialog\\" class=\\"monitor-close\\">\\u5173 \\u95ed</el-button>\\n      </div>\\n      </div>\\n    </el-dialog>\\n    \\n  </span>\\n</template>\\n<script>\\nimport api from \'@/api\';\\nimport { mapGetters  } from \'vuex\'\\nimport UserSelectForm from \'@/components/common/userSelectForm\'\\nimport axios from \'axios\'\\nimport util from \'@/util\';\\nimport log from \'../../util/util.log\';\\nimport viewKeywords from \\"@/components/dialog/viewKeywords\\";\\nimport executeListDialog from \'@/components/dialog/executeListDialog\';\\n\\nexport default {\\n  name: \'ProductMonitor\',\\n  props:[\'type\',\'productData\', \'sourceType\'],\\n  computed: {\\n    ...mapGetters([\'userInfo\',\'testObjSelDataList\'])\\n  },\\n  components: {\\n    UserSelectForm,\\n    viewKeywords,\\n    executeListDialog\\n  },\\n  data(){\\n  \\treturn{\\n      checkList: [],\\n      allCheckList: [\\"\\u57fa\\u672c\\u76d1\\u63a7\\", \\"\\u5b9e\\u65f6\\u76d1\\u63a7\\", \\"\\u5185\\u5b58\\u6cc4\\u6f0f\\u76d1\\u63a7\\", \\"\\u8fdb\\u7a0b\\u76d1\\u63a7\\", \\"\\u98ce\\u6247\\u76d1\\u63a7\\",\\"\\u6e29\\u5ea6\\u76d1\\u63a7\\",\\"\\u7535\\u6e90\\u76d1\\u63a7\\",\\"\\u7f51\\u7edc\\u72b6\\u6001\\",\\"GPU\\u76d1\\u63a7\\",\\"\\u4e3b\\u63a7/\\u5b50\\u7cfb\\u7edf\\u7f51\\u7edc\\u3001pcie\\u72b6\\u6001\\",\\"\\u4e32\\u53e3\\u65e5\\u5fd7\\u76d1\\u63a7\\",\\"\\u8fdc\\u7a0b\\u65e5\\u5fd7\\",\\"\\u7cfb\\u7edf\\u65e5\\u5fd7\\",\\"core\\u6587\\u4ef6\\"],\\n      email_list:[],\\n      email_list_map:{},\\n      deviceOptions:[\'C20N\',\'B21\'],\\n      monitorActiveName:\'basicMonitor\',\\n      monitorSetModel:false,\\n      KeyWorldsBox:false,\\n      logData:{\\n        keyword:[],\\n        cmd:[]\\n      },\\n      monitorData:[],\\n      timeMonitorData:[],\\n      outOfMemData:[],\\n      loading:false,\\n      peojectId:this.$route.params.id,\\n      peojectUrl:process.env.KR_LINK,\\n      logSwitch:false,\\n      processSwitch: false,\\n      processNames: [],\\n      processInterval: 600,\\n      fanSwitch: false,\\n      fanInterval: 600,\\n      temperatureSwitch: false,\\n      temperatureValue: 90,\\n      temperatureInterval: 600,\\n      powerSwitch: false,\\n      powerInterval: 600,\\n      disNetworkSwitch: false,\\n      disNetworkInterval: 600,\\n      gpuSwitch: false,\\n      gpuInterval: 600,\\n      systemNetworkSwitch: false,\\n      systemNetworkInterval: 600,\\n      syncConfigSwitch: false,\\n      syncNeedData: [],\\n      syncBindValue: \'\',\\n      configLoading: false,\\n      configLoadingText: \\"\\u6b63\\u5728\\u83b7\\u53d6\\u60a8\\u7ba1\\u7406\\u548c\\u53c2\\u4e0e\\u7684\\u6b63\\u5728\\u8fdb\\u884c\\u4e2d\\u7684\\u9879\\u76ee\\u4e2d\\u7684\\u6240\\u6709\\u8bbe\\u5907\\uff0c\\u8bf7\\u7a0d\\u540e\\uff01\\",\\n      isViewKeyDialogShow: false,\\n      viewKeywordsList: [],\\n      isSentOffApi:null,\\n      keyword: [],\\n      selectKeyword: [],\\n      labelPosition:\'left\',\\n      monitorTitle: \\"\\u6279\\u91cf\\u76d1\\u63a7\\u914d\\u7f6e\\",\\n      batchFlag: true,\\n      showKeyRow: false,\\n      tableHerder:[\'\\u5173\\u952e\\u5b57\',\'\\u547d\\u4ee4\',\'\\u6267\\u884c\\u6b21\\u6570\',\'\\u95f4\\u9694\\u65f6\\u95f4(\\u79d2)\'],\\n      cmdsItem:[\\n            {\\n              keyword:\'\',\\n              cmd:[],\\n              count:\'\',\\n              interval:\'\',\\n            }\\n      ],\\n      spanArr:[],\\n      contentSpanArr:[],\\n      pos:0,\\n      position:0,\\n      activeName:\\"second\\",\\n      mtlogSwitch:false,\\n      mtkeyword:[],\\n      mtlogPath:\'\',\\n      labelPosition:\'right\',\\n      sysLogSwitch:false,\\n      sysLogKeyword:[],\\n      coreForm:{\\n        coreLogSwitch:false,\\n        corelogPath:\'\',\\n        coreItems:[{\\n          keywords:\'\',\\n          path:\'\',\\n        }],\\n      },\\n      notifyImmediately:false\\n  \\t}\\n  },\\n  methods:{\\n    objectSpanMethod({ row, column, rowIndex, columnIndex }) {\\n      if(this.contentSpanArr.length==0){\\n        return\\n      }\\n      if (columnIndex === 0) {\\n        const _row = this.contentSpanArr[rowIndex];\\n        const _col = _row > 0 ? 1 : 0;\\n        return {\\n          rowspan: _row,\\n          colspan: _col\\n        };\\n      }\\n    },\\n\\n    addCmdData(scope){\\n      let cmdsItem = [...this.cmdsItem]\\n      let ix = scope.$index\\n      let keyword = scope.row.keyword\\n      cmdsItem.splice(ix+1,0,{\\n          keyword:keyword,\\n          cmd:\'\',\\n          count:\'\',\\n          interval:\'60\',\\n      })\\n      for(let i = ix;i >= 0; i--){\\n        if(this.contentSpanArr[i]>0){\\n          this.position = i\\n          break\\n        }\\n      }\\n      if(this.contentSpanArr[this.position]){\\n        this.contentSpanArr[this.position] += 1;\\n        this.contentSpanArr.splice(ix+1,0,0)\\n      }else{\\n        // \\u7b2c0\\u884c\\n        this.contentSpanArr[this.position] = 1\\n        this.contentSpanArr[this.position] += 1;\\n        this.contentSpanArr.splice(ix+1,0,0)\\n\\n      }\\n      this.cmdsItem = [...cmdsItem]\\n      \\n\\n    },\\n\\n    addCmdDataNew(){\\n      let cmdsItem = [...this.cmdsItem]\\n      cmdsItem.push({\\n          keyword:\'\',\\n          cmd:\'\',\\n          count:\'\',\\n          interval:\'60\',\\n      })\\n      this.position = this.cmdsItem.length\\n      this.contentSpanArr[this.position] = 1\\n      this.cmdsItem = [...cmdsItem]\\n    },\\n\\n    viewKeys(){\\n      this.viewKeywordsList = []\\n      let creator = this.userInfo.loginName\\n      api.logApi.getKeyword(creator).then(res=>{\\n        if(res.success){\\n          this.isViewKeyDialogShow = true\\n          // this.monitorSetModel = false\\n          for (let i in res.data){\\n            this.viewKeywordsList.push({\\n              _id: res.data[i]._id,\\n              name: res.data[i].name,\\n              describtion: res.data[i].describtion,\\n              product_line: res.data[i].product_line\\n            })\\n          }\\n        }else{\\n          this.$message.error(\\"\\u67e5\\u770b\\u5173\\u952e\\u5b57\\u5931\\u8d25: \\", res.msg)\\n        }\\n      })\\n    },\\n\\n    deleteLogKeys(){\\n      this.keyword = []\\n    },\\n\\n    deleteRemoteKeys(){\\n      this.sysLogKeyword = []\\n    },\\n\\n    deleteSystemKeys(){\\n      this.mtkeyword = []\\n    },\\n\\n    handelProcessSwitch(){\\n\\n    },\\n\\n    handelFanSwitch(){\\n\\n    },\\n    handelTemperatureSwitch(){\\n\\n    },\\n    handelPowerSwitch(){\\n\\n    },\\n    handelDisNetworkSwitch(){\\n\\n    },\\n    handelGpuSwitch(){\\n\\n    },\\n    handelSystemNetworkSwitch(){\\n\\n    },\\n    deleteProcess(){\\n      this.processNames = []\\n    },\\n\\n    closeViewKeywordsDialog(){\\n      this.selectKeyword = []\\n      this.isViewKeyDialogShow = false\\n    },\\n\\n    setKeywords(){\\n      this.isViewKeyDialogShow = false\\n\\n      for (let i in this.selectKeyword){\\n        if (!this.keyword.includes(this.selectKeyword[i])){\\n          if (this.monitorActiveName == \'logMonitor\'){\\n            this.keyword.push(this.selectKeyword[i])\\n          } else if (this.monitorActiveName == \'sysLogMonitor\'){\\n            this.mtkeyword.push(this.selectKeyword[i]) \\n          } else {\\n            this.sysLogKeyword.push(this.selectKeyword[i])  \\n          }\\n        }\\n      }\\n\\n      // this.keyword.push.apply(this.keyword, this.selectKeyword)\\n      this.selectKeyword = []\\n    },\\n\\n    showKeywordsDialog(){\\n      this.isViewKeyDialogShow = true\\n    },\\n\\n    setKeywordsFromSelect(data){\\n      for (let i in data){\\n        this.selectKeyword.push(data[i].name)\\n      }\\n    },\\n\\n    deleteCmdData(index){\\n      let cmdsItem = [...this.cmdsItem]\\n      let contentSpanArr = [...this.contentSpanArr]\\n      cmdsItem.splice(index, 1);\\n      if(contentSpanArr[index]==1){\\n        contentSpanArr.splice(index, 1)\\n        this.contentSpanArr = [...contentSpanArr]\\n        this.cmdsItem = [...cmdsItem]\\n        return\\n      }\\n      if(contentSpanArr[index]==0){\\n        for(let i = index;i >= 0; i--){\\n          if(contentSpanArr[i]>0){\\n            // \\u5408\\u5e76\\u884c\\u6570\\u51cf\\u6389\\u540e\\u518d\\u5220\\u9664\\u6807\\u8bb0\\n            contentSpanArr[i] -= 1;\\n            contentSpanArr.splice(index, 1)\\n            break\\n          }\\n        }\\n        this.contentSpanArr = [...contentSpanArr]\\n        this.cmdsItem = [...cmdsItem]\\n        return\\n\\n      }\\n      if(contentSpanArr[index]>1){\\n        contentSpanArr[index] = contentSpanArr[index]-1\\n        contentSpanArr[index+1] = contentSpanArr[index]\\n        contentSpanArr.splice(index, 1)\\n        this.contentSpanArr = [...contentSpanArr]\\n        this.cmdsItem = [...cmdsItem]\\n        return\\n      }\\n\\n    },\\n\\n    handelTypeChange(e){\\n    },\\n\\n    handelSwitch(e){\\n    },\\n\\n    handelSyncConfigSwitch(e){\\n      this.syncConfigSwitch = e\\n    },\\n\\n    getDeviceMonitorConfig(){\\n      this.getConfigMonitor(this.syncBindValue, true)\\n    },\\n\\n    dealDatas(data){\\n      let testObjectDatas = [];\\n      if (data && data.length) {\\n        for (const d of data) {\\n          let rtbv = {};\\n          const { value } = d;\\n          Object.assign(rtbv, d);\\n          if (value && value.length && util.isJSON(value)){\\n            const row = JSON.parse(value);\\n            for (const tbv of row) {\\n              if (tbv.key !== \'name\') {\\n                rtbv[tbv.key] = tbv.value;\\n              }\\n            }\\n          }\\n          testObjectDatas.push(rtbv);\\n        }\\n      }\\n      this.syncNeedData = testObjectDatas\\n    },\\n\\n    getSyncNeedData(isVisible){\\n      if (isVisible){\\n        this.configLoading = true\\n        this.syncNeedData = []\\n        api.stDevice.getDeviceInfoList(this.userInfo.name).then(data=>{\\n          this.dealDatas(data)\\n        })\\n        this.configLoading = false\\n      }\\n    },\\n\\n    handleTabClick(e, isSyncFlag){\\n      let stId = \\"\\"\\n      let tlabId = \\"\\"\\n      if (!isSyncFlag) {\\n        if (this.testObjSelDataList.length > 1){\\n          return\\n        }\\n        stId = this.productData.id\\n        tlabId = this.productData.tlabTestObjectId\\n      } else {\\n        stId = this.syncBindValue.id\\n        tlabId = this.syncBindValue.tlabTestObjectId\\n      }\\n\\n      if(e[\'name\']==\\"logMonitor\\"){\\n        api.labApi.getLogCfg(stId, tlabId).then(res=>{\\n          if(res.success){\\n            let data = res.data\\n            if(data.state==\'on\'){\\n              this.isSentOffApi = true\\n              this.logSwitch = true\\n            }else{\\n              this.isSentOffApi = false\\n              this.logSwitch = false\\n              return         \\n            }\\n            if(data.hasOwnProperty(\'notifyImmediately\')){\\n              this.notifyImmediately = data.notifyImmediately\\n            }\\n            this.keyword = data.keyword\\n            let cmdsItem = data.project_info.cmdsItem\\n            let contentSpanArr = data.project_info.contentSpanArr\\n            if(contentSpanArr&&cmdsItem){\\n              if(contentSpanArr[0]==null||contentSpanArr.length!=cmdsItem.length){\\n                contentSpanArr = []\\n                for(let i in cmdsItem){\\n                  contentSpanArr.push(1)\\n                }\\n              }\\n              this.$nextTick(()=>{\\n                this.contentSpanArr = contentSpanArr\\n              })\\n            }\\n            // \\u5904\\u7406\\u4e4b\\u524d\\u6ca1\\u6709\\u5408\\u5e76\\u7684\\u65e7\\u4efb\\u52a1\\n            if(!contentSpanArr&&cmdsItem){\\n              contentSpanArr = []\\n              for(let i in cmdsItem){\\n                contentSpanArr.push(1)\\n              }\\n              this.$nextTick(()=>{\\n                this.contentSpanArr = contentSpanArr\\n              })\\n            }\\n\\n            if(cmdsItem){\\n              this.$nextTick(()=>{\\n                this.cmdsItem = [...cmdsItem]\\n              })\\n            }\\n\\n          }\\n        })\\n      }\\n    },\\n\\n    runAllApi(apiData,bdata,logData){\\n      axios.all(apiData).then(axios.spread((res1,res2,res3)=>{\\n        this.monitorSetModel = false\\n        if(res1.success&&res2.success&&res3.success){\\n          this.$message.info(\'\\u914d\\u7f6e\\u4e0b\\u53d1\\u6210\\u529f\\uff0c\\u8bf7\\u7a0d\\u540e\\u5728\\u4efb\\u52a1\\u7ba1\\u7406\\u4e2d\\u5fc3\\u67e5\\u770b\\u7ed3\\u679c\');\\n        }\\n        if(!res1.success||!res2.success||!res3.success){\\n          if(!res1.success){\\n            this.$message.error(res1.msg)\\n          }\\n          if(!res2.success){\\n            this.$message.error(res2.msg)\\n          }\\n          if(!res3.success){\\n            this.$message.error(res3.msg)\\n          }\\n        }\\n        if(!res1.success&&!res2.success&&!res3.success){\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u76d1\\u63a7\\u5931\\u8d25\')\\n        }\\n      })).catch(err=>{\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u76d1\\u63a7\\u5931\\u8d25\')   \\n      })\\n    },\\n\\n    runTwoApi(apiData,bdata,logData){\\n      axios.all(apiData).then(axios.spread((res1,res2)=>{\\n        this.monitorSetModel = false\\n        if(res1.success&&res2.success){\\n          this.$message.info(\'\\u914d\\u7f6e\\u4e0b\\u53d1\\u6210\\u529f\\uff0c\\u8bf7\\u7a0d\\u540e\\u5728\\u4efb\\u52a1\\u7ba1\\u7406\\u4e2d\\u5fc3\\u67e5\\u770b\\u7ed3\\u679c\');\\n        }\\n        if(!res1.success||!res2.success){\\n          if(!res1.success){\\n            this.$message.error(res1.msg)\\n          }\\n          if(!res2.success){\\n            this.$message.error(res2.msg)\\n          }\\n        }\\n        if(!res1.success&&!res2.success){\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u76d1\\u63a7\\u5931\\u8d25\')\\n        }\\n      })).catch(err=>{\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u76d1\\u63a7\\u5931\\u8d25\')        \\n      })\\n    },\\n\\n    // \\u914d\\u7f6e\\u5355\\u4e2a\\u65e5\\u5fd7\\n    async setLogMonitor(){\\n      let logMonitorApi;\\n      let postData;\\n      let isOpen = this.logSwitch;\\n      let selectedItem = this.productData;\\n\\n      if(this.logSwitch){\\n        postData = this.initLogData(this.productData);\\n      } else {\\n        if(this.isSentOffApi) {\\n          postData = this.getTurnOffLogConfigItem(selectedItem);\\n        }else{\\n          logMonitorApi = Promise.resolve({\\n            data: {},\\n            msg: \\"\\u8bf7\\u6c42\\u6210\\u529f\\",\\n            success: true\\n          })\\n        }\\n      }\\n      if (typeof(logMonitorApi) == \'undefined\') {\\n        logMonitorApi = await this.insertLogTaskAndTriggerActuator(\\n          [postData],\\n          isOpen,\\n        );\\n      }\\n      return {logMonitorApi, postData}\\n    },\\n\\n    /**\\n     * \\u7ec4\\u88c5\\u7528\\u4e8e\\u5173\\u95ed\\u65e5\\u5fd7\\u7684\\u6570\\u636e\\n     * \\n     * @param {object} selectedItem \\u5f53\\u524d\\u9009\\u4e2d\\u5bf9\\u8c61\\n     * @return {object} \\u914d\\u7f6e\\u5bf9\\u8c61\\uff0c\\u7528\\u4e8e\\u53d1\\u7ed9Actuator\\n     */\\n    getTurnOffLogConfigItem(selectedItem) {\\n      return {\\n        requestor:\'st\',\\n        id: selectedItem.id,  // \\u8bbe\\u5907ID\\n        tlab_id: selectedItem.tlabTestObjectId,\\n        operator: this.userInfo.loginName,\\n        op: \'off\',\\n        device_name: selectedItem.name,\\n        ip: selectedItem.ip,\\n      }\\n    },\\n\\n    /**\\n     * \\u6279\\u91cflog\\u8bbe\\u7f6e\\uff0c\\u7ed3\\u679c\\u901a\\u8fc7Actuator\\u56de\\u8c03\\u63d2\\u5165\\u4efb\\u52a1\\u4e2d\\u5fc3\\n     */\\n    async setBatchLogMonitor(){\\n      let configItem;\\n      let isOpen = this.logSwitch;\\n      let actuatorBody = []\\n      let deviceData = {}\\n\\n      if (this.sourceType == \\"deviceList\\"){\\n        deviceData = this.dealDeviceData()\\n      } else {\\n        let cycleId = parseInt(this.$route.params.id)\\n        deviceData[cycleId] = this.testObjSelDataList\\n      }\\n      \\n      for (let key in deviceData){\\n        let kr_ids = []\\n        let logItems = []\\n        for (let i in deviceData[key]){\\n          kr_ids.push(deviceData[key][i].id)\\n          if (isOpen) { // \\u5f00\\u542f\\n            configItem = this.initLogData(deviceData[key][i]);\\n          } else{ // \\u5173\\u95ed\\n            configItem = this.getTurnOffLogConfigItem(deviceData[key][i]);\\n          }\\n          logItems.push(configItem)\\n        }\\n\\n        actuatorBody.push({\\n          cycle_id: key,\\n          kr_device_ids: kr_ids,\\n          action: isOpen? \\"on\\" : \\"off\\",\\n          username_cn: this.userInfo.name,\\n          log_items: logItems\\n        })\\n      }\\n\\n      let logMonitorApi;\\n      await api.labApi.updateBatchLogAndUpdateTask(isOpen, actuatorBody)\\n        .then(res => {\\n          logMonitorApi = res;\\n        })\\n        .catch(err => {\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u76d1\\u63a7\\u5931\\u8d25\\uff0c\\u8c03\\u7528Actuator\\u63a5\\u53e3\\u5f02\\u5e38\');\\n        });\\n      \\n      return logMonitorApi;\\n    },\\n\\n    /**\\n     * \\u7528\\u7ec4\\u88c5\\u597d\\u7684\\u65e5\\u5fd7\\u4efb\\u52a1\\u914d\\u7f6e\\u6570\\u636e\\u8c03\\u7528Actuator\\n     *\\n     * @param {array} items \\u914d\\u7f6e\\u9879\\uff0c\\u4f20\\u7ed9Actuator\\n     * @isOpen {bool} \\u5f00\\u542f/\\u5173\\u95ed\\n     */\\n    async insertLogTaskAndTriggerActuator(configItems, isOpen) {\\n      let logMonitorApi;\\n\\n      let actuatorBody = []\\n      if (this.sourceType == \\"deviceList\\"){\\n        actuatorBody.push({\\n          \\"cycle_id\\": this.testObjSelDataList[0].cycle.id,\\n          \\"kr_device_ids\\": [this.testObjSelDataList[0].id],\\n          \\"action\\": isOpen? \\"on\\" : \\"off\\",\\n          \\"username_cn\\": this.userInfo.name,\\n          \\"log_items\\": configItems\\n        })\\n      }else{\\n        actuatorBody.push({\\n          \\"cycle_id\\": parseInt(this.$route.params.id),\\n          \\"kr_device_ids\\": [this.testObjSelDataList[0].id],\\n          \\"action\\": isOpen? \\"on\\" : \\"off\\",\\n          \\"username_cn\\": this.userInfo.name,\\n          \\"log_items\\": configItems\\n        })\\n      }\\n\\n      await api.labApi.updateBatchLogAndUpdateTask(isOpen, actuatorBody)\\n        .then(res => {\\n          logMonitorApi = res;\\n        })\\n        .catch(err => {\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u76d1\\u63a7\\u5931\\u8d25\\uff0c\\u8c03\\u7528Actuator\\u63a5\\u53e3\\u5f02\\u5e38\');\\n        });\\n      return logMonitorApi;\\n    },\\n\\n    // \\u751f\\u6210\\u7528\\u4e8e\\u5f00\\u542f\\u65e5\\u5fd7\\u7684\\u6570\\u636e\\n    initLogData(productData) {\\n      let postData = {\\n        requestor:\'st\',\\n        notifyImmediately:this.notifyImmediately,\\n        operator: this.userInfo.loginName,\\n        tlab_id: productData.tlabTestObjectId,\\n        id: productData.id,\\n        keyword: this.keyword,\\n        device_name: productData.name,\\n        project_info: {\\n          id: productData.cycleId,\\n          email_list: this.email_list,\\n          url: this.peojectUrl + \\"cycleDetails/\\" + productData.cycleId\\n        },\\n        op: \\"on\\"\\n      };\\n      let cmd = [];\\n      let cmd2interval = [];\\n      let keyword2cmd = [];\\n      let keyListObj = {}\\n      for (let item of this.cmdsItem) {\\n        if(item.cmd.length>0){\\n          let key = item.keyword\\n          let keyListItem = keyListObj[key]||[]\\n          keyListItem.push({\\n            interval:item.interval,\\n            count:item.count,\\n            command:item.cmd.join(\'\\\\n\'),\\n          })\\n          Object.assign(keyListObj,{[key]:keyListItem})\\n        }\\n      \\n      }\\n      for(let k2 in keyListObj){\\n        let k2Item = {\\n          key_word:k2,\\n          cmds:keyListObj[k2]\\n        }\\n        keyword2cmd.push(k2Item)\\n      }\\n      Object.assign(postData, {keyword2cmd });\\n      Object.assign(postData.project_info, {cmdsItem:this.cmdsItem,contentSpanArr:this.contentSpanArr});\\n      return postData;\\n    },\\n\\n    getManager(value,userMap){\\n      this.email_list = [];\\n      this.email_list_map = {};\\n      if(value.length >0){\\n        for (var i = 0; i < value.length; i++) { \\n          this.email_list.push(userMap[value[i]])\\n          this.email_list_map[userMap[value[i]]] =value[i]\\n        }\\n      }\\n    },\\n    downMonitorLog(category){\\n      let data = {\\n        category,\\n        asset_id:this.productData.tlabTestObjectId\\n      }\\n      api.labApi\\n      .getDownloadUrl(data)\\n      .then(data => {\\n        var iframe =document.createElement(\\"iframe\\")\\n        iframe.style.display =\\"none\\";\\n        iframe.src = data;\\n        document.body.appendChild(iframe);\\n      })\\n    },\\n    dumpLink(type){\\n      let idArray = this.productData.tlabTestObjectId.split(\'-\');\\n      let moniUrl = \'\'\\n      if(type==\'monitor\'){\\n        moniUrl = `${\\n          api.labApi.labUrl\\n        }/resource/managed/#/monitor/${idArray[0]}/${idArray[1]}/${idArray[2]}?is_ontime=on`;\\n      }else{\\n        moniUrl = `${\\n          api.labApi.labUrl\\n        }/resource/managed/#/outOfMem/${idArray[0]}/${idArray[1]}/${idArray[2]}`;\\n      }\\n      window.open(moniUrl);\\n    },\\n    handelBasicOpenMonitor(ev, row) {\\n      row.is_send_email = ev;\\n    },\\n    // setKeyWorlds(){\\n    //   let monitorCopy = this.monitorData;\\n    //   for (let i = 0; i < monitorCopy.length; i++) {\\n    //     if(monitorCopy[i].category == \\"log\\"){\\n    //       monitorCopy[i].threshold = this.logData\\n    //     }\\n    //   }\\n    //   this.monitorData = [...monitorCopy];\\n    // },\\n\\n    async setBatchMonitor(){\\n      // \\u7ec4\\u88c5monitor\\u6570\\u636e\\n      let basicData = {}\\n      let timeData = {}\\n      let outOfMemData = {}\\n      if (this.checkList.indexOf(\'\\u57fa\\u672c\\u76d1\\u63a7\') != -1){\\n        basicData = {\\n                monitor_type: \'basic\',\\n                monitor_data: this.monitorData\\n              }\\n      }\\n      // if (this.checkList.indexOf(\'\\u5b9e\\u65f6\\u76d1\\u63a7\') != -1){\\n      //   timeData = {\\n      //     monitor_type: \'real_time\',\\n      //     monitor_data: this.timeMonitorData\\n      //   }\\n      // }\\n      // if (this.checkList.indexOf(\'\\u5185\\u5b58\\u6cc4\\u6f0f\\u76d1\\u63a7\') != -1){\\n      //   outOfMemData = {\\n      //     monitor_type: \'out_of_mem\',\\n      //     monitor_data: this.outOfMemData\\n      //   }\\n      // }\\n      \\n      let config = []\\n      if(basicData.hasOwnProperty(\'monitor_data\')){\\n        config.push(basicData)\\n      };\\n      \\n      if(timeData.hasOwnProperty(\'monitor_data\')){\\n        config.push(timeData)\\n      }\\n      if(outOfMemData.hasOwnProperty(\'monitor_data\')){\\n        config.push(outOfMemData)\\n      }\\n\\n      let monitorData = {}\\n      if (config.length > 0){\\n        let asset = []\\n        if (this.sourceType == \\"deviceList\\"){\\n          // \\u5904\\u7406\\u8bbe\\u5907\\u5217\\u8868\\u7684\\u6570\\u636e\\n          let deviceData = this.dealDeviceData()\\n          for (let key in deviceData){\\n            let cycle_info = {\\n              id: key\\n            }\\n\\n            let asset_info = []\\n            for (let i in deviceData[key]){\\n              asset_info.push({\\n                id: deviceData[key][i].tlabTestObjectId,\\n                st_id: deviceData[key][i].id,\\n                name: deviceData[key][i].name,\\n                ip: deviceData[key][i].ip\\n              })\\n            }\\n            asset.push({\\n              cycle_info,\\n              asset_info\\n            })\\n          }\\n\\n        }else{\\n          let asset_info = []\\n          for (let i in this.testObjSelDataList){\\n            asset_info.push({\\n              id: this.testObjSelDataList[i].tlabTestObjectId,\\n              st_id: this.testObjSelDataList[i].id,\\n              name: this.testObjSelDataList[i].name,\\n              ip: this.testObjSelDataList[i].ip\\n            })\\n          }\\n          let cycle_info = {\\n            id: parseInt(this.$route.params.id)\\n          }\\n          asset = [{\\n            cycle_info,\\n            asset_info\\n          }]\\n        }\\n        \\n        monitorData = {\\n          requestor:\'st\',\\n          operator: this.userInfo.loginName,\\n          creator_name: this.userInfo.name,\\n          asset,\\n          monitor: config\\n        };\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let asset_id = []\\n      for (let i in this.testObjSelDataList){\\n        asset_id.push(this.testObjSelDataList[i].tlabTestObjectId)\\n      }\\n\\n      let email_data = {\\n        \\"asset_id\\": asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      if (config.length > 0 && this.checkList.indexOf(\'\\u4e32\\u53e3\\u65e5\\u5fd7\\u76d1\\u63a7\') != -1){\\n        let emailApi = api.labApi.setEmailConfig(email_data)\\n        let bMonitorApi = api.labApi.setProductMonitors(monitorData);\\n        let logMonitorApi = await this.setBatchLogMonitor();\\n        // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n        this.runAllApi([emailApi, bMonitorApi, logMonitorApi],false,false)\\n        return\\n      };\\n\\n      if (config.length > 0) {\\n        let emailApi = api.labApi.setEmailConfig(email_data)\\n        let bMonitorApi = api.labApi.setProductMonitors(monitorData);\\n        // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n        this.runTwoApi([emailApi,bMonitorApi],false,false)\\n        return\\n      };\\n\\n      if (this.checkList.indexOf(\'\\u4e32\\u53e3\\u65e5\\u5fd7\\u76d1\\u63a7\') != -1){\\n        let emailApi = api.labApi.setEmailConfig(email_data)\\n        let logMonitorApi = await this.setBatchLogMonitor();\\n        // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n        this.runTwoApi([emailApi, logMonitorApi],false,false)\\n        return\\n      }\\n    },\\n\\n    async saveChanelLog(){\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let asset_id = []\\n      for (let i in this.testObjSelDataList){\\n        asset_id.push(this.testObjSelDataList[i].tlabTestObjectId)\\n      }\\n\\n      let email_data = {\\n        \\"asset_id\\": asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let logMonitorApi = await this.setBatchLogMonitor();\\n      this.runTwoApi([emailApi, logMonitorApi],false,false)\\n    },\\n\\n    packageAssetInfoForMonitor(){\\n      let asset_id = []\\n      let asset = []\\n      if (this.sourceType == \\"deviceList\\"){\\n        // \\u5904\\u7406\\u8bbe\\u5907\\u5217\\u8868\\u7684\\u6570\\u636e\\n        let deviceData = this.dealDeviceData()\\n        for (let key in deviceData){\\n          let cycle_info = {\\n            id: key\\n          }\\n\\n          let asset_info = []\\n          for (let i in deviceData[key]){\\n            asset_id.push(deviceData[key][i].tlabTestObjectId)\\n            asset_info.push({\\n              id: deviceData[key][i].tlabTestObjectId,\\n              st_id: deviceData[key][i].id,\\n              name: deviceData[key][i].name,\\n              ip: deviceData[key][i].ip,\\n              product_line: deviceData[key][i].product_line,\\n            })\\n          }\\n          asset.push({\\n            cycle_info,\\n            asset_info\\n          })\\n        }\\n\\n      }else{\\n        let asset_info = []\\n        for (let i in this.testObjSelDataList){\\n          asset_id.push(this.testObjSelDataList[i].tlabTestObjectId)\\n          asset_info.push({\\n            id: this.testObjSelDataList[i].tlabTestObjectId,\\n            st_id: this.testObjSelDataList[i].id,\\n            name: this.testObjSelDataList[i].name,\\n            ip: this.testObjSelDataList[i].ip,\\n            product_line: this.testObjSelDataList[i].product_line,\\n          })\\n        }\\n        let cycle_info = {\\n          id: parseInt(this.$route.params.id)\\n        }\\n        asset = [{\\n          cycle_info,\\n          asset_info\\n        }]\\n      } \\n      \\n      let assetInfo = {\\n        asset,\\n        asset_id\\n      }\\n\\n      return assetInfo\\n    },\\n\\n    async setFanMonitor(){\\n      let fanDatas = [{\\n        target: \\"product\\",\\n        category: \\"fan\\",\\n        is_open: this.fanSwitch,\\n        is_send_email: this.fanSwitch,\\n        interval: this.fanInterval,\\n      }]\\n\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n      \\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: [{\\n          monitor_type: \\"fan\\",\\n          monitor_data: fanDatas\\n        }]\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.labApi.setProductMonitors(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    setTemperatureMonitor(){\\n      let temperatureDatas = [{\\n        type: \\"temperature\\",\\n        category: \\"temperature\\",\\n        is_open: this.temperatureSwitch,\\n        period: this.temperatureInterval,\\n        threshold: {\\n          value: this.temperatureValue\\n        }\\n      }];\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n      \\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: temperatureDatas\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.disApi.setDmsMonitor(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    setPowerMonitor(){\\n      let powerDatas = [{\\n        type: \\"power\\",\\n        category: \\"power\\",\\n        is_open: this.powerSwitch,\\n        period: this.powerInterval,\\n      }];\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n      \\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: powerDatas\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.disApi.setDmsMonitor(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    setDisNetworkMonitor(){\\n      let disNetworkDatas = [{\\n        type: \\"dis_network\\",\\n        category: \\"dis_network\\",\\n        is_open: this.disNetworkSwitch,\\n        period: this.disNetworkInterval,\\n      }];\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n      \\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: disNetworkDatas\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.disApi.setDmsMonitor(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    setGpuMonitor(){\\n      let gpuDatas = [{\\n        type: \\"gpu\\",\\n        category: \\"gpu\\",\\n        is_open: this.gpuSwitch,\\n        period: this.gpuInterval,\\n      }];\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n      \\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: gpuDatas\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.disApi.setDmsMonitor(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    setSystemNetworkMonitor(){\\n      let systemNetworkDatas = [{\\n        type: \\"system_network\\",\\n        category: \\"system_network\\",\\n        is_open: this.systemNetworkSwitch,\\n        period: this.systemNetworkInterval,\\n      }];\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n      \\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: systemNetworkDatas\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.disApi.setDmsMonitor(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    async setProcessMonitor(){\\n      let processDatas = [{\\n        target: \\"product\\",\\n        category: \\"product_process\\",\\n        is_open: this.processSwitch,\\n        is_send_email: this.processSwitch,\\n        interval: this.processInterval,\\n        process_names: this.processNames\\n      }]\\n\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n\\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: [{\\n          monitor_type: \\"product_process\\",\\n          monitor_data: processDatas\\n        }]\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.labApi.setProductMonitors(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    async setOutOfMemMonitor(){\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n\\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: [{\\n          monitor_type: \\"out_of_mem\\",\\n          monitor_data: this.outOfMemData\\n        }]\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.labApi.setProductMonitors(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    async setTimeMonitor(){\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n\\n      let monitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: [{\\n          monitor_type: \\"real_time\\",\\n          monitor_data: this.timeMonitorData\\n        }]\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.labApi.setProductMonitors(monitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    async setAllMonitor() {\\n      let basicData = {\\n        monitor_type: \'basic\',\\n        monitor_data: this.monitorData\\n      };\\n      let monitor = [basicData];\\n\\n      let asset = []\\n      let cycle_info = {}\\n      if (this.sourceType == \\"deviceList\\"){\\n        // \\u5904\\u7406\\u8bbe\\u5907\\u5217\\u8868\\u8fc7\\u6765\\u7684\\u6570\\u636e\\n        cycle_info = {\\n          id: this.productData.cycle.id\\n        }\\n      }else{\\n        cycle_info = {\\n          id: parseInt(this.$route.params.id)\\n        }\\n      }\\n\\n      asset.push({\\n        cycle_info,\\n        asset_info: [{\\n            id: this.productData.tlabTestObjectId,\\n            st_id: this.productData.id,\\n            name: this.productData.name,\\n            ip: this.productData.ip\\n          }]\\n      })\\n\\n      let data = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset,\\n        monitor\\n      };\\n\\n      let email_data = {\\n        \\"asset_id\\": [this.productData.tlabTestObjectId],\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n\\n      // \\u65b0\\u7684\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.labApi.setProductMonitors(data)\\n      let logData = await this.setLogMonitor()\\n      this.runAllApi([emailApi, bMonitorApi, logData.logMonitorApi], data, logData.postData)\\n    },\\n\\n    // \\u5904\\u7406\\u8bbe\\u5907\\u5217\\u8868\\u7684\\u6570\\u636e\\n    dealDeviceData(){\\n      const deviceData = {}\\n      this.testObjSelDataList.map(item => {\\n        const id = item.cycle.id;\\n        if ( Object.keys(deviceData).indexOf(id.toString()) == -1) {\\n          deviceData[id] = Array.from({length:1}).fill(item);\\n        } else {\\n          deviceData[id].push(item)\\n        }\\n      })\\n\\n      return deviceData\\n    },\\n\\n    closeMonitorDialog(){\\n      this.syncConfigSwitch = false\\n      this.monitorSetModel = false\\n      this.isViewKeyDialogShow = false\\n      this.syncBindValue = \'\'\\n      this.keyword = [];\\n      this.processSwitch = false;\\n      this.processNames = [];\\n      this.processInterval = 600;\\n      this.fanSwitch = false;\\n      this.fanInterval = 600;\\n      this.temperatureSwitch = false;\\n      this.temperatureValue = 90;\\n      this.temperatureInterval = 600;\\n      this.powerSwitch = false;\\n      this.powerInterval = 600;\\n      this.disNetworkSwitch = false;\\n      this.disNetworkInterval = 600;\\n      this.gpuSwitch = false;\\n      this.gpuInterval = 600;\\n      this.systemNetworkSwitch = false;\\n      this.systemNetworkInterval = 600;\\n    },\\n\\n    setProductMonitor(){\\n      if (this.batchFlag){\\n        this.setBatchMonitor()\\n        this.monitorSetModel = false    // \\u6279\\u91cf\\u76d1\\u63a7\\n      }else{\\n        this.setAllMonitor()   // \\u5355\\u4e2a\\u76d1\\u63a7\\n      }\\n      this.isViewKeyDialogShow = false\\n      this.syncConfigSwitch = false\\n    },\\n\\n    // setConfigMonitor(){\\n    //   if (this.syncConfigSwitch && this.syncBindValue == \'\'){\\n    //     console.log(\\"\\u6ca1\\u6709\\u9009\\u62e9\\u8bbe\\u5907\\")\\n    //     this.$confirm(\\"\\u60a8\\u52fe\\u9009\\u4e86\\u4ece\\u5176\\u5b83\\u8bbe\\u5907\\u540c\\u6b65\\u914d\\u7f6e\\uff0c\\u4f46\\u662f\\u6ca1\\u6709\\u9009\\u62e9\\u8bbe\\u5907\\uff0c\\u5c06\\u4e0d\\u80fd\\u4ece\\u8bbe\\u5907\\u540c\\u6b65\\u914d\\u7f6e\\uff0c\\u662f\\u5426\\u7ee7\\u7eed\\u914d\\u7f6e\\uff08\\u4f7f\\u7528\\u73b0\\u6709\\u9875\\u9762\\u5c55\\u793a\\u7684\\u914d\\u7f6e\\uff09\\", \'\\u63d0\\u793a\', {\\n    //       confirmButtonText: \'\\u7ee7\\u7eed\',\\n    //       cancelButtonText: \'\\u53d6\\u6d88\',\\n    //       type: \'warning\'\\n    //     }).then(() => {\\n    //       this.setProductMonitor()\\n    //     }).catch(() => {\\n    //       this.$message({\\n    //         type: \'info\',\\n    //         message: \'\\u5df2\\u53d6\\u6d88\\u914d\\u7f6e\'\\n    //       });          \\n    //     });\\n    //   }else{\\n    //     this.setProductMonitor()\\n    //   }\\n    // },\\n\\n\\n    setBasicMonitor(){\\n      let basicData = this.monitorData\\n\\n      let checkArry = [\'cpu_percent\', \'memory_percent\', \'db_memory_percent\']\\n      for (let i in basicData){\\n        if (checkArry.indexOf(basicData[i].category) != -1){\\n          if (basicData[i].threshold.max_value <= basicData[i].threshold.min_value && basicData[i].is_open){\\n            this.$message.error(\\"\\u76d1\\u63a7\\u9879 <\\" + basicData[i].category_display + \\"> \'\\u4f7f\\u7528\\u7387\\u6700\\u5927\\u503c\' \\u5c0f\\u4e8e\\u7b49\\u4e8e \'\\u4f7f\\u7528\\u7387\\u6700\\u5c0f\\u503c\'\\uff0c\\u8bf7\\u4fee\\u6539\\uff01\\")\\n            return\\n          }\\n        }\\n      }\\n\\n      let rebootInfo = basicData.pop()\\n\\n      let assetInfo = this.packageAssetInfoForMonitor()\\n      let basicMonitorData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: [{\\n          monitor_type: \\"basic\\",\\n          monitor_data: basicData\\n        }]\\n      };\\n\\n      // \\u7ec4\\u88c5\\u90ae\\u4ef6\\u90e8\\u5206\\u6570\\u636e\\n      let email_data = {\\n        \\"asset_id\\": assetInfo.asset_id,\\n        \\"email_list\\": this.email_list,\\n        \\"email_list_map\\": this.email_list_map\\n      }\\n\\n      let rebootData = {\\n        requestor:\'st\',\\n        operator: this.userInfo.loginName,\\n        creator_name: this.userInfo.name,\\n        asset: assetInfo.asset,\\n        monitor: {\\n          is_open: rebootInfo.is_open\\n        }\\n      }\\n      api.disApi.setRebootMonitor(rebootData)\\n      \\n      // \\u5e76\\u53d1\\u8c03\\u7528\\n      let emailApi = api.labApi.setEmailConfig(email_data)\\n      let bMonitorApi = api.labApi.setProductMonitors(basicMonitorData);\\n      // \\u540e\\u9762\\u4e24\\u4e2a\\u5b57\\u6bb5\\u548c\\u8427\\u5cf0\\u7ea6\\u5b9a\\u4e34\\u65f6\\u6539\\u4e3afalse,false\\n      this.runTwoApi([emailApi,bMonitorApi],false,false)\\n    },\\n\\n    getDmsConfig(ais_id){\\n      let dmsConfig = [\\"temperature\\", \\"power\\", \\"dis_network\\", \\"gpu\\", \\"system_network\\"]\\n      for (let i in dmsConfig){\\n        let dmsParams = {\\n          asset_id: ais_id,\\n          category: dmsConfig[i]\\n        }\\n        api.disApi.getDmsMonitor(dmsParams).then(res=>{\\n          if (res.success) {\\n            switch(res.data.category){\\n              case \'temperature\':\\n                this.temperatureValue = res.data.threshold.value\\n                this.temperatureSwitch = res.data.switch\\n                this.temperatureInterval = res.data.period\\n                break;\\n              case \'power\':\\n                this.powerSwitch = res.data.switch\\n                this.powerInterval = res.data.period\\n                break;\\n              case \'dis_network\':\\n                this.disNetworkSwitch = res.data.switch\\n                this.disNetworkInterval = res.data.period\\n                break;\\n              case \'gpu\':\\n                this.gpuSwitch = res.data.switch\\n                this.gpuInterval = res.data.period\\n                break;\\n              case \'system_network\':\\n                this.systemNetworkSwitch = res.data.switch\\n                this.systemNetworkInterval = res.data.period\\n                break;\\n              default:\\n                break;\\n            }\\n          }\\n      })\\n      .catch(err => {\\n        this.$message.error(\'\\u4ece\\u8bbe\\u5907\\u76d1\\u63a7\\u670d\\u52a1\\u83b7\\u53d6\\u8bbe\\u5907\\u76d1\\u63a7\\u914d\\u7f6e\\u5931\\u8d25\\uff1a\', err);\\n      });\\n      }\\n    },\\n\\n    getConfigMonitor(data, isSyncConfig) {\\n      var isSyncFlag = arguments[1]?arguments[1]:false\\n      if (!isSyncConfig){\\n        this.checkList = []\\n        if (this.testObjSelDataList.length > 1){\\n          this.batchFlag = true   // \\u83b7\\u53d6\\u9ed8\\u8ba4\\u914d\\u7f6e\\uff0c\\u6279\\u91cf\\u914d\\u7f6e\\u76d1\\u63a7\\n          this.logSwitch = false\\n          this.monitorTitle = \\"\\u6279\\u91cf\\u76d1\\u63a7\\u914d\\u7f6e\\"\\n          this.email_list = []\\n          this.email_list_map = {}\\n        }else{\\n          this.monitorTitle = \'\\u8bbe\\u5907\\u540d\\u79f0: \'+ data.name\\n          this.checkList = this.allCheckList\\n          this.batchFlag = false   // \\u83b7\\u53d6\\u5355\\u4e2a\\u914d\\u7f6e\\uff0c\\u5355\\u4e2a\\u914d\\u7f6e\\u76d1\\u63a7\\n          api.labApi\\n          .getEmailConfig(data.tlabTestObjectId)\\n          .then(res => {\\n            if (res.success) {\\n              this.email_list = res.data.email_list;\\n              this.email_list_map = res.data.email_list_map\\n            }\\n          })\\n        }\\n      }\\n\\n      this.handleTabClick({name:\'logMonitor\'}, isSyncFlag)\\n\\n      let tlabId = \\"\\"\\n      if (isSyncConfig){\\n        tlabId = this.syncBindValue.tlabTestObjectId\\n      } else {\\n        tlabId = data.tlabTestObjectId\\n      }\\n\\n      if (!this.batchFlag){\\n        this.getDmsConfig(tlabId)\\n      }\\n      \\n      // \\u4ecetlab\\u83b7\\u53d6\\n      api.labApi\\n      .getProductMonitors(this.userInfo.loginName, tlabId, this.batchFlag)\\n      .then(res => {\\n        if (res.success) {\\n          const { config } = res.data;\\n          if (config && config.length > 0) {\\n            for (let item of config) {\\n              switch(item.monitor_type){\\n                case \'basic\':\\n                  this.monitorData = [...item.monitor_data];\\n                  this.getDeviceRebootMonitor(tlabId)\\n                  this.handleLogData();\\n                  break;\\n                case \'real_time\':\\n                  this.timeMonitorData = [...item.monitor_data];\\n                  break;\\n                case \'out_of_mem\':\\n                  this.outOfMemData = [...item.monitor_data];\\n                  break;\\n                case \'product_process\':\\n                  let processMonitorData = [...item.monitor_data];\\n                  if (processMonitorData.length == 1){\\n                    this.processSwitch = processMonitorData[0].is_open;\\n                    this.processNames = processMonitorData[0].process_names;\\n                    this.processInterval = processMonitorData[0].interval\\n                  } else {\\n                    console.log(\\"\\u8fdb\\u7a0b\\u6570\\u636e\\u540e\\u53f0\\u8fd4\\u56de\\u6709\\u95ee\\u9898: \\", processMonitorData);\\n                  }\\n                  break;\\n                case \'fan\':\\n                  let fanMonitorData = [...item.monitor_data]; \\n                  this.fanSwitch = fanMonitorData[0].is_open;\\n                  this.fanInterval = fanMonitorData[0].interval;\\n                  break;\\n                default:\\n                  break;\\n              }\\n            }\\n          }\\n          this.monitorSetModel = true;\\n        } else {\\n          this.$message.error(`${res.msg}`);\\n        }\\n      })\\n      .catch(err => {\\n        console.log(err);\\n        this.$message.error(\'\\u83b7\\u53d6\\u76d1\\u63a7\\u914d\\u7f6e\\u9519\\u8bef\');\\n      });\\n    },\\n\\n    handleLogData(){\\n      let monitorData = this.monitorData;\\n      this.logData = {\\n        keyword:[],\\n        cmd:[]\\n      }\\n      for (let i = 0; i < monitorData.length; i++) {\\n        if(monitorData[i].category == \'log\'){\\n          if(monitorData[i].threshold){\\n            monitorData[i].threshold = {\\n              ...monitorData[i].threshold,\\n              project_info:{\\n                id:this.cycleId,\\n                url:this.peojectUrl+\'cycleDetails/\'+this.cycleId\\n              }\\n            }\\n            // let thresholdData = JSON.parse(monitorData[i].threshold)\\n            // this.logData = {...this.logData,...thresholdData}\\n          }\\n          break;\\n        }\\n      }\\n      this.monitorData = [...monitorData];\\n    },\\n\\n    getTypes(batchType){\\n      this.checkList = batchType\\n      let currentTab = batchType[batchType.length-1]\\n      if (currentTab == \\"\\u4e32\\u53e3\\u65e5\\u5fd7\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"logMonitor\\"\\n      } else if (currentTab == \\"\\u5b9e\\u65f6\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"timeMonitor\\"\\n      } else if (currentTab == \\"\\u5185\\u5b58\\u6cc4\\u6f0f\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"outOfMem\\"\\n      } else if (currentTab == \\"\\u8fdb\\u7a0b\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"processMonitor\\"\\n      }else if (currentTab == \\"\\u98ce\\u6247\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"fanMonitor\\"\\n      }else if (currentTab == \\"\\u6e29\\u5ea6\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"temperatureMonitor\\"\\n      }else if (currentTab == \\"\\u7535\\u6e90\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"powerMonitor\\"\\n      }else if (currentTab == \\"\\u7f51\\u7edc\\u72b6\\u6001\\"){\\n        this.monitorActiveName = \\"disNetworkMonitor\\"\\n      }else if (currentTab == \\"GPU\\u76d1\\u63a7\\"){\\n        this.monitorActiveName = \\"gpuMonitor\\"\\n      }else if (currentTab == \\"\\u4e3b\\u63a7/\\u5b50\\u7cfb\\u7edf\\u7f51\\u7edc\\u3001pcie\\u72b6\\u6001\\"){\\n        this.monitorActiveName = \\"systemNetworkMonitor\\"\\n      }\\n      else if (currentTab == \\"\\u8fdc\\u7a0b\\u65e5\\u5fd7\\"){\\n        this.monitorActiveName = \\"remoteMonitor\\"\\n      }\\n      else if (currentTab == \\"\\u7cfb\\u7edf\\u65e5\\u5fd7\\"){\\n        this.monitorActiveName = \\"sysLogMonitor\\"\\n      }\\n      else if (currentTab == \\"core\\u6587\\u4ef6\\"){\\n        this.monitorActiveName = \\"coreMonitor\\"\\n      }\\n      else{\\n        this.monitorActiveName = \\"basicMonitor\\"\\n      }\\n    },\\n\\n    renderHeader (h,{column}) {\\n      let prompt = \'\\u5173\\u952e\\u5b57\\u4e0d\\u4e3a\\u7a7a\\uff0c\\u8868\\u793a\\u8f93\\u5165\\u7684\\u547d\\u4ee4\\u53ea\\u6709\\u5728\\u8be5\\u5173\\u952e\\u5b57\\u51fa\\u73b0\\u624d\\u4f1a\\u6267\\u884c\\uff1b\\u5173\\u952e\\u5b57\\u4e3a\\u7a7a\\uff0c\\u8868\\u793a\\u547d\\u4ee4\\u7684\\u6267\\u884c\\u548c\\u5173\\u952e\\u5b57\\u65e0\\u5173\\uff0c\\u6309\\u8bbe\\u7f6e\\u81ea\\u52a8\\u89e6\\u53d1\\u6267\\u884c \'\\n      return h(\\n          \'div\',[ \\n              h(\'span\', column.label),\\n              h(\'el-tooltip\',{\\n  \\u3000\\u3000\\u3000\\u3000      props:{\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000effect:\'dark\',\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000content:prompt,\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000placement:\'top\'\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000  },\\u3000\\u3000\\u3000 \\n      \\u3000\\u3000\\u3000\\u3000 },[\\n                      h(\'i\', {\\n                          class:\'el-icon-question\',\\n                          style:\'color:#e6a23c;margin-left:5px;\'\\n                      })\\n                  ],{\\n                      content:prompt,\\n                  })\\n          ] \\n      );\\n    },\\n\\n    renderHeaderCmd (h,{column}) {\\n      let prompt = \'\\u6267\\u884c\\u547d\\u4ee4\\u4e3a\\u7a7a\\u5219\\u4e0d\\u4f1a\\u4fdd\\u5b58\\u8be5\\u6761\\u6267\\u884c\\u914d\\u7f6e\\u4fe1\\u606f\\u3002\'\\n      return h(\\n          \'div\',[ \\n              h(\'span\', column.label),\\n              h(\'el-tooltip\',{\\n  \\u3000\\u3000\\u3000\\u3000      props:{\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000effect:\'dark\',\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000content:prompt,\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000\\u3000placement:\'top\'\\n  \\u3000\\u3000\\u3000\\u3000\\u3000\\u3000  },\\u3000\\u3000\\u3000 \\n      \\u3000\\u3000\\u3000\\u3000 },[\\n                      h(\'i\', {\\n                          class:\'el-icon-question\',\\n                          style:\'color:#e6a23c;margin-left:5px;\'\\n                      })\\n                  ],{\\n                      content:prompt,\\n                  })\\n          ] \\n      );\\n    },\\n\\n    addKeyword(){\\n      this.$refs.executeList.getExecuteListNew()\\n      this.$refs.executeList.getKeywordInfo()\\n    },\\n    \\n    deleteCoreItem(i){\\n      this.coreForm.coreItems.splice(i,1)\\n\\n    },\\n\\n    addCoreItem(){\\n      this.coreForm.coreItems.push({\\n        keywords:\'\',\\n        path:\'\'\\n      })\\n    },\\n\\n    async saveRemotesLog(){\\n      let configItem;\\n      let actuatorBody = []\\n      let deviceData = {}\\n      let isOpen = this.sysLogSwitch\\n      if (this.sourceType == \\"deviceList\\"){\\n        deviceData = this.dealDeviceData()\\n      } else {\\n        let cycleId = parseInt(this.$route.params.id)\\n        deviceData[cycleId] = this.testObjSelDataList\\n      }\\n      \\n      for (let key in deviceData){\\n        let kr_ids = []\\n        let logItems = []\\n        for (let i in deviceData[key]){\\n          kr_ids.push(deviceData[key][i].id)\\n          configItem = this.initRemoteLogData(deviceData[key][i]);\\n          logItems.push(configItem)\\n        }\\n\\n        actuatorBody.push({\\n          cycle_id: key,\\n          kr_device_ids: kr_ids,\\n          action: isOpen? \\"on\\" : \\"off\\",\\n          username_cn: this.userInfo.name,\\n          log_items: logItems,\\n        })\\n      }\\n\\n      api.logApi.updateRemoteLogAndUpdateTask(actuatorBody).then(res => {\\n          this.monitorSetModel = false\\n          this.$message.info(\'\\u914d\\u7f6e\\u4e0b\\u53d1\\u6210\\u529f\\uff0c\\u8bf7\\u7a0d\\u540e\\u5728\\u4efb\\u52a1\\u7ba1\\u7406\\u4e2d\\u5fc3\\u67e5\\u770b\\u7ed3\\u679c\');\\n      })\\n      .catch(err => {\\n        this.$message.error(\'\\u8bbe\\u7f6e\\u76d1\\u63a7\\u5931\\u8d25\\uff0c\\u8c03\\u7528Actuator\\u63a5\\u53e3\\u5f02\\u5e38\');\\n      });\\n\\n      let asset_id = []\\n        for (let i in this.testObjSelDataList){\\n          asset_id.push(this.testObjSelDataList[i].tlabTestObjectId)\\n        }\\n\\n        let email_data = {\\n          \\"asset_id\\": asset_id,\\n          \\"email_list\\": this.email_list,\\n          \\"email_list_map\\": this.email_list_map\\n        }\\n        let emailApi = api.labApi.setEmailConfig(email_data).then(_=>{})\\n        \\n    },\\n\\n    initRemoteLogData(productData){\\n      // id device_name \\u540e\\u53f0\\u901a\\u7528\\u63a5\\u53e3\\u9700\\u8981\\n      let status = this.sysLogSwitch?\'open\':\'close\'\\n      let emails = this.email_list.map(item=>{\\n        return item+\'@hikvision.com.cn\'\\n      })\\n      let postData = {\\n        requestor:\'st\',\\n        id: productData.id,\\n        device_name: productData.name,\\n\\n        operator: this.userInfo.loginName,\\n        deviceId: productData.id,\\n        deviceIp: productData.ip,\\n        status: status,\\n        key_word: this.sysLogKeyword,\\n        deviceName: productData.name,\\n        email:emails,\\n        product_url: this.peojectUrl + \\"cycleDetails/\\" + productData.cycleId\\n      };\\n\\n      return postData\\n    },\\n\\n    saveSystemLog(){\\n      let configItem;\\n      let actuatorBody = []\\n      let deviceData = {}\\n      let isOpen = this.mtlogSwitch\\n      if (this.sourceType == \\"deviceList\\"){\\n        deviceData = this.dealDeviceData()\\n      } else {\\n        let cycleId = parseInt(this.$route.params.id)\\n        deviceData[cycleId] = this.testObjSelDataList\\n      }\\n\\n      for (let key in deviceData){\\n        let kr_ids = []\\n        let logItems = []\\n        for (let i in deviceData[key]){\\n          kr_ids.push(deviceData[key][i].id)\\n          configItem = this.initSysLogData(deviceData[key][i]);\\n          logItems.push(configItem)\\n        }\\n        actuatorBody.push({\\n          cycle_id: key,\\n          kr_device_ids: kr_ids,\\n          action: isOpen? \\"on\\" : \\"off\\",\\n          username_cn: this.userInfo.name,\\n          log_items: logItems,\\n        })\\n\\n        api.logApi.updateSysLogAndUpdateTask(actuatorBody).then(res => {\\n          this.monitorSetModel = false\\n          this.$message.info(\'\\u914d\\u7f6e\\u4e0b\\u53d1\\u6210\\u529f\\uff0c\\u8bf7\\u7a0d\\u540e\\u5728\\u4efb\\u52a1\\u7ba1\\u7406\\u4e2d\\u5fc3\\u67e5\\u770b\\u7ed3\\u679c\');\\n        })\\n        .catch(err => {\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u5931\\u8d25\\uff0c\\u8c03\\u7528Actuator\\u63a5\\u53e3\\u5f02\\u5e38\');\\n        });\\n\\n        let asset_id = []\\n        for (let i in this.testObjSelDataList){\\n          asset_id.push(this.testObjSelDataList[i].tlabTestObjectId)\\n        }\\n\\n        let email_data = {\\n          \\"asset_id\\": asset_id,\\n          \\"email_list\\": this.email_list,\\n          \\"email_list_map\\": this.email_list_map\\n        }\\n        let emailApi = api.labApi.setEmailConfig(email_data).then(_=>{})\\n\\n      }\\n\\n    },\\n\\n    initSysLogData(productData){\\n      let status = this.sysLogSwitch?\'open\':\'close\'\\n      let postData = {\\n        requestor:\'st\',\\n        id: productData.id,\\n        device_name: productData.name,\\n\\n        tlab_id: productData.tlabTestObjectId,\\n        operator: this.userInfo.loginName,\\n        keywords: this.mtkeyword,\\n        mtLog_path: this.mtlogPath,\\n        config_info:{\\n          id:productData.cycleId,\\n          url:this.peojectUrl + \\"cycleDetails/\\" + productData.cycleId,\\n          email_list:this.email_list\\n        }\\n      };\\n\\n      return postData\\n\\n    },\\n\\n    getSysLogChanId(){\\n       let productData = this.testObjSelDataList[0]\\n      let params = {\\n        id:productData.id,\\n        tlab_id:productData.tlabTestObjectId,\\n        requestor:\'st\',\\n      }\\n      api.logApi.getMtlogInfo(params).then(res=>{\\n        if(res.success){\\n          this.mtlogSwitch = res.data.state==\'on\'?true:false\\n          this.mtkeyword = res.data.keywords\\n          this.mtlogPath = res.data.mtLog_path\\n        }\\n      })\\n    },\\n\\n    getCoreLogChanId(){\\n      let productData = this.testObjSelDataList[0]\\n      let params = {\\n        id:productData.id,\\n        tlab_id:productData.tlabTestObjectId,\\n        requestor:\'st\',\\n      }\\n      api.logApi.getCorelogInfo(params).then(res=>{\\n        if(res.success){\\n          this.coreForm.coreLogSwitch = res.data.state==\'on\'?true:false\\n          this.coreForm.corelogPath = res.data.core_path\\n          if(res.data.file_config&&res.data.file_config.length>0){\\n            this.coreForm.coreItems = res.data.file_config\\n          }\\n        }\\n      })\\n    },\\n\\n    getDeviceRebootMonitor(tlabId){\\n      api.disApi.getRebootMonitor(tlabId).then(res=>{\\n        if (res.success){\\n          this.monitorData.push({\\n            \\"target\\": \\"product\\",\\n            \\"category\\": \\"deviceReboot\\",\\n            \\"category_display\\": \\"\\u8bbe\\u5907\\u91cd\\u542f\\",\\n            \\"is_open\\": res.data.is_open,\\n            \\"is_send_email\\": res.data.is_open,\\n            \\"threshold\\": \\"0\\"\\n          })\\n        } else {\\n          this.monitorData.push({\\n            \\"target\\": \\"product\\",\\n            \\"category\\": \\"deviceReboot\\",\\n            \\"category_display\\": \\"\\u8bbe\\u5907\\u91cd\\u542f\\",\\n            \\"is_open\\": false,\\n            \\"is_send_email\\": false,\\n            \\"threshold\\": \\"0\\"\\n          })          \\n        }\\n      })\\n    },\\n\\n    tagClick(){\\n      if(this.monitorActiveName==\'remoteMonitor\'){\\n        \\n      }\\n      if(this.monitorActiveName==\'sysLogMonitor\'){\\n        if(this.testObjSelDataList.length==1){\\n          this.getSysLogChanId()\\n        }\\n      };\\n      if(this.monitorActiveName==\'coreMonitor\'){\\n         if(this.testObjSelDataList.length==1){\\n          this.getCoreLogChanId()\\n        }\\n      };\\n    },\\n\\n    saveCoreLog(){\\n      let configItem;\\n      let actuatorBody = []\\n      let deviceData = {}\\n      let isOpen = this.coreForm.coreLogSwitch\\n      if (this.sourceType == \\"deviceList\\"){\\n        deviceData = this.dealDeviceData()\\n      } else {\\n        let cycleId = parseInt(this.$route.params.id)\\n        deviceData[cycleId] = this.testObjSelDataList\\n      }\\n\\n      for (let key in deviceData){\\n        let kr_ids = []\\n        let logItems = []\\n        for (let i in deviceData[key]){\\n          kr_ids.push(deviceData[key][i].id)\\n          configItem = this.initCoreLog(deviceData[key][i]);\\n          logItems.push(configItem)\\n        }\\n        actuatorBody.push({\\n          cycle_id: key,\\n          kr_device_ids: kr_ids,\\n          action: isOpen? \\"on\\" : \\"off\\",\\n          username_cn: this.userInfo.name,\\n          log_items: logItems,\\n        })\\n\\n        api.logApi.updateCoreLogAndUpdateTask(actuatorBody).then(res => {\\n          this.monitorSetModel = false\\n          this.$message.info(\'\\u914d\\u7f6e\\u4e0b\\u53d1\\u6210\\u529f\\uff0c\\u8bf7\\u7a0d\\u540e\\u5728\\u4efb\\u52a1\\u7ba1\\u7406\\u4e2d\\u5fc3\\u67e5\\u770b\\u7ed3\\u679c\');\\n        })\\n        .catch(err => {\\n          this.$message.error(\'\\u8bbe\\u7f6e\\u5931\\u8d25\\uff0c\\u8c03\\u7528Actuator\\u63a5\\u53e3\\u5f02\\u5e38\');\\n        });\\n        \\n        let asset_id = []\\n        for (let i in this.testObjSelDataList){\\n          asset_id.push(this.testObjSelDataList[i].tlabTestObjectId)\\n        }\\n\\n        let email_data = {\\n          \\"asset_id\\": asset_id,\\n          \\"email_list\\": this.email_list,\\n          \\"email_list_map\\": this.email_list_map\\n        }\\n        let emailApi = api.labApi.setEmailConfig(email_data).then(_=>{})\\n\\n      }\\n\\n    },\\n\\n    initCoreLog(productData){\\n\\n      let status = this.coreForm.coreLogSwitch?\'open\':\'close\'\\n      let postData = {\\n        requestor:\'st\',\\n        id: productData.id,\\n        device_name: productData.name,\\n\\n        tlab_id: productData.tlabTestObjectId,\\n        operator: this.userInfo.loginName,\\n        config_info:{\\n          id:productData.cycleId,\\n          url:this.peojectUrl + \\"cycleDetails/\\" + productData.cycleId,\\n          email_list:this.email_list\\n        },\\n        core_path:this.coreForm.corelogPath,\\n        file_config:this.coreForm.coreItems\\n       \\n      }\\n\\n      return postData\\n\\n    }\\n\\n   \\n\\n  }\\n}\\n</script>\\n<style scoped>\\n.save-container{\\n  position: relative;\\n  text-align: center;\\n  margin-top: 28px;\\n}\\n.monitor-close{\\n  position: absolute;\\n  right: 18px;\\n  bottom: 10px;\\n}\\n</style>\\n<style>\\n.keyBtn{\\n  display: inline-block;\\n  margin-left:10px;\\n  cursor: pointer;\\n  padding:0;\\n}\\n.monitorTable .el-select__tags-text{\\n  white-space:  initial;;\\n}\\n.monitorTable .el-tag--mini{\\n  height :auto;\\n  line-height: auto;\\n}\\n.cmd-select .el-select--mini{\\n  width: 100%;\\n}\\n.productMonitor .el-button.is-disabled,\\n.productMonitor .el-button.is-disabled:focus, \\n.productMonitor .el-button.is-disabled:hover{\\n  color: #C0C4CC;\\n  cursor: not-allowed;\\n  background-image: none;\\n  background-color: #FFF;\\n  border-color: #EBEEF5;\\n}\\n/* .productMonitor-dialog .el-dialog__body{\\n  padding: 30px 20px 0px 20px;\\n} */\\n/* .productMonitor-dialog.el-dialog__footer{\\n  padding: 0px 20px 20px 20px ;\\n} */\\n</style>\\n","uri":"file:///home/qk/Workspace/stability/vue/branch/v0.0.1/src/components/dialog/productMonitor.vue","version":1}}}'
2019-10-16 15:28:34,890 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":1,"message":"(node:16124) UnhandledPromiseRejectionWarning: TypeError: Cannot read property \'validation\' of undefined\\n    at VLS.configure (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:145:53)\\n    at VLS.<anonymous> (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:77:18)\\n    at Generator.next (<anonymous>)\\n    at /usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:8:71\\n    at new Promise (<anonymous>)\\n    at __awaiter (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:4:12)\\n    at lspConnection.onDidChangeConfiguration (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:76:71)\\n    at handleNotification (/usr/local/lib/node_modules/vue-language-server/node_modules/vscode-jsonrpc/lib/main.js:500:43)\\n    at processMessageQueue (/usr/local/lib/node_modules/vue-language-server/node_modules/vscode-jsonrpc/lib/main.js:271:17)\\n    at Immediate.setImmediate [as _onImmediate] (/usr/local/lib/node_modules/vue-language-server/node_modules/vscode-jsonrpc/lib/main.js:258:13)"}}'
2019-10-16 15:28:34,890 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":1,"message":"(node:16124) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)"}}'
2019-10-16 15:28:34,890 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"window/logMessage","params":{"type":1,"message":"(node:16124) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code."}}'
2019-10-16 15:28:34,962 - DEBUG - Server reported: Loaded bundled [email protected].
2019-10-16 15:28:34,962 - DEBUG - Server reported: Vetur initialized
2019-10-16 15:28:34,962 - ERROR - Server reported: (node:16124) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'validation' of undefined
    at VLS.configure (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:145:53)
    at VLS.<anonymous> (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:77:18)
    at Generator.next (<anonymous>)
    at /usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:8:71
    at new Promise (<anonymous>)
    at __awaiter (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:4:12)
    at lspConnection.onDidChangeConfiguration (/usr/local/lib/node_modules/vue-language-server/dist/services/vls.js:76:71)
    at handleNotification (/usr/local/lib/node_modules/vue-language-server/node_modules/vscode-jsonrpc/lib/main.js:500:43)
    at processMessageQueue (/usr/local/lib/node_modules/vue-language-server/node_modules/vscode-jsonrpc/lib/main.js:271:17)
    at Immediate.setImmediate [as _onImmediate] (/usr/local/lib/node_modules/vue-language-server/node_modules/vscode-jsonrpc/lib/main.js:258:13)
2019-10-16 15:28:34,962 - ERROR - Server reported: (node:16124) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
2019-10-16 15:28:34,962 - ERROR - Server reported: (node:16124) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
2019-10-16 15:28:37,123 - DEBUG - RX: Received message: b'{"jsonrpc":"2.0","method":"textDocument/publishDiagnostics","params":{"uri":"file:///home/qk/Workspace/stability/vue/branch/v0.0.1/src/components/dialog/productMonitor.vue","diagnostics":[]}}'
2019-10-16 15:28:41,944 - INFO - Received debug info request
2019-10-16 15:29:01,338 - INFO - Received debug info request
2019-10-16 15:31:30,655 - INFO - Received debug info request

Lua and clojure servers

https://langserver.org/

That thing lists 3 lua server and all of them work.

Clojure server also work, but only if bash exists on the system. I.e. not even BSD systems would have it working by default. Its completion is iffy, kinda like the PHP server.

ย 

EDIT: For lua, the two servers not mentioned in the README seem to work better, at least as far as snippet capability goes.

bash config in `.config/nvim/ftplugin/bash.vim` doesn't work

my config in ~/.config/nvim/ftplugin/bash.vim doesn't work but it will work if I place it in init.vim

let g:ycm_language_server = [
  \   {
  \     'name': 'bash',
  \     'cmdline': ['bash-language-server', 'start' ],
  \     'filetypes': [ 'sh', 'bash' ],
  \   },
  \ ]

Scope of this project?

Hi,

I am quite interested in the general direction of this project;
I have read the relevant discussion at ycm-core/ycmd#515 .

Is this implementing a way for ycmd to wrap around LSP? Could you give a short outline of how it is implemented? How is the general philosophy of which LS features are supported? (I assume to be minimal for this initial effort)

Thanks :)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.