From 5d025413767efe93bebe3cadbaeb7906a150d50b Mon Sep 17 00:00:00 2001 From: Christophe Rhodes Date: Fri, 14 Mar 2014 16:26:35 +0000 Subject: [PATCH] implement swank-c-p-c now users with c-p-c completion style can rejoice! Matching is a little hacky, but not too surprising. --- swank-c-p-c.R | 15 +++++++++++++ swank.R | 61 +++++++++++++++++++++++++++------------------------ 2 files changed, 47 insertions(+), 29 deletions(-) create mode 100644 swank-c-p-c.R diff --git a/swank-c-p-c.R b/swank-c-p-c.R new file mode 100644 index 0000000..8d33184 --- /dev/null +++ b/swank-c-p-c.R @@ -0,0 +1,15 @@ +`swank:completions` <- function(slimeConnection, sldbState, prefix, package) { + bits <- strsplit(prefix, "(?=[A-Z._])", perl=TRUE)[[1]]; + lrx <- literal2rx(bits) + ## FIXME: this includes slightly too much .*, because the strsplit + ## seems to split before /and/ after the match. + rx <- paste(lrx, collapse=".*") + matches <- apropos(sprintf("^%s", rx), ignore.case=FALSE) + nmatches <- length(matches) + if((nmatches == 0) && ((dollar <- regexpr("$", prefix, fixed=TRUE)) > -1)) { + + symbolFieldsCompletion(globalenv(), prefix, prefix) + } else { + returnMatches(matches) + } +} diff --git a/swank.R b/swank.R index 67fdbbc..d845824 100644 --- a/swank.R +++ b/swank.R @@ -470,43 +470,46 @@ computeRestartsForEmacs <- function (sldbState) { list()) } -`swank:simple-completions` <- function(slimeConnection, sldbState, prefix, package) { - symbolFieldsCompletion <- function(object, rest) { - ## FIXME: this is hacky, ignoring several syntax issues (use of - ## and/or necessity for backquoting identifiers: e.g. fields - ## containing hyphens) - if((dollar <- regexpr("$", rest, fixed=TRUE)) == -1) { - matches <- grep(sprintf("^%s", literal2rx(rest)), names(object), value=TRUE) - matches <- sprintf("%s$%s", gsub("\\$[^$]*$", "", prefix), matches) - returnMatches(matches) +symbolFieldsCompletion <- function(object, prefix, rest) { + ## FIXME: this is hacky, ignoring several syntax issues (use of + ## and/or necessity for backquoting identifiers: e.g. fields + ## containing hyphens) + if((dollar <- regexpr("$", rest, fixed=TRUE)) == -1) { + matches <- grep(sprintf("^%s", literal2rx(rest)), names(object), value=TRUE) + matches <- sprintf("%s$%s", gsub("\\$[^$]*$", "", prefix), matches) + returnMatches(matches) + } else { + if(exists(substr(rest, 1, dollar-1), object)) { + symbolFieldsCompletion(get(substr(rest, 1, dollar-1), object), prefix, substr(rest, dollar+1, nchar(rest))) } else { - if(exists(substr(rest, 1, dollar-1), object)) { - symbolFieldsCompletion(get(substr(rest, 1, dollar-1), object), substr(rest, dollar+1, nchar(rest))) - } else { - returnMatches(character(0)) - } + returnMatches(character(0)) } } - returnMatches <- function(matches) { - nmatches <- length(matches) - if(nmatches == 0) { - list(list(), "") - } else { - longest <- matches[order(nchar(matches))][1] - while(length(grep(sprintf("^%s", literal2rx(longest)), matches)) < nmatches) { - longest <- substr(longest, 1, nchar(longest)-1) - } - list(as.list(matches), longest) +} + +returnMatches <- function(matches) { + nmatches <- length(matches) + if(nmatches == 0) { + list(list(), "") + } else { + longest <- matches[order(nchar(matches))][1] + while(length(grep(sprintf("^%s", literal2rx(longest)), matches)) < nmatches) { + longest <- substr(longest, 1, nchar(longest)-1) } + list(as.list(matches), longest) } - literal2rx <- function(string) { - ## list of ERE metacharacters from ?regexp - gsub("([.\\|()[{^$*+?])", "\\\\\\1", string) - } +} + +literal2rx <- function(string) { + ## list of ERE metacharacters from ?regexp + gsub("([.\\|()[{^$*+?])", "\\\\\\1", string) +} + +`swank:simple-completions` <- function(slimeConnection, sldbState, prefix, package) { matches <- apropos(sprintf("^%s", literal2rx(prefix)), ignore.case=FALSE) nmatches <- length(matches) if((nmatches == 0) && ((dollar <- regexpr("$", prefix, fixed=TRUE)) > -1)) { - symbolFieldsCompletion(globalenv(), prefix) + symbolFieldsCompletion(globalenv(), prefix, prefix) } else { returnMatches(matches) } -- 2.30.2