Mercurial > vim
comparison runtime/pack/dist/opt/editexisting/plugin/editexisting.vim @ 8771:57cafbda13ad v7.4.1674
commit https://github.com/vim/vim/commit/cf2d8dee5117b9add3a3f5fc91b3569437e7d359
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Mar 28 21:04:37 2016 +0200
patch 7.4.1674
Problem: The editexisting plugin has to be copied or sourced to be used.
Solution: Turn it into a package.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Mon, 28 Mar 2016 21:15:06 +0200 |
parents | |
children | 2e6c9df8bea1 |
comparison
equal
deleted
inserted
replaced
8770:17eff93a32a7 | 8771:57cafbda13ad |
---|---|
1 " Vim Plugin: Edit the file with an existing Vim if possible | |
2 " Maintainer: Bram Moolenaar | |
3 " Last Change: 2016 Mar 28 | |
4 | |
5 " To use add ":packadd! editexisting" in your vimrc file. | |
6 | |
7 " This plugin serves two purposes: | |
8 " 1. On startup, if we were invoked with one file name argument and the file | |
9 " is not modified then try to find another Vim instance that is editing | |
10 " this file. If there is one then bring it to the foreground and exit. | |
11 " 2. When a file is edited and a swap file exists for it, try finding that | |
12 " other Vim and bring it to the foreground. Requires Vim 7, because it | |
13 " uses the SwapExists autocommand event. | |
14 | |
15 " Function that finds the Vim instance that is editing "filename" and brings | |
16 " it to the foreground. | |
17 func s:EditElsewhere(filename) | |
18 let fname_esc = substitute(a:filename, "'", "''", "g") | |
19 | |
20 let servers = serverlist() | |
21 while servers != '' | |
22 " Get next server name in "servername"; remove it from "servers". | |
23 let i = match(servers, "\n") | |
24 if i == -1 | |
25 let servername = servers | |
26 let servers = '' | |
27 else | |
28 let servername = strpart(servers, 0, i) | |
29 let servers = strpart(servers, i + 1) | |
30 endif | |
31 | |
32 " Skip ourselves. | |
33 if servername ==? v:servername | |
34 continue | |
35 endif | |
36 | |
37 " Check if this server is editing our file. | |
38 if remote_expr(servername, "bufloaded('" . fname_esc . "')") | |
39 " Yes, bring it to the foreground. | |
40 if has("win32") | |
41 call remote_foreground(servername) | |
42 endif | |
43 call remote_expr(servername, "foreground()") | |
44 | |
45 if remote_expr(servername, "exists('*EditExisting')") | |
46 " Make sure the file is visible in a window (not hidden). | |
47 " If v:swapcommand exists and is set, send it to the server. | |
48 if exists("v:swapcommand") | |
49 let c = substitute(v:swapcommand, "'", "''", "g") | |
50 call remote_expr(servername, "EditExisting('" . fname_esc . "', '" . c . "')") | |
51 else | |
52 call remote_expr(servername, "EditExisting('" . fname_esc . "', '')") | |
53 endif | |
54 endif | |
55 | |
56 if !(has('vim_starting') && has('gui_running') && has('gui_win32')) | |
57 " Tell the user what is happening. Not when the GUI is starting | |
58 " though, it would result in a message box. | |
59 echomsg "File is being edited by " . servername | |
60 sleep 2 | |
61 endif | |
62 return 'q' | |
63 endif | |
64 endwhile | |
65 return '' | |
66 endfunc | |
67 | |
68 " When the plugin is loaded and there is one file name argument: Find another | |
69 " Vim server that is editing this file right now. | |
70 if argc() == 1 && !&modified | |
71 if s:EditElsewhere(expand("%:p")) == 'q' | |
72 quit | |
73 endif | |
74 endif | |
75 | |
76 " Setup for handling the situation that an existing swap file is found. | |
77 try | |
78 au! SwapExists * let v:swapchoice = s:EditElsewhere(expand("<afile>:p")) | |
79 catch | |
80 " Without SwapExists we don't do anything for ":edit" commands | |
81 endtry | |
82 | |
83 " Function used on the server to make the file visible and possibly execute a | |
84 " command. | |
85 func! EditExisting(fname, command) | |
86 " Get the window number of the file in the current tab page. | |
87 let winnr = bufwinnr(a:fname) | |
88 if winnr <= 0 | |
89 " Not found, look in other tab pages. | |
90 let bufnr = bufnr(a:fname) | |
91 for i in range(tabpagenr('$')) | |
92 if index(tabpagebuflist(i + 1), bufnr) >= 0 | |
93 " Make this tab page the current one and find the window number. | |
94 exe 'tabnext ' . (i + 1) | |
95 let winnr = bufwinnr(a:fname) | |
96 break | |
97 endif | |
98 endfor | |
99 endif | |
100 | |
101 if winnr > 0 | |
102 exe winnr . "wincmd w" | |
103 elseif exists('*fnameescape') | |
104 exe "split " . fnameescape(a:fname) | |
105 else | |
106 exe "split " . escape(a:fname, " \t\n*?[{`$\\%#'\"|!<") | |
107 endif | |
108 | |
109 if a:command != '' | |
110 exe "normal! " . a:command | |
111 endif | |
112 | |
113 redraw | |
114 endfunc |