summaryrefslogtreecommitdiff
path: root/emacs-helm.sh
blob: 094878a349d2e0cb18b10269aba724d564d03519 (plain)
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
#!/usr/bin/env sh


## Copyright (C) 2012 ~ 2021 Thierry Volpiatto <thierry.volpiatto@gmail.com>
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with this program.  If not, see <http://www.gnu.org/licenses/>.

## Commentary:
# Preconfigured `emacs -Q' with a basic Helm configuration.


# If TEMP env var exists, use it, otherwise declare it.
test -z "$TEMP" && TEMP="/tmp"

CONF_FILE="$TEMP/helm-cfg.el"
EMACS=emacs
TOOLBARS=-1
LOAD_PACKAGES=

usage () {
    cat >&1 <<EOF
Usage: ${0##*/} [-P PATH] [--toolbars] [--load-packages pkgs] [-h] [EMACS-OPTIONS-OR-FILENAME]

-P --path        Specify path to emacs
-B --toolbars    Display Menu bar, scroll bar etc...
--load-packages  Load specified M/Elpa packages (separate with ",")
-h               Display this help and exit

Any other Emacs options or filename must come after.

Emacs options:

Initialization options:

--chdir DIR                 change to directory DIR
--daemon, --bg-daemon[=NAME] start a (named) server in the background
--fg-daemon[=NAME]          start a (named) server in the foreground
--debug-init                enable Emacs Lisp debugger for init file
--display, -d DISPLAY       use X server DISPLAY
--no-build-details          do not add build details such as time stamps
--no-loadup, -nl            do not load loadup.el into bare Emacs
--no-site-file              do not load site-start.el
--no-x-resources            do not load X resources
--no-window-system, -nw     do not communicate with X, ignoring $DISPLAY
--script FILE               run FILE as an Emacs Lisp script
--terminal, -t DEVICE       use DEVICE for terminal I/O

Action options:

FILE                    visit FILE
+LINE                   go to line LINE in next FILE
+LINE:COLUMN            go to line LINE, column COLUMN, in next FILE
--directory, -L DIR     prepend DIR to load-path (with :DIR, append DIR)
--file FILE             visit FILE
--find-file FILE        visit FILE
--funcall, -f FUNC      call Emacs Lisp function FUNC with no arguments
--insert FILE           insert contents of FILE into current buffer
--load, -l FILE         load Emacs Lisp FILE using the load function
--visit FILE            visit FILE

Display options:

--background-color, -bg COLOR   window background color
--basic-display, -D             disable many display features;
                                  used for debugging Emacs
--border-color, -bd COLOR       main border color
--border-width, -bw WIDTH       width of main border
--color, --color=MODE           override color mode for character terminals;
                                  MODE defaults to \`auto', and
                                  can also be \`never', \`always',
                                  or a mode name like \`ansi8'
--cursor-color, -cr COLOR       color of the Emacs cursor indicating point
--font, -fn FONT                default font; must be fixed-width
--foreground-color, -fg COLOR   window foreground color
--fullheight, -fh               make the first frame high as the screen
--fullscreen, -fs               make the first frame fullscreen
--fullwidth, -fw                make the first frame wide as the screen
--maximized, -mm                make the first frame maximized
--geometry, -g GEOMETRY         window geometry
--iconic                        start Emacs in iconified state
--internal-border, -ib WIDTH    width between text and main border
--line-spacing, -lsp PIXELS     additional space to put between lines
--mouse-color, -ms COLOR        mouse cursor color in Emacs window
--name NAME                     title for initial Emacs frame
--reverse-video, -r, -rv        switch foreground and background
--title, -T TITLE               title for initial Emacs frame
--vertical-scroll-bars, -vb     enable vertical scroll bars
--xrm XRESOURCES                set additional X resources
--parent-id XID                 set parent window
--help                          display this help and exit
--version                       output version information and exit

You can generally also specify long option names with a single -; for
example, -batch as well as --batch.  You can use any unambiguous
abbreviation for a --option.

Various environment variables and window system resources also affect
the operation of Emacs.  See the main documentation.
EOF
         }

for a in "$@"; do
    case $a in
        --path | -P)
            shift 1
            EMACS="$1"
            shift 1
            ;;
        --toolbars | -B)
            shift 1
            TOOLBARS=1
            ;;
        --load-packages)
            shift 1
            LOAD_PACKAGES="$1"
            shift 1
            ;;
        -h)
            usage
            exit 1
            ;;
    esac
done

LOAD_PATH=$($EMACS -q -batch --eval "(prin1 load-path)")

cd "${0%/*}" || exit 1

# Check if autoload file exists.
# It may be in a different directory if emacs-helm.sh is a symlink.
TRUENAME=$(ls -l "$0" | awk '{print $11}')
if [ ! -z "$TRUENAME" ]; then
    AUTO_FILE="${TRUENAME%/*}/helm-autoloads.el"
else
    AUTO_FILE="helm-autoloads.el"
fi
if [ ! -e "$AUTO_FILE" ]; then
    echo No autoloads found, please run make first to generate autoload file
    exit 1
fi


cat > $CONF_FILE <<EOF
(setq initial-scratch-message (concat initial-scratch-message
";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\\n\
;; This Emacs is Powered by \`HELM' using\\n\
;; emacs program \"$EMACS\".\\n\
;; This is a minimal \`helm' configuration to discover \`helm' or debug it.\\n\
;; You can retrieve this minimal configuration in \"$CONF_FILE\".\\n\
;;
;; Some original Emacs commands are replaced by their \`helm' counterparts:\\n\\n\
;; - \`find-file'(C-x C-f)            =>\`helm-find-files'\\n\
;; - \`occur'(M-s o)                  =>\`helm-occur'\\n\
;; - \`list-buffers'(C-x C-b)         =>\`helm-buffers-list'\\n\
;; - \`completion-at-point'(M-tab)    =>\`helm-lisp-completion-at-point'[1]\\n\
;; - \`apropos-command'(C-h a)        =>\`helm-apropos'\\n\
;; - \`dabbrev-expand'(M-/)           =>\`helm-dabbrev'\\n\
;; - \`execute-extended-command'(M-x) =>\`helm-M-x'\\n\\n
;; Some other Emacs commands are \"helmized\" by \`helm-mode'.\\n\
;; [1] Coming with emacs-24.4, \`completion-at-point' is \"helmized\" by \`helm-mode'\\n\

;; which provides Helm completion in many places like \`shell-mode'.\\n\
;; Find context help for most Helm commands with \`C-h m'.\\n\
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;\\n\\n"))

(setq load-path (quote $LOAD_PATH))

(defvar default-package-manager nil)
(defvar bootstrap-version)
(let* ((packages "$LOAD_PACKAGES")
       (pkg-list (and packages
                      (not (equal packages ""))
                      (split-string packages ",")))
       (straight-path (expand-file-name "straight/build/" user-emacs-directory))
       (async-path (expand-file-name "straight/build/async" user-emacs-directory))
       (bootstrap-file
        (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
       (bootstrap-version 5))
  (when (file-exists-p bootstrap-file)
    (setq default-package-manager 'straight)
    (load bootstrap-file nil 'nomessage)
    (add-to-list 'load-path async-path)
    (when pkg-list
      (dolist (pkg pkg-list)
        (let* ((pkg-path (expand-file-name pkg straight-path))
               (autoload-file (expand-file-name
                               (format "%s-autoloads.el" pkg)
                               pkg-path)))
          (add-to-list 'load-path pkg-path)
          (if (file-exists-p autoload-file)
              (load autoload-file nil 'nomessage)
            (straight-use-package (intern pkg))))))))

(unless (eq default-package-manager 'straight)
  (require 'package)
  ;; User may be using a non standard \`package-user-dir'.
  ;; Modify \`package-directory-list' instead of \`package-user-dir'
  ;; in case the user starts Helm from a non-ELPA installation.
  (unless (file-equal-p package-user-dir (locate-user-emacs-file "elpa"))
    (add-to-list 'package-directory-list (directory-file-name
                                          (file-name-directory
                                           (directory-file-name default-directory)))))

  (let* ((str-lst "$LOAD_PACKAGES")
         (load-packages (and str-lst
                             (not (string= str-lst ""))
                             (split-string str-lst ","))))
    (setq package-load-list
          (if (equal load-packages '("all"))
              '(all)
            (append '((helm-core t) (helm t) (async t) (popup t))
                    (mapcar (lambda (p) (list (intern p) t)) load-packages)))))

  (package-initialize))

(add-to-list 'load-path (file-name-directory (file-truename "$0")))

(unless (> $TOOLBARS 0)
   (setq default-frame-alist '((vertical-scroll-bars . nil)
                               (tool-bar-lines . 0)
                               (menu-bar-lines . 0)
                               (fullscreen . nil))))
(blink-cursor-mode -1)
(require 'helm-config)
(helm-mode 1)
(define-key global-map [remap find-file] 'helm-find-files)
(define-key global-map [remap occur] 'helm-occur)
(define-key global-map [remap list-buffers] 'helm-buffers-list)
(define-key global-map [remap dabbrev-expand] 'helm-dabbrev)
(define-key global-map [remap execute-extended-command] 'helm-M-x)
(define-key global-map [remap apropos-command] 'helm-apropos)
(unless (boundp 'completion-in-region-function)
  (define-key lisp-interaction-mode-map [remap completion-at-point] 'helm-lisp-completion-at-point)
  (define-key emacs-lisp-mode-map       [remap completion-at-point] 'helm-lisp-completion-at-point))
(add-hook 'kill-emacs-hook #'(lambda () (and (file-exists-p "$CONF_FILE") (delete-file "$CONF_FILE"))))
EOF

$EMACS -Q -l "$CONF_FILE" "$@"