;;;;
;;;; (c) 2005 Jan Nieuwenhuizen <janneke@gnu.org>
+;; gui debug helper
+;; (define (exit x) (system "sleep 10"))
+
(use-modules
(ice-9 getopt-long)
- (ice-9 regex))
+ (ice-9 regex)
+ (srfi srfi-13)
+ (srfi srfi-14))
(define PROGRAM-NAME "lilypond-invoke-editor")
(define TOPLEVEL-VERSION "@TOPLEVEL_VERSION@")
-(define DATADIR "@DATADIR@")
+(define DATADIR "@datadir@")
(define COMPILE-TIME-PREFIX
(format #f "~a/lilypond/~a" DATADIR TOPLEVEL-VERSION))
-(define LILYPONDPREFIX (or (getenv "LILYPONDPREFIX") COMPILE-TIME-PREFIX))
+
+;; argv0 relocation -- do in wrapper?
+(define LILYPONDPREFIX
+ (or (getenv "LILYPONDPREFIX")
+ (let* ((bindir (dirname (car (command-line))))
+ (prefix (dirname bindir))
+ (lilypond-prefix
+ (if (eq? prefix (dirname DATADIR)) COMPILE-TIME-PREFIX
+ (format #f "~a/share/lilypond/~a"
+ prefix TOPLEVEL-VERSION))))
+ lilypond-prefix)))
;; gettext wrapper for guile < 1.7.2
(if (defined? 'gettext)
(format port "~a (GNU LilyPond) ~a \n" PROGRAM-NAME TOPLEVEL-VERSION))
(define (show-help port)
- (format port (_ "Usage: lilypond-invoke-editor [textedit://]FILE:LINE:COLUMN
+ (format port (_ "Usage: lilypond-invoke-editor [textedit://]FILE:LINE:CHAR:COLUMN
-Visit a file and position the cursor
+Visit a file and position the cursor.
Options:
- -h,--help show this help
- -v,--version show version
+ -h, --help show this help
+ -v, --version show version
")))
(define (parse-options args)
(define (re-sub re sub string)
(regexp-substitute/global #f re string 'pre sub 'post))
+;; FIXME: I'm going slowly but certainly mad, I really cannot find the
+;; scm library function for this.
+(define (unquote-uri uri)
+ (re-sub "%([A-Fa-f0-9]{2})"
+ (lambda (m)
+ (string (integer->char (string->number (match:substring m 1) 16))))
+ uri))
+
(define (dissect-uri uri)
(let* ((ri "textedit://")
- (file-name:line:column (re-sub ri "" uri))
- (match (string-match "([^:]+):([^:]+):(.*)" file-name:line:column)))
+ (file-name:line:char:column (re-sub ri "" uri))
+ (match (string-match "(.*):([^:]+):([^:]+):(.*)$" file-name:line:char:column)))
(if match
- (list (match:substring match 1)
+ (list (unquote-uri (match:substring match 1))
(match:substring match 2)
- (match:substring match 3))
+ (match:substring match 3)
+ (match:substring match 4))
(begin
+ ;; FIXME: why be so strict wrt :LINE:COLUMN,
+ ;; esp. considering omitting textedit:// is explicitly
+ ;; allowed.
(format (current-error-port) (_ "invalid URI: ~a") uri)
(newline (current-error-port))
- (format (current-error-port) (_ "expect: ~aFILE:LINE:COLUMN") ri)
+ (format (current-error-port) (_ "expect: ~aFILE:LINE:CHAR:COLUMN") ri)
(newline (current-error-port))
(exit 1)))))
-
+
+(define PLATFORM
+ (string->symbol
+ (string-downcase
+ (car (string-tokenize (vector-ref (uname) 0) char-set:letter)))))
+
+(define (running-from-gui?)
+ (let ((have-tty? (isatty? (current-input-port))))
+ ;; If no TTY and not using safe, assume running from GUI.
+ (not have-tty?)))
+
(define (main args)
(let ((files (parse-options args)))
+ (if (running-from-gui?)
+ (redirect-port (current-error-port)
+ (open-file (string-append
+ (or (getenv "TMP")
+ (getenv "TEMP")
+ "/tmp")
+ "/lilypond-invoke-editor.log") "a")))
(if (not (= (length files) 1))
(begin
(show-help (current-error-port))
- (exit 1)))
+ (exit 2)))
(set! %load-path (cons LILYPONDPREFIX %load-path))
(primitive-eval '(use-modules (scm editor)))
(let* ((uri (car files))