-
-
Notifications
You must be signed in to change notification settings - Fork 20
Expand file tree
/
Copy pathe
More file actions
executable file
·117 lines (98 loc) · 2.96 KB
/
e
File metadata and controls
executable file
·117 lines (98 loc) · 2.96 KB
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#!/usr/bin/env bash
# e - Custom EDITOR provider
# Uses nvim, fallback to vim, fallback to vi
#
# Supported environment variables:
# - E_DEBUG=true enable debug logging
__server="${XDG_STATE_HOME}/nvim/nvim.sock"
log() {
echo "[e] ${1}"
}
ctrl_c() {
log "Detected CTRL-C, removing nvim.sock"
rm "$__server"
local orphans
orphans=$(
# pgrep does NOT return all results
# shellcheck disable=2009
ps ux | grep -v grep | grep language-server
)
[[ -n $orphans ]] && {
log "Possible orphan language server processes:"
log "${orphans}"
}
}
main() {
! command -v nvim >/dev/null && {
local fallback
fallback="vim"
! command -v vim >/dev/null && fallback="vi"
[[ "$E_DEBUG" != "" ]] && log "Use fallback editor ${fallback}"
"$fallback" "$@"
return
}
local first="$1"
local existing
local running
# pgrep does NOT return all results
# shellcheck disable=2009
running=$(ps ux | grep -v grep | grep "nvim\.sock")
if [ -z "$running" ]; then
[[ "$E_DEBUG" != "" ]] && log "Not running"
# this happens if my neovim crashes/killed without VimLeavePre
[ -e "$__server" ] && {
[[ "$E_DEBUG" != "" ]] && log "Removing dead nvim.sock"
rm "$__server"
}
else
# remote-expr outputs to /dev/stderr for some reason
# 0.9.0 needs headless https://github.com/neovim/neovim/issues/22970
# @TODO detect multiple instances and pick correct server
# https://github.com/neovim/neovim/issues/21600
existing=$(nvim \
--headless \
--server "$__server" \
--remote-expr "execute('echo v:servername')" \
2>&1 | xargs)
[[ "$E_DEBUG" != "" ]] && log "Found running $existing"
fi
# New server, empty
[ "$existing" != "$__server" ] && [ -z "$first" ] && {
[[ "$E_DEBUG" != "" ]] && log "New server ${__server} with empty file"
nvim --listen "$__server" +enew
return
}
typeset -a files=()
for file in "$@"; do
# don't prepend PWD for absolute paths
case "$file" in
/*) ;;
*) file="${PWD}/${file}" ;;
esac
files+=("$file")
done
# New server with files
[ "$existing" != "$__server" ] && {
[[ "$E_DEBUG" != "" ]] &&
log "New server ${__server} (did not match ${existing}) with ${files[*]}"
nvim --listen "$__server" "${files[@]}"
return
}
# ==========================================================================
# use existing server
# ==========================================================================
# 0.9.0 needs headless https://github.com/neovim/neovim/issues/22970
nvim \
--headless \
--server "$__server" \
--remote-expr "execute('DKOExternal')"
if [ -z "$first" ]; then
[[ "$E_DEBUG" != "" ]] && log "No file given, surface existing server"
nvim --server "$__server" --remote-send '<C-\><C-N><Cmd>e<CR>'
return
fi
[[ "$E_DEBUG" != "" ]] && log "Use server ${__server} with ${file[*]}"
nvim --server "$__server" --remote-silent "${files[@]}"
}
trap ctrl_c INT
main "$@"