Add emacs directory

git-svn-id: http://photonzero.com/dotfiles/trunk@54 23f722f6-122a-0410-8cef-c75bd312dd78
This commit is contained in:
michener 2010-08-12 01:19:45 +00:00
parent e50f8f4bc8
commit 5b6729933d
100 changed files with 37586 additions and 0 deletions

56
.emacs.d/ac-comphist.dat Normal file
View file

@ -0,0 +1,56 @@
((("color-theme-barak" .
[3 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0])
("else" .
[1 0 0 0])
("if" .
[1 0])
(":bold" .
[1 0 0 0 0])
("set-default" .
[0 0 0 1 0 0 0 0 0 0 0])
("argc" .
[1 0 1 0])
("int" .
[2 0 0])
("return" .
[0 0 0 1 0 0])
("require" .
[3 0 0 1 0 0 2])
("auto" .
[1 0 0 0])
("ac-expand" .
[1 0 0 0 0 0 0 0 1])
("rest" .
[0 0 0 3])
("first" .
[0 0 0 0 2])
("ac-complete" .
[1 0 0 0 0 0 1 0 0 0 0])
("ac-completing-map" .
[0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0])
("setq" .
[2 0 0 1])
("autoload" .
[0 0 0 1 0 0 0 0])
("ac-auto-start" .
[0 0 0 0 0 0 0 0 0 0 0 0 1])
("nil" .
[2 0 0])
("defun" .
[0 0 0 1 0])
("ac-dwim" .
[0 0 0 0 0 0 1])
("t" .
[1])
("set-buffer" .
[0 0 0 1 0 0 0 0 0 0])
("ac-expand-on-auto-complete" .
[0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0])
("setcdr" .
[0 0 0 1 0 0])
("color-theme-blackboard" .
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1])
("color-theme-tangotango" .
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0])
("color-theme-tty-dark" .
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0 0 0])))

View file

@ -0,0 +1,24 @@
VERSION=`perl -ne 'print $$1 if /;; Version: (.*)/' auto-complete.el`
PACKAGE=auto-complete-${VERSION}
byte-compile:
emacs -Q -L . -batch -f batch-byte-compile *.el
install:
emacs -Q -L . -batch -l etc/install ${DIR}
clean:
rm -f *.elc
rm -f doc/*.html
rm -rf ${PACKAGE}
rm -f ${PACKAGE}.zip ${PACKAGE}.tar.bz2
package: clean
mkdir ${PACKAGE}
cp -r *.el Makefile README.txt TODO.txt doc etc dict ${PACKAGE}
tar.bz2: package
tar cjf ${PACKAGE}.tar.bz2 ${PACKAGE}
zip: package
zip -r ${PACKAGE}.zip ${PACKAGE}

View file

@ -0,0 +1,13 @@
Auto Complete Mode
==================
Documentation
-------------
* http://cx4a.org/software/auto-complete/
* doc/index.txt
License
-------
Auto Complete Mode is distributed under the term of GPLv3. And its documentations under doc directory is distributed under the term of GFDL.

View file

@ -0,0 +1,10 @@
- etags, ctags
- emacswiki
- test facility
- support composed chars
- minibuffer completion
- performance issue (cache issue)
- asynchronous processing
- kanji henkan support
- create menu if needed
- quick help positioning on tabs (bug)

View file

@ -0,0 +1,480 @@
;;; auto-complete-config.el --- auto-complete additional configuations
;; Copyright (C) 2009, 2010 Tomohiro Matsuyama
;; Author: Tomohiro Matsuyama <m2ym.pub@gmail.com>
;; Keywords: convenience
;; Version: 1.3
;; 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:
;;
;;; Code:
(eval-when-compile
(require 'cl))
(require 'auto-complete)
;;;; Additional sources
;; imenu
(defvar ac-imenu-index nil)
(ac-clear-variable-every-10-minutes 'ac-imenu-index)
(defun ac-imenu-candidates ()
(loop with i = 0
with stack = (progn
(unless (local-variable-p 'ac-imenu-index)
(make-local-variable 'ac-imenu-index))
(or ac-imenu-index
(setq ac-imenu-index
(ignore-errors
(with-no-warnings
(imenu--make-index-alist))))))
with result
while (and stack (or (not (integerp ac-limit))
(< i ac-limit)))
for node = (pop stack)
if (consp node)
do
(let ((car (car node))
(cdr (cdr node)))
(if (consp cdr)
(mapc (lambda (child)
(push child stack))
cdr)
(when (and (stringp car)
(string-match (concat "^" (regexp-quote ac-prefix)) car))
;; Remove extra characters
(if (string-match "^.*\\(()\\|=\\|<>\\)$" car)
(setq car (substring car 0 (match-beginning 1))))
(push car result)
(incf i))))
finally return (nreverse result)))
(ac-define-source imenu
'((depends imenu)
(candidates . ac-imenu-candidates)
(symbol . "s")))
;; gtags
(defface ac-gtags-candidate-face
'((t (:background "lightgray" :foreground "navy")))
"Face for gtags candidate"
:group 'auto-complete)
(defface ac-gtags-selection-face
'((t (:background "navy" :foreground "white")))
"Face for the gtags selected candidate."
:group 'auto-complete)
(defun ac-gtags-candidate ()
(ignore-errors
(split-string (shell-command-to-string (format "global -ci %s" ac-prefix)) "\n")))
(ac-define-source gtags
'((candidates . ac-gtags-candidate)
(candidate-face . ac-gtags-candidate-face)
(selection-face . ac-gtags-selection-face)
(requires . 3)
(symbol . "s")))
;; yasnippet
(defface ac-yasnippet-candidate-face
'((t (:background "sandybrown" :foreground "black")))
"Face for yasnippet candidate."
:group 'auto-complete)
(defface ac-yasnippet-selection-face
'((t (:background "coral3" :foreground "white")))
"Face for the yasnippet selected candidate."
:group 'auto-complete)
(defun ac-yasnippet-table-hash (table)
(cond
((fboundp 'yas/snippet-table-hash)
(yas/snippet-table-hash table))
((fboundp 'yas/table-hash)
(yas/table-hash table))))
(defun ac-yasnippet-table-parent (table)
(cond
((fboundp 'yas/snippet-table-parent)
(yas/snippet-table-parent table))
((fboundp 'yas/table-parent)
(yas/table-parent table))))
(defun ac-yasnippet-candidate-1 (table)
(with-no-warnings
(let ((hashtab (ac-yasnippet-table-hash table))
(parent (ac-yasnippet-table-parent table))
candidates)
(maphash (lambda (key value)
(push key candidates))
hashtab)
(setq candidates (all-completions ac-prefix (nreverse candidates)))
(if parent
(setq candidates
(append candidates (ac-yasnippet-candidate-1 parent))))
candidates)))
(defun ac-yasnippet-candidates ()
(with-no-warnings
(if (fboundp 'yas/get-snippet-tables)
;; >0.6.0
(apply 'append (mapcar 'ac-yasnippet-candidate-1 (yas/get-snippet-tables major-mode)))
(let ((table
(if (fboundp 'yas/snippet-table)
;; <0.6.0
(yas/snippet-table major-mode)
;; 0.6.0
(yas/current-snippet-table))))
(if table
(ac-yasnippet-candidate-1 table))))))
(ac-define-source yasnippet
'((depends yasnippet)
(candidates . ac-yasnippet-candidates)
(action . yas/expand)
(candidate-face . ac-yasnippet-candidate-face)
(selection-face . ac-yasnippet-selection-face)
(symbol . "a")))
;; semantic
(defun ac-semantic-candidates (prefix)
(with-no-warnings
(delete "" ; semantic sometimes returns an empty string
(mapcar 'semantic-tag-name
(ignore-errors
(or (semantic-analyze-possible-completions
(semantic-analyze-current-context))
(senator-find-tag-for-completion prefix)))))))
(ac-define-source semantic
'((available . (or (require 'semantic-ia nil t)
(require 'semantic/ia nil t)))
(candidates . (ac-semantic-candidates ac-prefix))
(prefix . c-dot-ref)
(requires . 0)
(symbol . "m")))
(ac-define-source semantic-raw
'((available . (or (require 'semantic-ia nil t)
(require 'semantic/ia nil t)))
(candidates . (ac-semantic-candidates ac-prefix))
(symbol . "s")))
;; eclim
(defun ac-eclim-candidates ()
(with-no-warnings
(loop for c in (eclim/java-complete)
collect (nth 1 c))))
(ac-define-source eclim
'((candidates . ac-eclim-candidates)
(prefix . c-dot)
(requires . 0)
(symbol . "f")))
;; css
;; Copied from company-css.el
(defconst ac-css-property-alist
;; see http://www.w3.org/TR/CSS21/propidx.html
'(("azimuth" angle "left-side" "far-left" "left" "center-left" "center"
"center-right" "right" "far-right" "right-side" "behind" "leftwards"
"rightwards")
("background" background-color background-image background-repeat
background-attachment background-position)
("background-attachment" "scroll" "fixed")
("background-color" color "transparent")
("background-image" uri "none")
("background-position" percentage length "left" "center" "right" percentage
length "top" "center" "bottom" "left" "center" "right" "top" "center"
"bottom")
("background-repeat" "repeat" "repeat-x" "repeat-y" "no-repeat")
("border" border-width border-style border-color)
("border-bottom" border)
("border-bottom-color" border-color)
("border-bottom-style" border-style)
("border-bottom-width" border-width)
("border-collapse" "collapse" "separate")
("border-color" color "transparent")
("border-left" border)
("border-left-color" border-color)
("border-left-style" border-style)
("border-left-width" border-width)
("border-right" border)
("border-right-color" border-color)
("border-right-style" border-style)
("border-right-width" border-width)
("border-spacing" length length)
("border-style" border-style)
("border-top" border)
("border-top-color" border-color)
("border-top-style" border-style)
("border-top-width" border-width)
("border-width" border-width)
("bottom" length percentage "auto")
("caption-side" "top" "bottom")
("clear" "none" "left" "right" "both")
("clip" shape "auto")
("color" color)
("content" "normal" "none" string uri counter "attr()" "open-quote"
"close-quote" "no-open-quote" "no-close-quote")
("counter-increment" identifier integer "none")
("counter-reset" identifier integer "none")
("cue" cue-before cue-after)
("cue-after" uri "none")
("cue-before" uri "none")
("cursor" uri "*" "auto" "crosshair" "default" "pointer" "move" "e-resize"
"ne-resize" "nw-resize" "n-resize" "se-resize" "sw-resize" "s-resize"
"w-resize" "text" "wait" "help" "progress")
("direction" "ltr" "rtl")
("display" "inline" "block" "list-item" "run-in" "inline-block" "table"
"inline-table" "table-row-group" "table-header-group" "table-footer-group"
"table-row" "table-column-group" "table-column" "table-cell"
"table-caption" "none")
("elevation" angle "below" "level" "above" "higher" "lower")
("empty-cells" "show" "hide")
("float" "left" "right" "none")
("font" font-style font-variant font-weight font-size "/" line-height
font-family "caption" "icon" "menu" "message-box" "small-caption"
"status-bar")
("font-family" family-name generic-family)
("font-size" absolute-size relative-size length percentage)
("font-style" "normal" "italic" "oblique")
("font-variant" "normal" "small-caps")
("font-weight" "normal" "bold" "bolder" "lighter" "100" "200" "300" "400"
"500" "600" "700" "800" "900")
("height" length percentage "auto")
("left" length percentage "auto")
("letter-spacing" "normal" length)
("line-height" "normal" number length percentage)
("list-style" list-style-type list-style-position list-style-image)
("list-style-image" uri "none")
("list-style-position" "inside" "outside")
("list-style-type" "disc" "circle" "square" "decimal" "decimal-leading-zero"
"lower-roman" "upper-roman" "lower-greek" "lower-latin" "upper-latin"
"armenian" "georgian" "lower-alpha" "upper-alpha" "none")
("margin" margin-width)
("margin-bottom" margin-width)
("margin-left" margin-width)
("margin-right" margin-width)
("margin-top" margin-width)
("max-height" length percentage "none")
("max-width" length percentage "none")
("min-height" length percentage)
("min-width" length percentage)
("orphans" integer)
("outline" outline-color outline-style outline-width)
("outline-color" color "invert")
("outline-style" border-style)
("outline-width" border-width)
("overflow" "visible" "hidden" "scroll" "auto")
("padding" padding-width)
("padding-bottom" padding-width)
("padding-left" padding-width)
("padding-right" padding-width)
("padding-top" padding-width)
("page-break-after" "auto" "always" "avoid" "left" "right")
("page-break-before" "auto" "always" "avoid" "left" "right")
("page-break-inside" "avoid" "auto")
("pause" time percentage)
("pause-after" time percentage)
("pause-before" time percentage)
("pitch" frequency "x-low" "low" "medium" "high" "x-high")
("pitch-range" number)
("play-during" uri "mix" "repeat" "auto" "none")
("position" "static" "relative" "absolute" "fixed")
("quotes" string string "none")
("richness" number)
("right" length percentage "auto")
("speak" "normal" "none" "spell-out")
("speak-header" "once" "always")
("speak-numeral" "digits" "continuous")
("speak-punctuation" "code" "none")
("speech-rate" number "x-slow" "slow" "medium" "fast" "x-fast" "faster"
"slower")
("stress" number)
("table-layout" "auto" "fixed")
("text-align" "left" "right" "center" "justify")
("text-decoration" "none" "underline" "overline" "line-through" "blink")
("text-indent" length percentage)
("text-transform" "capitalize" "uppercase" "lowercase" "none")
("top" length percentage "auto")
("unicode-bidi" "normal" "embed" "bidi-override")
("vertical-align" "baseline" "sub" "super" "top" "text-top" "middle"
"bottom" "text-bottom" percentage length)
("visibility" "visible" "hidden" "collapse")
("voice-family" specific-voice generic-voice "*" specific-voice
generic-voice)
("volume" number percentage "silent" "x-soft" "soft" "medium" "loud"
"x-loud")
("white-space" "normal" "pre" "nowrap" "pre-wrap" "pre-line")
("widows" integer)
("width" length percentage "auto")
("word-spacing" "normal" length)
("z-index" "auto" integer))
"A list of CSS properties and their possible values.")
(defconst ac-css-value-classes
'((absolute-size "xx-small" "x-small" "small" "medium" "large" "x-large"
"xx-large")
(border-style "none" "hidden" "dotted" "dashed" "solid" "double" "groove"
"ridge" "inset" "outset")
(color "aqua" "black" "blue" "fuchsia" "gray" "green" "lime" "maroon" "navy"
"olive" "orange" "purple" "red" "silver" "teal" "white" "yellow"
"rgb")
(counter "counter")
(family-name "Courier" "Helvetica" "Times")
(generic-family "serif" "sans-serif" "cursive" "fantasy" "monospace")
(generic-voice "male" "female" "child")
(margin-width "auto") ;; length percentage
(relative-size "larger" "smaller")
(shape "rect")
(uri "url"))
"A list of CSS property value classes and their contents.")
(defconst ac-css-pseudo-classes
'("active" "after" "before" "first" "first-child" "first-letter" "first-line"
"focus" "hover" "lang" "left" "link" "right" "visited")
"Identifiers for CSS pseudo-elements and pseudo-classes.")
(defvar ac-css-property nil
"Current editing property.")
(defun ac-css-prefix ()
(when (save-excursion (re-search-backward "\\_<\\(.+?\\)\\_>\\s *:.*\\=" nil t))
(setq ac-css-property (match-string 1))
(or (ac-prefix-symbol) (point))))
(defun ac-css-property-candidates ()
(or (loop with list = (assoc-default ac-css-property ac-css-property-alist)
with value
while (setq value (pop list))
if (symbolp value)
do (setq list
(append list
(or (assoc-default value ac-css-value-classes)
(assoc-default (symbol-name value) ac-css-property-alist))))
else collect value)
ac-css-pseudo-classes))
(defvar ac-source-css-property
'((candidates . ac-css-property-candidates)
(prefix . ac-css-prefix)
(requires . 0)))
;;;; Not maintained sources
;; ropemacs
(defvar ac-ropemacs-loaded nil)
(defun ac-ropemacs-require ()
(with-no-warnings
(unless ac-ropemacs-loaded
(pymacs-load "ropemacs" "rope-")
(if (boundp 'ropemacs-enable-autoimport)
(setq ropemacs-enable-autoimport t))
(setq ac-ropemacs-loaded t))))
(defun ac-ropemacs-setup ()
(ac-ropemacs-require)
;(setq ac-sources (append (list 'ac-source-ropemacs) ac-sources))
(setq ac-omni-completion-sources '(("\\." ac-source-ropemacs))))
(defun ac-ropemacs-initialize ()
(autoload 'pymacs-apply "pymacs")
(autoload 'pymacs-call "pymacs")
(autoload 'pymacs-eval "pymacs" nil t)
(autoload 'pymacs-exec "pymacs" nil t)
(autoload 'pymacs-load "pymacs" nil t)
(add-hook 'python-mode-hook 'ac-ropemacs-setup)
t)
(defvar ac-ropemacs-completions-cache nil)
(defvar ac-source-ropemacs
'((init
. (lambda ()
(setq ac-ropemacs-completions-cache
(mapcar
(lambda (completion)
(concat ac-prefix completion))
(ignore-errors
(rope-completions))))))
(candidates . ac-ropemacs-completions-cache)))
;; rcodetools
(defvar ac-source-rcodetools
'((init . (lambda ()
(require 'rcodetools)
(condition-case x
(save-excursion
(rct-exec-and-eval rct-complete-command-name "--completion-emacs-icicles"))
(error) (setq rct-method-completion-table nil))))
(candidates . (lambda ()
(all-completions
ac-prefix
(mapcar
(lambda (completion)
(replace-regexp-in-string "\t.*$" "" (car completion)))
rct-method-completion-table))))))
;;;; Default settings
(defun ac-common-setup ()
(add-to-list 'ac-sources 'ac-source-filename))
(defun ac-emacs-lisp-mode-setup ()
(setq ac-sources (append '(ac-source-features ac-source-functions ac-source-yasnippet ac-source-variables ac-source-symbols) ac-sources)))
(defun ac-cc-mode-setup ()
(setq ac-sources (append '(ac-source-yasnippet ac-source-gtags) ac-sources)))
(defun ac-ruby-mode-setup ()
(make-local-variable 'ac-ignores)
(add-to-list 'ac-ignores "end"))
(defun ac-css-mode-setup ()
(setq ac-sources (append '(ac-source-css-property) ac-sources)))
(defun ac-config-default ()
(setq-default ac-sources '(ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers))
(add-hook 'emacs-lisp-mode-hook 'ac-emacs-lisp-mode-setup)
(add-hook 'c-mode-common-hook 'ac-cc-mode-setup)
(add-hook 'ruby-mode-hook 'ac-ruby-mode-setup)
(add-hook 'css-mode-hook 'ac-css-mode-setup)
(add-hook 'auto-complete-mode-hook 'ac-common-setup)
(global-auto-complete-mode t))
(provide 'auto-complete-config)
;;; auto-complete-config.el ends here

Binary file not shown.

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -0,0 +1,74 @@
and
and_eq
asm
auto
bitand
bitor
bool
break
case
catch
char
class
compl
const
const_cast
continue
default
delete
do
double
dynamic_cast
else
enum
explicit
export
extern
false
float
for
friend
goto
if
inline
int
long
mutable
namespace
new
not
not_eq
operator
or
or_eq
private
protected
public
register
reinterpret_cast
return
short
signed
sizeof
static
static_cast
struct
switch
template
this
throw
true
try
typedef
typeid
typename
union
unsigned
using
virtual
void
volatile
wchar_t
while
xor
xor_eq

View file

@ -0,0 +1,37 @@
auto
_Bool
break
case
char
_Complex
const
continue
default
do
double
else
enum
extern
float
for
goto
if
_Imaginary
inline
int
long
register
restrict
return
short
signed
sizeof
static
struct
switch
typedef
union
unsigned
void
volatile
while

View file

@ -0,0 +1,475 @@
*agent*
*clojure-version*
*command-line-args*
*compile-files*
*compile-path*
*err*
*file*
*flush-on-newline*
*in*
*ns*
*out*
*print-dup*
*print-length*
*print-level*
*print-meta*
*print-readably*
*read-eval*
*warn-on-reflection*
accessor
aclone
add-classpath
add-watch
agent
agent-error
agent-errors
aget
alength
alias
all-ns
alter
alter-meta!
alter-var-root
amap
ancestors
and
apply
areduce
array-map
aset
aset-boolean
aset-byte
aset-char
aset-double
aset-float
aset-int
aset-long
aset-short
assert
assoc
assoc!
assoc-in
associative?
atom
await
await-for
bases
bean
bigdec
bigint
binding
bit-and
bit-and-not
bit-clear
bit-flip
bit-not
bit-or
bit-set
bit-shift-left
bit-shift-right
bit-test
bit-xor
boolean
boolean-array
booleans
bound-fn
bound-fn*
butlast
byte
byte-array
bytes
case
cast
char
char-array
char-escape-string
char-name-string
char?
chars
class
class?
clear-agent-errors
clojure-version
coll?
comment
commute
comp
comparator
compare
compare-and-set!
compile
complement
concat
cond
condp
conj
conj!
cons
constantly
construct-proxy
contains?
count
counted?
create-ns
create-struct
cycle
dec
decimal?
declare
definline
defmacro
defmethod
defmulti
defn
defn-
defonce
defprotocol
defstruct
deftype
delay
delay?
deliver
deref
derive
descendants
disj
disj!
dissoc
dissoc!
distinct
distinct?
doall
doc
dorun
doseq
dosync
dotimes
doto
double
double-array
doubles
drop
drop-last
drop-while
dtype
empty
empty?
ensure
enumeration-seq
error-handler
error-mode
eval
even?
every?
extend
extend-class
extend-protocol
extend-type
extenders
extends?
false?
ffirst
file-seq
filter
find
find-doc
find-ns
find-var
first
float
float-array
float?
floats
flush
fn
fn?
fnext
for
force
format
future
future-call
future-cancel
future-cancelled?
future-done?
future?
gen-class
gen-interface
gensym
get
get-in
get-method
get-proxy-class
get-thread-bindings
get-validator
hash
hash-map
hash-set
identical?
identity
if-let
if-not
ifn?
import
in-ns
inc
init-proxy
instance?
int
int-array
integer?
interleave
intern
interpose
into
into-array
ints
io!
isa?
iterate
iterator-seq
juxt
key
keys
keyword
keyword?
last
lazy-cat
lazy-seq
let
letfn
line-seq
list
list*
list?
load
load-file
load-reader
load-string
loaded-libs
locking
long
long-array
longs
loop
macroexpand
macroexpand-1
make-array
make-hierarchy
map
map?
mapcat
max
max-key
memfn
memoize
merge
merge-with
meta
methods
min
min-key
mod
name
namespace
neg?
newline
next
nfirst
nil?
nnext
not
not-any?
not-empty
not-every?
not=
ns
ns-aliases
ns-imports
ns-interns
ns-map
ns-name
ns-publics
ns-refers
ns-resolve
ns-unalias
ns-unmap
nth
nthnext
num
number?
object-array
odd?
or
parents
partial
partition
pcalls
peek
persistent!
pmap
pop
pop!
pop-thread-bindings
pos?
pr
pr-str
prefer-method
prefers
print
print-namespace-doc
print-str
printf
println
println-str
prn
prn-str
promise
proxy
proxy-mappings
proxy-super
push-thread-bindings
pvalues
quot
rand
rand-int
range
ratio?
rationalize
re-find
re-groups
re-matcher
re-matches
re-pattern
re-seq
read
read-line
read-string
reduce
ref
ref-history-count
ref-max-history
ref-min-history
ref-set
refer
refer-clojure
reify
release-pending-sends
rem
remove
remove-method
remove-ns
remove-watch
repeat
repeatedly
replace
replicate
require
reset!
reset-meta!
resolve
rest
restart-agent
resultset-seq
reverse
reversible?
rseq
rsubseq
satisfies?
second
select-keys
send
send-off
seq
seq?
seque
sequence
sequential?
set
set-error-handler!
set-error-mode!
set-validator!
set?
short
short-array
shorts
shutdown-agents
slurp
some
sort
sort-by
sorted-map
sorted-map-by
sorted-set
sorted-set-by
sorted?
special-form-anchor
special-symbol?
split-at
split-with
str
stream?
string?
struct
struct-map
subs
subseq
subvec
supers
swap!
symbol
symbol?
sync
syntax-symbol-anchor
take
take-last
take-nth
take-while
test
the-ns
time
to-array
to-array-2d
trampoline
transient
tree-seq
true?
type
unchecked-add
unchecked-dec
unchecked-divide
unchecked-inc
unchecked-multiply
unchecked-negate
unchecked-remainder
unchecked-subtract
underive
update-in
update-proxy
use
val
vals
var-get
var-set
var?
vary-meta
vec
vector
vector-of
vector?
when
when-first
when-let
when-not
while
with-bindings
with-bindings*
with-in-str
with-local-vars
with-meta
with-open
with-out-str
with-precision
xml-seq
zero?
zipmap

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,50 @@
abstract
assert
boolean
break
byte
case
catch
char
class
const
continue
default
do
double
else
enum
extends
final
finally
float
for
goto
if
implements
import
instanceof
int
interface
long
native
new
package
private
protected
public
return
short
static
strictfp
super
switch
synchronized
this
throw
throws
transient
try
void
volatile
while

View file

@ -0,0 +1,148 @@
Anchor
Area
Array
Boolean
Button
Checkbox
Date
Document
Element
FileUpload
Form
Frame
Function
Hidden
History
Image
Infinity
JavaArray
JavaClass
JavaObject
JavaPackage
Link
Location
Math
MimeType
NaN
Navigator
Number
Object
Option
Packages
Password
Plugin
Radio
RegExp
Reset
Select
String
Submit
Text
Textarea
Window
alert
arguments
assign
blur
break
callee
caller
captureEvents
case
clearInterval
clearTimeout
close
closed
comment
confirm
constructor
continue
default
defaultStatus
delete
do
document
else
escape
eval
export
find
focus
for
frames
function
getClass
history
home
if
import
in
innerHeight
innerWidth
isFinite
isNan
java
label
length
location
locationbar
menubar
moveBy
moveTo
name
navigate
navigator
netscape
new
onBlur
onError
onFocus
onLoad
onUnload
open
opener
outerHeight
outerWidth
pageXoffset
pageYoffset
parent
parseFloat
parseInt
personalbar
print
prompt
prototype
ref
releaseEvents
resizeBy
resizeTo
return
routeEvent
scroll
scrollBy
scrollTo
scrollbars
self
setInterval
setTimeout
status
statusbar
stop
sun
switch
taint
this
toString
toolbar
top
typeof
unescape
untaint
unwatch
valueOf
var
void
watch
while
window
with

View file

@ -0,0 +1,62 @@
and
array
as
break
case
catch
cfunction
class
clone
const
continue
declare
default
die
do
echo
else
elseif
empty
enddeclare
endfor
endforeach
endif
endswitch
endwhile
eval
exit
extends
final
for
foreach
function
global
goto
if
implements
include
include_once
instanceof
interface
isset
list
namespace
new
old_function
or
print
private
protected
public
require
require_once
return
static
switch
throw
try
unset
use
var
while
xor

View file

@ -0,0 +1,104 @@
__import__
abs
and
any
apply
as
assert
basestring
bin
bool
break
buffer
class
cmp
coerce
complex
continue
def
del
delattr
dict
dir
divmod
elif
else
enumerate
eval
except
exec
execfile
file
filter
finally
float
for
format
from
frozenset
getattr
global
globals
hasattr
hash
help
hex
id
if
import
in
input
int
intern
is
isinstance
issubclass
iter
lambda
len
list
locals
long
map
max
min
next
not
object
oct
open
or
ord
pass
pow
print
print
property
raise
range
raw_input
reduce
reload
repr
return
reversed
round
set
setattr
slice
sorted
staticmethod
str
sum
super
try
tuple
type
unichr
unicode
vars
while
with
xrange
yield
zip

View file

@ -0,0 +1,181 @@
$!
$"
$$
$&
$'
$*
$+
$,
$-0
$-F
$-I
$-K
$-a
$-d
$-i
$-l
$-p
$-v
$-w
$.
$/
$0
$1
$10
$11
$2
$3
$4
$5
$6
$7
$8
$9
$:
$;
$<
$=
$>
$?
$@
$DEBUG
$FILENAME
$KCODE
$LOADED_FEATURES
$LOAD_PATH
$PROGRAM_NAME
$SAFE
$VERBOSE
$\
$_
$`
$deferr
$defout
$stderr
$stdin
$stdout
$~
ARGF
ARGV
Array
BEGIN
DATA
END
ENV
FALSE
Float
Integer
NIL
PLATFORM
RELEASE_DATE
RUBY_COPYRIGHT
RUBY_DESCRIPTION
RUBY_PATCHLEVEL
RUBY_PLATFORM
RUBY_RELEASE_DATE
RUBY_VERSION
SCRIPT_LINES__
STDERR
STDIN
STDOUT
String
TOPLEVEL_BINDING
TRUE
VERSION
__method__
`
abort
alias
and
at_exit
autoload
autoload?
begin
binding
block_given
break
callcc
caller
case
catch
chomp
chomp!
chop
chop
class
def
defined?
do
else
elsif
end
ensure
eval
exec
exit
exit!
fail
false
for
fork
format
getc
gets
global_variables
gsub
gsub!
if
in
iterator?
lambda
load
local_varaibles
loop
module
next
nil
not
open
or
p
printf
proc
putc
puts
raise
rand
readline
readlines
redo
require
require_relative
rescue
retry
return
scan
select
self
set_trace_func
sleep
split
sprintf
srand
sub
sub!
super
syscall
system
test
then
throw
trace_var
trap
true
undef
unless
until
untrace_var
warn
when
while
yield

View file

@ -0,0 +1,216 @@
case-lambda
call/cc
class
define-class
exit-handler
field
import
inherit
init-field
interface
let*-values
let-values
let/ec
mixin
opt-lambda
override
protect
provide
public
rename
require
require-for-syntax
syntax
syntax-case
syntax-error
unit/sig
unless
when
with-syntax
and
begin
call-with-current-continuation
call-with-input-file
call-with-output-file
case
cond
define
define-syntax
delay
do
dynamic-wind
else
for-each
if
lambda
let
let*
let-syntax
letrec
letrec-syntax
map
or
syntax-rules
abs
acos
angle
append
apply
asin
assoc
assq
assv
atan
boolean?
caar
cadr
call-with-input-file
call-with-output-file
call-with-values
car
cdddar
cddddr
cdr
ceiling
char->integer
char-alphabetic?
char-ci<=?
char-ci<?
char-ci=?
char-ci>=?
char-ci>?
char-downcase
char-lower-case?
char-numeric?
char-ready?
char-upcase
char-upper-case?
char-whitespace?
char<=?
char<?
char=?
char>=?
char>?
char?
close-input-port
close-output-port
complex?
cons
cos
current-input-port
current-output-port
denominator
display
eof-object?
eq?
equal?
eqv?
eval
even?
exact->inexact
exact?
exp
expt
#f
floor
force
gcd
imag-part
inexact->exact
inexact?
input-port?
integer->char
integer?
interaction-environment
lcm
length
list
list->string
list->vector
list-ref
list-tail
list?
load
log
magnitude
make-polar
make-rectangular
make-string
make-vector
max
member
memq
memv
min
modulo
negative?
newline
not
null-environment
null?
number->string
number?
numerator
odd?
open-input-file
open-output-file
output-port?
pair?
peek-char
port?
positive?
procedure?
quasiquote
quote
quotient
rational?
rationalize
read
read-char
real-part
real?
remainder
reverse
round
scheme-report-environment
set!
set-car!
set-cdr!
sin
sqrt
string
string->list
string->number
string->symbol
string-append
string-ci<=?
string-ci<?
string-ci=?
string-ci>=?
string-ci>?
string-copy
string-fill!
string-length
string-ref
string-set!
string<=?
string<?
string=?
string>=?
string>?
string?
substring
symbol->string
symbol?
#t
tan
transcript-off
transcript-on
truncate
values
vector
vector->list
vector-fill!
vector-length
vector-ref
vector-set!

View file

@ -0,0 +1,172 @@
after
append
apply
array
auto_execok
auto_import
auto_load
auto_load_index
auto_mkindex
auto_mkindex_old
auto_qualify
auto_reset
bell
binary
bind
bindtags
break
button
canvas
case
catch
cd
chan
checkbutton
clipboard
clock
close
concat
continue
destroy
dict
encoding
entry
eof
error
eval
event
exec
exit
expr
fblocked
fconfigure
fcopy
file
fileevent
flush
focus
font
for
foreach
format
frame
gets
glob
global
grab
grid
if
image
incr
info
interp
join
label
labelframe
lappend
lassign
lindex
linsert
list
listbox
llength
load
lower
lrange
lrepeat
lreplace
lreverse
lsearch
lset
lsort
menu
menubutton
message
namespace
open
option
pack
package
panedwindow
pid
pkg_mkIndex
place
proc
puts
pwd
radiobutton
raise
read
regexp
registry
regsub
rename
return
scale
scan
scrollbar
seek
selection
set
socket
source
spinbox
split
string
subst
switch
tclLog
tclPkgSetup
tclPkgUnknown
tcl_findLibrary
tell
text
time
tk
tk_chooseColor
tk_chooseDirectory
tk_getOpenFile
tk_getSaveFile
tk_menuSetFocus
tk_messageBox
tk_popup
tk_textCopy
tk_textCut
tk_textPaste
tkwait
toplevel
ttk::button
ttk::checkbutton
ttk::combobox
ttk::entry
ttk::focusFirst
ttk::frame
ttk::label
ttk::labelframe
ttk::menubutton
ttk::notebook
ttk::paned
ttk::panedwindow
ttk::progressbar
ttk::radiobutton
ttk::scale
ttk::scrollbar
ttk::separator
ttk::setTheme
ttk::sizegrip
ttk::style
ttk::takefocus
ttk::themes
ttk::treeview
trace
unknown
unload
unset
update
uplevel
upvar
variable
vwait
while
winfo
wm

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View file

@ -0,0 +1,96 @@
Title: Auto Complete Mode - 変更点
CSS: style.css
Auto Complete Mode 変更点
=========================
[Index](index.ja.txt)
\[[English](changes.txt)]
[ユーザーマニュアル](manual.ja.txt)も参照してください。
v1.3の変更点 {#Changes_v1.3}
------------
v1.3の主な変更点は次のようになります。
### 新しいオプション ### {#New_Options_v1.3}
* [`ac-disable-faces`](manual.ja.txt#ac-disable-faces)
* [`ac-show-menu-immediately-on-auto-complete`](manual.ja.txt#ac-show-menu-immediately-on-auto-complete)
* [`ac-expand-on-auto-complete`](manual.ja.txt#ac-expand-on-auto-complete)
* [`ac-use-menu-map`](manual.ja.txt#ac-use-menu-map)
### 新しい情報源 ### {#New_Sources_v1.3}
* [`ac-source-semantic-raw`](manual.ja.txt#ac-source-semantic-raw)
* [`ac-source-css-property`](manual.ja.txt#ac-source-css-property)
### 新しい情報源のプロパティ ### {#New_Source_Properties_v1.3}
* [`summary`](manual.ja.txt#summary)
* [`available`](manual.ja.txt#available)
### 新しい辞書 ### {#New_Dictionaries_v1.3}
* tcl-mode
* scheme-mode
### 変更された挙動 ### {#Changed_Behaviors_v1.3}
* 補完候補の長さを考慮したスコアリング(文字列長でソート)
### 修正されたバグ ### {#Fixed_Bugs_v1.3}
* Emacs 22.1でのエラー
* `flyspell-mode`との衝突(`M-x flyspell-workaround`で解決)
### その他 ### {#Others_v1.3}
* 単語収集の速度を改善 (#18)
* [pos-tip.el](manual.ja.txt#.E3.83.98.E3.83.AB.E3.83.97.E3.82.92.E7.B6.BA.E9.BA.97.E3.81.AB.E8.A1.A8.E7.A4.BA.E3.81.99.E3.82.8B)との協調
* Yasnippet 0.61のサポート
* 多くのバグ修正
v1.2の変更点 {#Changes_v1.2}
------------
v1.0からv1.2の主な変更点は次のようになります。
### 新機能 ### {#New_Features_v1.2}
* [曖昧マッチによる補完](manual.ja.txt#.E6.9B.96.E6.98.A7.E3.83.9E.E3.83.83.E3.83.81.E3.81.AB.E3.82.88.E3.82.8B.E8.A3.9C.E5.AE.8C)
* [辞書による補完](manual.ja.txt#.E8.BE.9E.E6.9B.B8.E3.81.AB.E3.82.88.E3.82.8B.E8.A3.9C.E5.AE.8C)
* [補完候補の絞り込み](manual.ja.txt#.E8.A3.9C.E5.AE.8C.E5.80.99.E8.A3.9C.E3.81.AE.E7.B5.9E.E3.82.8A.E8.BE.BC.E3.81.BF)
* [補完推測機能](manual.ja.txt#.E8.A3.9C.E5.AE.8C.E6.8E.A8.E6.B8.AC.E6.A9.9F.E8.83.BD)
* [トリガーキー](manual.ja.txt#.E3.83.88.E3.83.AA.E3.82.AC.E3.83.BC.E3.82.AD.E3.83.BC)
* [ヘルプ](manual.ja.txt#.E3.83.98.E3.83.AB.E3.83.97)
### 新しいコマンド ### {#New_Commands_v1.2}
* [`auto-complete`](manual.ja.txt#auto-complete.E3.82.B3.E3.83.9E.E3.83.B3.E3.83.89)
### 新しいオプション ### {#New_Options_v1.2}
* [`ac-delay`](manual.ja.txt#ac-delay)
* [`ac-auto-show-menu`](manual.ja.txt#ac-auto-show-menu)
* [`ac-use-fuzzy`](manual.ja.txt#ac-use-fuzzy)
* [`ac-use-comphist`](manual.ja.txt#ac-use-comphist)
* [`ac-ignores`](manual.ja.txt#ac-ignores)
* [`ac-ignore-case`](manual.ja.txt#ac-ignore-case)
* [`ac-mode-map`](manual.ja.txt#ac-mode-map)
### 新しい情報源 ### {#New_Sources_v1.2}
* [`ac-source-dictionary`](manual.ja.txt#ac-source-dictionary)
### 変更された挙動 ### {#Changed_Behaviors_v1.2}
* 補完の開始が遅延されるようになりました ([`ac-delay`](manual.ja.txt#ac-delay))
* 補完メニューの表示が遅延されるようになりました ([`ac-auto-show-menu`](manual.ja.txt#ac-auto-show-menu))
### その他 ### {#Others_v1.2}
* 多くのバグ修正
* パフォーマンスの改善

View file

@ -0,0 +1,96 @@
Title: Auto Complete Mode - Changes
CSS: style.css
Auto Complete Mode Changes
==========================
[Index](index.txt)
\[[Japanese](changes.ja.txt)]
See also [documentation](manual.txt).
v1.3 Changes {#Changes_v1.3}
------------
Major changes in v1.3.
### New Options ### {#New_Options_v1.3}
* [`ac-disable-faces`](manual.txt#ac-disable-faces)
* [`ac-show-menu-immediately-on-auto-complete`](manual.txt#ac-show-menu-immediately-on-auto-complete)
* [`ac-expand-on-auto-complete`](manual.txt#ac-expand-on-auto-complete)
* [`ac-use-menu-map`](manual.txt#ac-use-menu-map)
### New Sources ### {#New_Sources_v1.3}
* [`ac-source-semantic-raw`](manual.txt#ac-source-semantic-raw)
* [`ac-source-css-property`](manual.txt#ac-source-css-property)
### New Source Properties ### {#New_Source_Properties_v1.3}
* [`summary`](manual.txt#summary)
* [`available`](manual.txt#available)
### New Dictionaries ### {#New_Dictionaries_v1.3}
* tcl-mode
* scheme-mode
### Changed Behaviors ### {#Changed_Behaviors_v1.3}
* Scoring regarding to candidate length (sort by length)
### Fixed Bugs ### {#Fixed_Bugs_v1.3}
* Error on Emacs 22.1
* `flyspell-mode` confliction (`M-x flyspell-workaround`)
### Others ### {#Others_v1.3}
* Improved word completion performance (#18)
* Cooperate with [pos-tip.el](manual.txt#Show_help_beautifully)
* Yasnippet 0.61 support
* Fix many bugs
v1.2 Changes {#Changes_v1.2}
------------
Major changes in v1.2 since v1.0.
### New Features ### {#New_Features_v1.2}
* [Completion by Fuzzy Matching](manual.txt#Completion_by_Fuzzy_Matching)
* [Completion by Dictionary](manual.txt#Completion_by_Dictionary)
* [Incremental Filtering](manual.txt#Filtering_Completion_Candidates)
* [Intelligent Candidate Suggestion](manual.txt#Candidate_Suggestion)
* [Trigger Key](manual.txt#Trigger_Key)
* [Help](manual.txt#Help)
### New Commands ### {#New_Commands_v1.2}
* [`auto-complete`](manual.txt#auto-complete_command)
### New Options ### {#New_Options_v1.2}
* [`ac-delay`](manual.txt#ac-delay)
* [`ac-auto-show-menu`](manual.txt#ac-auto-show-menu)
* [`ac-use-fuzzy`](manual.txt#ac-use-fuzzy)
* [`ac-use-comphist`](manual.txt#ac-use-comphist)
* [`ac-ignores`](manual.txt#ac-ignores)
* [`ac-ignore-case`](manual.txt#ac-ignore-case)
* [`ac-mode-map`](manual.txt#ac-mode-map)
### New Sources ### {#New_Sources_v1.2}
* [`ac-source-dictionary`](manual.txt#ac-source-dictionary)
### Changed Behaviors ### {#Changed_Behaviors_v1.2}
* Completion is now delayed to start ([`ac-delay`](manual.txt#ac-delay))
* Completion menu is now delayed to show ([`ac-auto-show-menu`](manual.txt#ac-auto-show-menu))
### Others ### {#Others_v1.2}
* Fix many bugs
* Improve performance

View file

@ -0,0 +1,11 @@
Title: Auto Complete Mode - Demo
CSS: style.css
Auto Complete Mode Demo
=======================
[Index](index.txt)
[YouTube mirror](http://www.youtube.com/watch?v=rGVVnDxwJYE)
<video src="ac-demo.ogv" controls="true" width="720" height="672" />

View file

@ -0,0 +1,86 @@
Title: Auto Complete Mode - GNU Emacsのための最も賢い自動補完機能
CSS: style.css
Auto Complete Mode
==================
*[GNU Emacs][]のための最も賢い自動補完機能*
\[[English](index.txt)]
* * * *
{toc}
* * * *
Auto Complete Modeとは
----------------------
Auto Complete Modeは[GNU Emacs][]のための最も賢い自動補完機能です。従来の使いづらい補完インターフェースを一新し、ユーザーがより本質的な作業に集中できる環境を提供します。
特徴
----
* 視覚的な操作感
* 統計的手法による補完オーバーヘッドの削減
* 拡張性
スクリーンショット
------------------
![](ac.png "自動補完") ![](ac-fuzzy.png "曖昧補完") ![](ac-isearch.png "インクリメンタル検索")
デモ
----
* [YouTube](http://www.youtube.com/watch?v=rGVVnDxwJYE)
* [Ogg Theora with video tag](demo.txt)
ダウンロード
------------
### 最新安定板 (v1.3) ### {#Latest_Stable}
[v1.3の変更点](changes.ja.txt#Changes_v1.3)
* [auto-complete-1.3.tar.bz2](http://cx4a.org/pub/auto-complete/auto-complete-1.3.tar.bz2)
* [auto-complete-1.3.tar.zip](http://cx4a.org/pub/auto-complete/auto-complete-1.3.zip)
### v1.2 ###
[v1.2の変更点](changes.ja.txt#Changes_v1.2)
* [auto-complete-1.2.tar.bz2](http://cx4a.org/pub/auto-complete/auto-complete-1.2.tar.bz2)
* [auto-complete-1.2.tar.zip](http://cx4a.org/pub/auto-complete/auto-complete-1.2.zip)
ユーザーマニュアル
------------------
[Auto Complete Modeユーザーマニュアル](manual.ja.txt)
利用者の声
----------
利用者の声をぜひお聞かせください。あなたの名前(匿名希望可)とコメントをそえて[tomo@cx4a.org](mailto: tomo@cx4a.org)までメールでお願いします。どんなコメントでも歓迎です。
ソースコード
------------
ソースコードは以下のGitリポジトリから取得できます。
* <http://cx4a.org/repo/auto-complete.git>
* <http://github.com/m2ym/auto-complete> (GitHubミラー)
バグレポート
------------
[Auto Complete Modeのバグトラッキングシステム](http://cx4a.org/redmine/projects/auto-complete-mode)に新しいチケットを登録してください。
ライセンス
----------
このソフトウェアは[GPLv3][]のもとで配布されます。
[GNU Emacs]: http://www.gnu.org/software/emacs/
[GPLv3]: http://gplv3.fsf.org/

View file

@ -0,0 +1,86 @@
Title: Auto Complete Mode - The most intelligent auto-completion extension for GNU Emacs
CSS: style.css
Auto Complete Mode
==================
*The most intelligent auto-completion extension for [GNU Emacs][]*
\[[Japanese](index.ja.txt)]
* * * *
{toc}
* * * *
What is Auto Complete Mode?
---------------------------
Auto Complete Mode is the most intelligent auto-completion extension for [GNU Emacs][]. Auto Complete Mode renews an old completion interface and provides an environment that makes users could be more concentrate on their own works.
Features
--------
* Visual interface
* Reduce overhead of completion by using statistic method
* Extensibility
Screenshots
-----------
![](ac.png "Auto Completion") ![](ac-fuzzy.png "Fuzzy Completion") ![](ac-isearch.png "Increamental Search")
Demo
----
* [YouTube](http://www.youtube.com/watch?v=rGVVnDxwJYE)
* [Ogg Theora with video tag](demo.txt)
Downloads
---------
### Latest Stable (v1.3) ### {#Latest_Stable}
[Changes v1.3](changes.txt#Changes_v1.3)
* [auto-complete-1.3.tar.bz2](/pub/auto-complete/auto-complete-1.3.tar.bz2)
* [auto-complete-1.3.zip](/pub/auto-complete/auto-complete-1.3.zip)
### v1.2 ###
[Changes v1.2](changes.txt#Changes_v1.2)
* [auto-complete-1.2.tar.bz2](/pub/auto-complete/auto-complete-1.2.tar.bz2)
* [auto-complete-1.2.zip](/pub/auto-complete/auto-complete-1.2.zip)
User Manual
-----------
[Auto Complete Mode User Manual](manual.txt)
User's Voice
------------
Please send me a comment with your name (or anonymous) to [tomo@cx4a.org](mailto: tomo@cx4a.org) if you like it. Any comments are welcome.
Source Code
-----------
Git repositories are available:
* <http://cx4a.org/repo/auto-complete.git>
* <http://github.com/m2ym/auto-complete> (GitHub mirror)
Reporting Bugs
--------------
Visit [Auto Complete Mode Bug Tracking System](http://cx4a.org/redmine/projects/auto-complete-mode) and create a new ticket.
License
-------
This software is distributed under the term of [GPLv3][]+.
[GNU Emacs]: http://www.gnu.org/software/emacs/
[GPLv3]: http://gplv3.fsf.org/

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,27 @@
body {
margin: 1em;
}
h1, h2, h3 {
margin-top: 1em;
}
pre {
margin: 0.5em 2em;
padding: 0.5em;
background-color: #eee;
border: 1px solid #ddd;
}
table {
margin-left: 1em;
background-color: lightgray;
}
td, th {
padding: 0.3em;
}
td {
background-color: white;
}

View file

@ -0,0 +1,45 @@
(require 'cl)
(when (or (not (featurep 'auto-complete))
(yes-or-no-p "You are trying to upgrade auto-complete within an existed Emacs which has loaded its older version.
It causes sometimes errors or installation fault. Are you sure? "))
(let* ((basedir (file-name-directory (directory-file-name (file-name-directory load-file-name))))
(default-dir "~/.emacs.d/")
(todir (or (car command-line-args-left)
(read-file-name "Install to: " default-dir default-dir)))
(basedictdir (concat basedir "/dict"))
(todictdir (concat todir "/ac-dict")))
(cond
((not (file-directory-p basedir))
(error "Base directory is not found"))
((or (eq (length todir) 0)
(not (file-directory-p todir)))
(error "To directory is empty or not found"))
(t
(message "Installing to %s from %s" todir basedir)
(add-to-list 'load-path basedir)
(make-directory todictdir t)
(loop for file in (directory-files basedir t "^.*\\.el$")
do (byte-compile-file file))
(loop for file in (directory-files basedir t "^.*\\.elc?$")
do (copy-file file todir t))
(loop for file in (directory-files basedictdir t "^[^\\.]")
do (copy-file file todictdir t))
(let ((msg (concat "Successfully installed!
Add the following code to your .emacs:
"
(if (and (not (member (expand-file-name todir) load-path))
(not (member (concat (expand-file-name todir) "/") load-path)))
(format "(add-to-list 'load-path \"%s\")\n" todir)
"")
"(require 'auto-complete-config)\n"
(format "(add-to-list 'ac-dictionary-directories \"%s\")\n" todictdir)
"(ac-config-default)\n")))
(if noninteractive
(princ-list msg)
(switch-to-buffer "*Installation Result*")
(erase-buffer)
(insert msg)))))))

View file

@ -0,0 +1,202 @@
-*- org -*-
* How to test
You can read this testcase document by following some rules.
- (Code) is a code you should evaluate for testing the fixture.
- (Expect) is a expected result of your test.
If no (Expect) is given, it means Emacs doesn't display any errors.
- (Assume) is a code you should evaluate before test.
If no sources you should use are not given in each fixture, we assumes that
you use following sources.
Code:
(defvar ac-source-test
'((candidates list "Foo" "FooBar" "Bar" "Baz" "LongLongLine")))
(defvar ac-source-action-test
'((candidates list "Action1" "Action2")
(action . (lambda () (message "Done!")))))
(setq ac-sources '(ac-source-test ac-source-action-test))
* Setup
** Load auto-complete
Code:
(require 'auto-complete)
(require 'auto-complete-config)
** Enable/disable auto-complete by M-x auto-complete-mode
** Use global-auto-complete-mode
Code:
(global-auto-complete-mode t)
Expect:
No errors. auto-complete-mode will be enabled automatically.
* Auto-completion
** Type some string at *scratch* buffer
Expect:
Menu contains words in the current buffer.
** Type some string at right of the window
Expect:
Menu will be shown in right-to-left direction without any window scrolling.
** Continue to type some string above case
Expect:
Menu will never be disrupted.
** Type some string at the right of window with truncate-lines enabled
Assume:
(setq truncate-lines t)
** Type some string at the bottom of window
Expect:
Menu will be shown in bottom-to-top direction without any window scrolling.
** Delete a character at the word
Expect:
Completion will be started.
** Type some string so that a menu overlaps the end of buffer that doesn't have newline at the end
Expect:
Menu will be shown correctly.
Newline at the end is not seen.
** Type some string with ac-auto-start nil
Assume:
(setq ac-auto-start nil)
Expect:
Completion will never be started automatically.
** Type some string with ac-auto-start t
Assume:
(setq ac-auto-start t)
Expect:
Completion will be started automatically if possible.
** Type 1 character with ac-auto-start 2
Assume:
(setq ac-auto-start 2)
Expect:
Completion will never be started automatically.
** Type 2 characters with ac-auto-start 2
Assume:
(setq ac-auto-start 2)
Expect:
Completion will be started automatically if possible.
** Type F
Expect:
Menu contains "Foo" and "FooBar" as candidates.
Inline completion appears and it contains "oo" as common-part.
** Type TAB while completion with ac-dwim disabled
Assume:
(setq ac-dwim nil)
Expect:
(a) If there is common-part of candidates, auto-complete expands it.
(b) If the prefix equals to the first of candidates, auto-complete selects next candidate.
(c) Othewise, auto-complete expands selected candidate.
** Type TAB while completion with ac-dwim enabled
Assume:
(setq ac-dwim t)
Expect:
(a) If there is common-part of candidates, auto-complete expands it.
(b) If only one candidate remains, or if it is done after selecting be ac-previous/ac-next,
auto-complete simulates ac-complete.
- If its candidate has an action, the action will be invoked. ("Action1" and "Action2" have an action)
- Expand its candidate.
(c) If the prefix equals to the first of candidates, auto-complete selects next candidate.
(d) Othewise, auto-complete expands selected candidate.
** Type RET while completion
Expect:
Completion will be done for selected candidate.
If its candidate has an action, the action will be invoked.
Use "Action" for the prefix for test.
* Configuration
** Change menu height
Code:
(setq ac-menu-height 20)
Expect:
Up to 20 candidates will be shown in a menu.
** Use trigger key facility
Code:
(ac-set-trigger-key "TAB")
Expect:
Now you can use TAB for auto-completion.
It is enabled only when
(a) After insertion/deletion command
(b) With prefix (C-u TAB)
Otherwise, it behaves as default.
Generally, it is used with ac-auto-start disabled.
** Use ac-mode-map
Code:
(define-key ac-mode-map (kbd "M-TAB") 'auto-complete)
Expect:
Now you can start auto-complete with typing M-TAB anywhere.
** Change default ac-sources
Code:
(setq-default ac-sources '(ac-source-words-in-all-buffer))
Expect:
Now default ac-sources has been changed for newly opened buffers.
* Builtin sources
** ac-source-words-in-buffer
Expect:
Candidates will be words in the current buffer.
** ac-source-words-in-all-buffer
Expect:
Candidates will be words in all buffer.
** ac-source-words-in-same-mode-buffers
Expect:
Candidates will be words for buffers which major-mode same to
the current buffer's one.
** ac-source-symbols
Expect:
Candidates will be all Emacs Lisp symbols.
** ac-source-abbrev
Expect:
Candidates will be abbreviations of local-abbrev-table and global-abbrev-table.
** ac-source-files-in-current-dir
Expect:
Candidates will be files contained by the current directory (default-directory).
** ac-source-filename
Expect:
Candidates will be absolute/relative file name.
This source will be executed when the prefix seems to be file name.
That is, the prefix contains slash (/) and a string between first to
last flash is a valid directory.
When ac-complete, this continues to complete if the prefix is a valid directory.
** ac-source-imenu
Expect:
Candidates will be a node of imenu tree.

View file

@ -0,0 +1,255 @@
;;; fuzzy.el --- Fuzzy matching utilities
;; Copyright (C) 2010 Tomohiro Matsuyama
;; Author: Tomohiro Matsuyama <m2ym.pub@gmail.com>
;; Keywords: convenience
;; 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:
;;
;;; Code:
(eval-when-compile
(require 'cl))
(require 'regexp-opt)
(defgroup fuzzy nil
"Fuzzy matching utilities."
:group 'convenience
:prefix "fuzzy-")
(defcustom fuzzy-accept-error-rate 0.10
"Error threshold."
:group 'fuzzy)
(defvar fuzzy-accept-length-difference 2)
(defvar fuzzy-regexp-some-char (format "\\w\\{0,%s\\}" fuzzy-accept-length-difference))
;;; Functions
(defun fuzzy-reverse-string (string)
(apply 'string (nreverse (append string nil))))
(defun fuzzy-regexp-compile (string)
(labels ((oddp (n) (eq (logand n 1) 1))
(evenp (n) (eq (logand n 1) 0))
(opt (n) (regexp-opt-charset (append (substring string
(max 0 (- n 1))
(min (length string) (+ n 2))) nil))))
(concat
"\\("
(loop for i below (length string)
for c = (if (evenp i) (opt i) fuzzy-regexp-some-char)
concat c)
"\\|"
(loop for i below (length string)
for c = (if (oddp i) (opt i) fuzzy-regexp-some-char)
concat c)
"\\)")))
(defalias 'fuzzy-edit-distance 'fuzzy-jaro-winkler-distance)
(defun fuzzy-jaro-winkler-distance (s1 s2)
"http://en.wikipedia.org/wiki/Jaro-Winkler_distance"
(let* ((l1 (length s1))
(l2 (length s2))
(r (max 1 (1- (/ (max l1 l2) 2))))
(m 0)
(tr 0)
(p 0)
cs1 cs2)
(loop with seen = (make-vector l2 nil)
for i below l1
for c1 = (aref s1 i) do
(loop for j from (max 0 (- i r)) below (min l2 (+ i r))
for c2 = (aref s2 j)
if (and (char-equal c1 c2)
(null (aref seen j))) do
(push c1 cs1)
(aset seen j c2)
(incf m)
and return nil)
finally
(setq cs1 (nreverse cs1)
cs2 (loop for i below l2
for c = (aref seen i)
if c collect c)))
(loop for c1 in cs1
for c2 in cs2
if (not (char-equal c1 c2)) do
(incf tr))
(loop for i below (min m 5)
for c1 across s1
for c2 across s2
while (char-equal c1 c2) do
(incf p))
(if (eq m 0)
0.0
(setq m (float m))
(let* ((dj (/ (+ (/ m l1) (/ m l2) (/ (- m (/ tr 2)) m)) 3))
(dw (+ dj (* p 0.1 (- 1 dj)))))
dw))))
;; this function should be compiled
(byte-compile 'fuzzy-jaro-winkler-distance)
(defun fuzzy-match (s1 s2 &optional function)
(or function (setq function 'fuzzy-edit-distance))
(and (<= (abs (- (length s1) (length s2)))
fuzzy-accept-length-difference)
(>= (funcall function s1 s2)
(- 1 fuzzy-accept-error-rate))))
(defun fuzzy-all-completions (string collection)
"all-completions family with fuzzy matching."
(loop with length = (length string)
for str in collection
for s = (substring str 0 (min (length str)
(+ length fuzzy-accept-length-difference)))
if (fuzzy-match string s)
collect str))
;;; Search and Incremental Search
(defvar fuzzy-search-cache nil)
(defvar fuzzy-search-cache-string nil)
(defun fuzzy-search-cache-activate ()
(setq fuzzy-search-cache (make-hash-table))
(setq fuzzy-search-cache-string nil))
(defun fuzzy-search-cache-deactive ()
(setq fuzzy-search-cache nil)
(setq fuzzy-search-cache-string nil))
(defun fuzzy-search-edit-distance (s1 s2)
(or (and fuzzy-search-cache
(cond
((null fuzzy-search-cache-string)
(setq fuzzy-search-cache-string s1)
nil)
((not (equal fuzzy-search-cache-string s1))
(setq fuzzy-search-cache-string s1)
(clrhash fuzzy-search-cache)
nil)
(t))
(gethash s2 fuzzy-search-cache))
(let ((d (fuzzy-edit-distance s1 s2)))
(if fuzzy-search-cache
(puthash s2 d fuzzy-search-cache))
d)))
(defun fuzzy-search-match (s1 s2)
(fuzzy-match s1 s2 'fuzzy-search-edit-distance))
(defun fuzzy-search-forward (string &optional bound noerror count)
(let* ((regexp (fuzzy-regexp-compile string))
match-data)
(save-excursion
(while (and (null match-data)
(re-search-forward regexp bound t))
(if (fuzzy-search-match string (match-string 1))
(setq match-data (match-data))
(goto-char (1+ (match-beginning 1))))))
(when match-data
(store-match-data match-data)
(goto-char (match-end 1)))))
(defun fuzzy-search-backward (string &optional bound noerror count)
(let* ((regexp (fuzzy-regexp-compile string))
match-data begin end)
(save-excursion
(while (and (null match-data)
(re-search-backward regexp bound t))
(setq begin (match-beginning 1)
end (match-end 1))
(store-match-data nil)
(goto-char (max (point-min) (- begin (* (length string) 2))))
(while (re-search-forward regexp end t)
(if (fuzzy-search-match string (match-string 1))
(setq match-data (match-data))
(goto-char (1+ (match-beginning 1)))))
(unless match-data
(goto-char begin)))
(if match-data
(progn
(store-match-data match-data)
(goto-char (match-beginning 1)))
(store-match-data nil)))))
(defvar fuzzy-isearch nil)
(defvar fuzzy-isearch-failed-count 0)
(defvar fuzzy-isearch-enabled 'on-failed)
(defvar fuzzy-isearch-original-search-fun nil)
(defvar fuzzy-isearch-prefix "[FUZZY] ")
(defun fuzzy-isearch-activate ()
(setq fuzzy-isearch t)
(setq fuzzy-isearch-failed-count 0)
(fuzzy-search-cache-activate))
(defun fuzzy-isearch-deactivate ()
(setq fuzzy-isearch nil)
(setq fuzzy-isearch-failed-count 0)
(fuzzy-search-cache-deactive))
(defun fuzzy-isearch ()
(cond (isearch-word
(if isearch-forward 'word-search-forward 'word-search-backward))
(isearch-regexp
(if isearch-forward 're-search-forward 're-search-backward))
((or fuzzy-isearch
(eq fuzzy-isearch-enabled 'always)
(and (eq fuzzy-isearch-enabled 'on-failed)
(null isearch-success)
isearch-wrapped
(> (setq fuzzy-isearch-failed-count (1+ fuzzy-isearch-failed-count))
1)))
(unless fuzzy-isearch
;(goto-char isearch-opoint)
(fuzzy-isearch-activate))
(if isearch-forward 'fuzzy-search-forward 'fuzzy-search-backward))
(t
(if isearch-forward 'search-forward 'search-backward))))
(defun fuzzy-isearch-end-hook ()
(fuzzy-isearch-deactivate))
(defun turn-on-fuzzy-isearch ()
(interactive)
(setq fuzzy-isearch-original-search-fun isearch-search-fun-function)
(setq isearch-search-fun-function 'fuzzy-isearch)
(add-hook 'isearch-mode-end-hook 'fuzzy-isearch-end-hook))
(defun turn-off-fuzzy-isearch ()
(interactive)
(setq isearch-search-fun-function fuzzy-isearch-original-search-fun)
(remove-hook 'isearch-mode-end-hook 'fuzzy-isearch-end-hook))
(defadvice isearch-message-prefix (after fuzzy-isearch-message-prefix activate)
(if fuzzy-isearch
(setq ad-return-value (concat fuzzy-isearch-prefix ad-return-value))
ad-return-value))
(provide 'fuzzy)
;;; fuzzy.el ends here

Binary file not shown.

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -0,0 +1,159 @@
;;; -*-emacs-lisp-*-
;; Copyright (C) 2002 Free Software Foundation, Inc.
(defvar generated-autoload-file)
(defvar command-line-args-left)
(defun color-theme-generate-autoloads ()
(interactive)
(require 'autoload)
(setq generated-autoload-file (car command-line-args-left))
(setq command-line-args-left (cdr command-line-args-left))
(batch-update-autoloads))
(provide 'color-theme-autoloads)
;;; Generated autoloads follow (made by autoload.el).
;;;### (autoloads nil nil ("themes/color-theme-example.el" "themes/color-theme-library.el")
;;;;;; (19535 4173 130526))
;;;***
;;;### (autoloads (color-theme-initialize color-theme-submit color-theme-install
;;;;;; color-theme-compare color-theme-make-snapshot color-theme-analyze-defun
;;;;;; color-theme-print color-theme-install-at-point-for-current-frame
;;;;;; color-theme-install-at-mouse color-theme-describe color-theme-select)
;;;;;; "color-theme" "color-theme.el" (17529 41105))
;;; Generated autoloads from color-theme.el
(autoload (quote color-theme-select) "color-theme" "\
Displays a special buffer for selecting and installing a color theme.
With optional prefix ARG, this buffer will include color theme libraries
as well. A color theme library is in itself not complete, it must be
used as part of another color theme to be useful. Thus, color theme
libraries are mainly useful for color theme authors.
\(fn &optional ARG)" t nil)
(autoload (quote color-theme-describe) "color-theme" "\
Describe color theme listed at point.
This shows the documentation of the value of text-property color-theme
at point. The text-property color-theme should be a color theme
function. See `color-themes'.
\(fn)" t nil)
(autoload (quote color-theme-install-at-mouse) "color-theme" "\
Install color theme clicked upon using the mouse.
First argument EVENT is used to set point. Then
`color-theme-install-at-point' is called.
\(fn EVENT)" t nil)
(autoload (quote color-theme-install-at-point-for-current-frame) "color-theme" "\
Install color theme at point for current frame only.
Binds `color-theme-is-global' to nil and calls
`color-theme-install-at-point'.
\(fn)" t nil)
(autoload (quote color-theme-print) "color-theme" "\
Print the current color theme function.
You can contribute this function to <URL:news:gnu.emacs.sources> or
paste it into your .emacs file and call it. That should recreate all
the settings necessary for your color theme.
Example:
(require 'color-theme)
(defun my-color-theme ()
\"Color theme by Alex Schroeder, created 2000-05-17.\"
(interactive)
(color-theme-install
'(...
...
...)))
(my-color-theme)
If you want to use a specific color theme function, you can call the
color theme function in your .emacs directly.
Example:
(require 'color-theme)
(color-theme-gnome2)
\(fn &optional BUF)" t nil)
(autoload (quote color-theme-analyze-defun) "color-theme" "\
Once you have a color-theme printed, check for missing faces.
This is used by maintainers who receive a color-theme submission
and want to make sure it follows the guidelines by the color-theme
author.
\(fn)" t nil)
(autoload (quote color-theme-make-snapshot) "color-theme" "\
Return the definition of the current color-theme.
The function returned will recreate the color-theme in use at the moment.
\(fn)" nil nil)
(autoload (quote color-theme-compare) "color-theme" "\
Compare two color themes.
This will print the differences between installing THEME-A and
installing THEME-B. Note that the order is important: If a face is
defined in THEME-A and not in THEME-B, then this will not show up as a
difference, because there is no reset before installing THEME-B. If a
face is defined in THEME-B and not in THEME-A, then this will show up as
a difference.
\(fn THEME-A THEME-B)" t nil)
(autoload (quote color-theme-install) "color-theme" "\
Install a color theme defined by frame parameters, variables and faces.
The theme is installed for all present and future frames; any missing
faces are created. See `color-theme-install-faces'.
THEME is a color theme definition. See below for more information.
If you want to install a color theme from your .emacs, use the output
generated by `color-theme-print'. This produces color theme function
which you can copy to your .emacs.
A color theme definition is a list:
\([FUNCTION] FRAME-PARAMETERS VARIABLE-SETTINGS FACE-DEFINITIONS)
FUNCTION is the color theme function which called `color-theme-install'.
This is no longer used. There was a time when this package supported
automatic factoring of color themes. This has been abandoned.
FRAME-PARAMETERS is an alist of frame parameters. These are installed
with `color-theme-install-frame-params'. These are installed last such
that any changes to the default face can be changed by the frame
parameters.
VARIABLE-DEFINITIONS is an alist of variable settings. These are
installed with `color-theme-install-variables'.
FACE-DEFINITIONS is an alist of face definitions. These are installed
with `color-theme-install-faces'.
If `color-theme-is-cumulative' is nil, a color theme will undo face and
frame-parameter settings of previous color themes.
\(fn THEME)" nil nil)
(autoload (quote color-theme-submit) "color-theme" "\
Submit your color-theme to the maintainer.
\(fn)" t nil)
(autoload (quote color-theme-initialize) "color-theme" "\
Initialize the color theme package by loading color-theme-libraries.
\(fn)" t nil)
;;;***

1668
.emacs.d/color-theme.el Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,308 @@
;;; highlight-symbol.el --- automatic and manual symbol highlighting
;;
;; Copyright (C) 2007-2009 Nikolaj Schumacher
;;
;; Author: Nikolaj Schumacher <bugs * nschum de>
;; Version: 1.1
;; Keywords: faces, matching
;; URL: http://nschum.de/src/emacs/highlight-symbol/
;; Compatibility: GNU Emacs 22.x, GNU Emacs 23.x
;;
;; This file is NOT part of GNU Emacs.
;;
;; 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 2
;; 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:
;;
;; Add the following to your .emacs file:
;; (require 'highlight-symbol)
;; (global-set-key [(control f3)] 'highlight-symbol-at-point)
;; (global-set-key [f3] 'highlight-symbol-next)
;; (global-set-key [(shift f3)] 'highlight-symbol-prev)
;; (global-set-key [(meta f3)] 'highlight-symbol-prev)))
;; (global-set-key [(control meta f3)] 'highlight-symbol-query-replace)
;;
;; Use `highlight-symbol-at-point' to toggle highlighting of the symbol at
;; point throughout the current buffer. Use `highlight-symbol-mode' to keep the
;; symbol at point highlighted.
;;
;; The functions `highlight-symbol-next', `highlight-symbol-prev',
;; `highlight-symbol-next-in-defun' and `highlight-symbol-prev-in-defun' allow
;; for cycling through the locations of any symbol at point.
;; When `highlight-symbol-on-navigation-p' is set, highlighting is triggered
;; regardless of `highlight-symbol-idle-delay'.
;;
;; `highlight-symbol-query-replace' can be used to replace the symbol.
;;
;;; Change Log:
;;
;; 2009-04-13 (1.1)
;; Added `highlight-symbol-query-replace'.
;;
;; 2009-03-19 (1.0.5)
;; Fixed `highlight-symbol-idle-delay' void variable message.
;; Fixed color repetition bug. (thanks to Hugo Schmitt)
;;
;; 2008-05-02 (1.0.4)
;; Added `highlight-symbol-on-navigation-p' option.
;;
;; 2008-02-26 (1.0.3)
;; Added `highlight-symbol-remove-all'.
;;
;; 2007-09-06 (1.0.2)
;; Fixed highlighting with delay set to 0. (thanks to Stefan Persson)
;;
;; 2007-09-05 (1.0.1)
;; Fixed completely broken temporary highlighting.
;;
;; 2007-07-30 (1.0)
;; Keep temp highlight while jumping.
;; Replaced `highlight-symbol-faces' with `highlight-symbol-colors'.
;; Fixed dependency and Emacs 21 bug. (thanks to Gregor Gorjanc)
;; Prevent calling `highlight-symbol-at-point' on nil.
;;
;; 2007-04-20 (0.9.1)
;; Fixed bug in `highlight-symbol-jump'. (thanks to Per Nordlöw)
;;
;; 2007-04-06 (0.9)
;; Initial release.
;;
;;; Code:
(require 'thingatpt)
(require 'hi-lock)
(eval-when-compile (require 'cl))
(push "^No symbol at point$" debug-ignored-errors)
(defgroup highlight-symbol nil
"Automatic and manual symbols highlighting"
:group 'faces
:group 'matching)
(defface highlight-symbol-face
'((((class color) (background dark))
(:background "gray30"))
(((class color) (background light))
(:background "gray90")))
"*Face used by `highlight-symbol-mode'."
:group 'highlight-symbol)
(defvar highlight-symbol-timer nil)
(defun highlight-symbol-update-timer (value)
(when highlight-symbol-timer
(cancel-timer highlight-symbol-timer))
(setq highlight-symbol-timer
(and value (/= value 0)
(run-with-idle-timer value t 'highlight-symbol-temp-highlight))))
(defvar highlight-symbol-mode nil)
(defun highlight-symbol-set (symbol value)
(when symbol (set symbol value))
(when highlight-symbol-mode
(highlight-symbol-update-timer value)))
(defcustom highlight-symbol-idle-delay 1.5
"*Number of seconds of idle time before highlighting the current symbol.
If this variable is set to 0, no idle time is required.
Changing this does not take effect until `highlight-symbol-mode' has been
disabled for all buffers."
:type 'number
:set 'highlight-symbol-set
:group 'highlight-symbol)
(defcustom highlight-symbol-colors
'("yellow" "DeepPink" "cyan" "MediumPurple1" "SpringGreen1"
"DarkOrange" "HotPink1" "RoyalBlue1" "OliveDrab")
"*Colors used by `highlight-symbol-at-point'.
highlighting the symbols will use these colors in order."
:type '(repeat color)
:group 'highlight-symbol)
(defcustom highlight-symbol-on-navigation-p nil
"*Wether or not to temporary highlight the symbol when using
`highlight-symbol-jump' family of functions."
:type 'boolean
:group 'highlight-symbol)
(defvar highlight-symbol-color-index 0)
(make-variable-buffer-local 'highlight-symbol-color-index)
(defvar highlight-symbol nil)
(make-variable-buffer-local 'highlight-symbol)
(defvar highlight-symbol-list nil)
(make-variable-buffer-local 'highlight-symbol-list)
(defconst highlight-symbol-border-pattern
(if (>= emacs-major-version 22) '("\\_<" . "\\_>") '("\\<" . "\\>")))
;;;###autoload
(define-minor-mode highlight-symbol-mode
"Minor mode that highlights the symbol under point throughout the buffer.
Highlighting takes place after `highlight-symbol-idle-delay'."
nil " hl-s" nil
(if highlight-symbol-mode
;; on
(let ((hi-lock-archaic-interface-message-used t))
(unless hi-lock-mode (hi-lock-mode 1))
(highlight-symbol-update-timer highlight-symbol-idle-delay)
(add-hook 'post-command-hook 'highlight-symbol-mode-post-command nil t))
;; off
(remove-hook 'post-command-hook 'highlight-symbol-mode-post-command t)
(highlight-symbol-mode-remove-temp)
(kill-local-variable 'highlight-symbol)))
;;;###autoload
(defun highlight-symbol-at-point ()
"Toggle highlighting of the symbol at point.
This highlights or unhighlights the symbol at point using the first
element in of `highlight-symbol-faces'."
(interactive)
(let ((symbol (highlight-symbol-get-symbol)))
(unless symbol (error "No symbol at point"))
(unless hi-lock-mode (hi-lock-mode 1))
(if (member symbol highlight-symbol-list)
;; remove
(progn
(setq highlight-symbol-list (delete symbol highlight-symbol-list))
(hi-lock-unface-buffer symbol))
;; add
(when (equal symbol highlight-symbol)
(highlight-symbol-mode-remove-temp))
(let ((color (nth highlight-symbol-color-index
highlight-symbol-colors)))
(if color ;; wrap
(incf highlight-symbol-color-index)
(setq highlight-symbol-color-index 1
color (car highlight-symbol-colors)))
(setq color `((background-color . ,color)
(foreground-color . "black")))
;; highlight
(with-no-warnings
(if (< emacs-major-version 22)
(hi-lock-set-pattern `(,symbol (0 (quote ,color) t)))
(hi-lock-set-pattern symbol color)))
(push symbol highlight-symbol-list)))))
;;;###autoload
(defun highlight-symbol-remove-all ()
"Remove symbol highlighting in buffer."
(interactive)
(mapc 'hi-lock-unface-buffer highlight-symbol-list)
(setq highlight-symbol-list nil))
;;;###autoload
(defun highlight-symbol-next ()
"Jump to the next location of the symbol at point within the function."
(interactive)
(highlight-symbol-jump 1))
;;;###autoload
(defun highlight-symbol-prev ()
"Jump to the previous location of the symbol at point within the function."
(interactive)
(highlight-symbol-jump -1))
;;;###autoload
(defun highlight-symbol-next-in-defun ()
"Jump to the next location of the symbol at point within the defun."
(interactive)
(save-restriction
(narrow-to-defun)
(highlight-symbol-jump 1)))
;;;###autoload
(defun highlight-symbol-prev-in-defun ()
"Jump to the previous location of the symbol at point within the defun."
(interactive)
(save-restriction
(narrow-to-defun)
(highlight-symbol-jump -1)))
;;;###autoload
(defun highlight-symbol-query-replace (replacement)
"*Replace the symbol at point."
(interactive (let ((symbol (or (thing-at-point 'symbol)
(error "No symbol at point"))))
(highlight-symbol-temp-highlight)
(set query-replace-to-history-variable
(cons (substring-no-properties symbol)
(eval query-replace-to-history-variable)))
(list
(read-from-minibuffer "Replacement: " nil nil nil
query-replace-to-history-variable))))
(goto-char (beginning-of-thing 'symbol))
(query-replace-regexp (highlight-symbol-get-symbol) replacement))
(defun highlight-symbol-get-symbol ()
"Return a regular expression dandifying the symbol at point."
(let ((symbol (thing-at-point 'symbol)))
(when symbol (concat (car highlight-symbol-border-pattern)
(regexp-quote symbol)
(cdr highlight-symbol-border-pattern)))))
(defun highlight-symbol-temp-highlight ()
"Highlight the current symbol until a command is executed."
(when highlight-symbol-mode
(let ((symbol (highlight-symbol-get-symbol)))
(unless (or (equal symbol highlight-symbol)
(member symbol highlight-symbol-list))
(highlight-symbol-mode-remove-temp)
(when symbol
(setq highlight-symbol symbol)
(hi-lock-set-pattern symbol 'highlight-symbol-face))))))
(defun highlight-symbol-mode-remove-temp ()
"Remove the temporary symbol highlighting."
(when highlight-symbol
(hi-lock-unface-buffer highlight-symbol)
(setq highlight-symbol nil)))
(defun highlight-symbol-mode-post-command ()
"After a command, change the temporary highlighting.
Remove the temporary symbol highlighting and, unless a timeout is specified,
create the new one."
(if (eq this-command 'highlight-symbol-jump)
(when highlight-symbol-on-navigation-p
(highlight-symbol-temp-highlight))
(if (eql highlight-symbol-idle-delay 0)
(highlight-symbol-temp-highlight)
(highlight-symbol-mode-remove-temp))))
(defun highlight-symbol-jump (dir)
"Jump to the next or previous occurence of the symbol at point.
DIR has to be 1 or -1."
(let ((symbol (highlight-symbol-get-symbol)))
(if symbol
(let* ((case-fold-search nil)
(bounds (bounds-of-thing-at-point 'symbol))
(offset (- (point) (if (< 0 dir) (cdr bounds) (car bounds)))))
(unless (eq last-command 'highlight-symbol-jump)
(push-mark))
;; move a little, so we don't find the same instance again
(goto-char (- (point) offset))
(let ((target (re-search-forward symbol nil t dir)))
(unless target
(goto-char (if (< 0 dir) (point-min) (point-max)))
(setq target (re-search-forward symbol nil nil dir)))
(goto-char (+ target offset)))
(setq this-command 'highlight-symbol-jump))
(error "No symbol at point"))))
(provide 'highlight-symbol)
;;; highlight-symbol.el ends here

75
.emacs.d/init.el Normal file
View file

@ -0,0 +1,75 @@
(add-to-list 'load-path "~/.emacs.d")
(add-to-list 'load-path "~/.emacs.d/auto-complete")
; Requires
(require 'vimpulse)
(require 'color-theme)
(require 'color-theme-autoloads)
(require 'tabbar)
;(require 'highlight-symbol)
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/auto-complete/dict")
(ac-config-default)
(setq ac-dwim t)
(setq ac-expand-on-auto-complete nil)
(setq ac-use-fuzzy t)
;(define-key ac-completing-map "\t" 'ac-fuzzy-complete)
;(define-key ac-completing-map "\r" nil)
; This is the other Vim-mode. Maybe should delete this..
;
;(add-to-list 'load-path "~/.emacs.d/vim-mode")
;(require 'vim)
;(vim-mode 1)
; Tabbar settings (Simple groups)
(defun tabbar-buffer-groups ()
"Return the list of group names the current buffer belongs to.
This function is a custom function for tabbar-mode's tabbar-buffer-groups.
This function group all buffers into 3 groups:
Those Dired, those user buffer, and those emacs buffer.
Emacs buffer are those starting with *."
(list
(cond
((string-equal "*" (substring (buffer-name) 0 1))
"Emacs Buffer"
)
((eq major-mode 'dired-mode)
"Dired"
)
(t
"User Buffer"
)
))) ;; from Xah Lee
(setq tabbar-buffer-groups-function 'tabbar-buffer-groups)
(tabbar-mode)
; Basic frame defaults
(let ((background-color "#2F2F2F")
(foreground-color "LightGrey")
(fname "Inconsolata-13")
(fheight 45)
(fwidth 115))
(set-default-font fname)
(add-to-list 'default-frame-alist (cons 'font fname))
; (set-background-color background-color)
; (add-to-list 'default-frame-alist (cons 'background-color background-color))
; (set-foreground-color foreground-color)
(add-to-list 'default-frame-alist (cons 'foreground-color foreground-color))
(add-to-list 'default-frame-alist (cons 'height fheight))
(add-to-list 'default-frame-alist (cons 'width fwidth))
)
(custom-set-variables '(inhibit-startup-screen t))
(custom-set-faces)
; Run color-theme
(color-theme-initialize)
;(require 'color-theme-barak)
(if window-system
(color-theme-barak))
;(defun my-emacs-startup-hook () (my-close-scratch)) (add-hook 'emacs-startup-hook 'my-emacs-startup-hook)

View file

@ -0,0 +1,44 @@
(defun color-theme-barak ()
"Color theme by Barak Michener, created 08-11-2010"
(interactive)
(color-theme-install
'(color-theme-barak
((background-color . "#121212")
(background-mode . dark)
(border-color . "black")
(cursor-color . "#A7A7A7")
(foreground-color . "#E0E0E0")
(mouse-color . "sienna1"))
(default ((t (:background "#121212" :foreground "#E0E0E0"))))
(blue ((t (:foreground "blue"))))
(bold ((t (:bold t))))
(bold-italic ((t (:bold t))))
(border-glyph ((t (nil))))
(buffers-tab ((t (:background "#121212" :foreground "#E0E0E0"))))
(font-lock-builtin-face ((t (:foreground "#E0E0E0"))))
(font-lock-comment-face ((t (:foreground "#238E23"))))
(font-lock-constant-face ((t (:foreground "#E3AC3D"))))
(font-lock-doc-string-face ((t (:foreground "DarkOrange"))))
(font-lock-function-name-face ((t (:foreground "#C5A6FF"))))
(font-lock-keyword-face ((t (:bold t :foreground "#4876FF"))))
(font-lock-preprocessor-face ((t (:foreground "#E9DFEF"))))
(font-lock-reference-face ((t (:foreground "#E1634F"))))
(font-lock-regexp-grouping-backslash ((t (:foreground "#E9C062"))))
(font-lock-regexp-grouping-construct ((t (:foreground "red"))))
(font-lock-string-face ((t (:foreground "#F05656"))))
(font-lock-type-face ((t (:foreground "#73E1E6"))))
(font-lock-variable-name-face ((t (:foreground "#00BFFF"))))
(font-lock-warning-face ((t (:bold t :foreground "Pink"))))
(gui-element ((t (:background "#D4D0C8" :foreground "black"))))
(region ((t (:background "#364458"))))
(mode-line ((t (:background "grey75" :foreground "black"))))
(highlight ((t (:background "#222222"))))
(highline-face ((t (:background "SeaGreen"))))
(italic ((t (nil))))
(left-margin ((t (nil))))
(text-cursor ((t (:background "yellow" :foreground "black"))))
(toolbar ((t (nil))))
(underline ((nil (:underline nil))))
(zmacs-region ((t (:background "snow" :foreground "ble")))))))

View file

@ -0,0 +1,60 @@
;; Blackboard Colour Theme for Emacs.
;;
;; Defines a colour scheme resembling that of the original TextMate Blackboard colour theme.
;; To use add the following to your .emacs file (requires the color-theme package):
;;
;; (require 'color-theme)
;; (color-theme-initialize)
;; (load-file "~/.emacs.d/themes/color-theme-blackboard.el")
;;
;; And then (color-theme-blackboard) to activate it.
;;
;; MIT License Copyright (c) 2008 JD Huntington <jdhuntington at gmail dot com>
;; Credits due to the excellent TextMate Blackboard theme
;;
;; All patches welcome
(defun color-theme-blackboard ()
"Color theme by JD Huntington, based off the TextMate Blackboard theme, created 2008-11-27"
(interactive)
(color-theme-install
'(color-theme-blackboard
((background-color . "#0C1021")
(background-mode . dark)
(border-color . "black")
(cursor-color . "#A7A7A7")
(foreground-color . "#F8F8F8")
(mouse-color . "sienna1"))
(default ((t (:background "#0C1021" :foreground "#F8F8F8"))))
(blue ((t (:foreground "blue"))))
(bold ((t (:bold t))))
(bold-italic ((t (:bold t))))
(border-glyph ((t (nil))))
(buffers-tab ((t (:background "#0C1021" :foreground "#F8F8F8"))))
(font-lock-builtin-face ((t (:foreground "#F8F8F8"))))
(font-lock-comment-face ((t (:italic t :foreground "#AEAEAE"))))
(font-lock-constant-face ((t (:foreground "#D8FA3C"))))
(font-lock-doc-string-face ((t (:foreground "DarkOrange"))))
(font-lock-function-name-face ((t (:foreground "#FF6400"))))
(font-lock-keyword-face ((t (:foreground "#FBDE2D"))))
(font-lock-preprocessor-face ((t (:foreground "Aquamarine"))))
(font-lock-reference-face ((t (:foreground "SlateBlue"))))
(font-lock-regexp-grouping-backslash ((t (:foreground "#E9C062"))))
(font-lock-regexp-grouping-construct ((t (:foreground "red"))))
(font-lock-string-face ((t (:foreground "#61CE3C"))))
(font-lock-type-face ((t (:foreground "#8DA6CE"))))
(font-lock-variable-name-face ((t (:foreground "#FF6400"))))
(font-lock-warning-face ((t (:bold t :foreground "Pink"))))
(gui-element ((t (:background "#D4D0C8" :foreground "black"))))
(region ((t (:background "#253B76"))))
(mode-line ((t (:background "grey75" :foreground "black"))))
(highlight ((t (:background "#222222"))))
(highline-face ((t (:background "SeaGreen"))))
(italic ((t (nil))))
(left-margin ((t (nil))))
(text-cursor ((t (:background "yellow" :foreground "black"))))
(toolbar ((t (nil))))
(underline ((nil (:underline nil))))
(zmacs-region ((t (:background "snow" :foreground "ble")))))))

View file

@ -0,0 +1,22 @@
(eval-when-compile
(require 'color-theme))
(defun color-theme-example ()
"Example theme. Carbon copy of color-theme-gnome contributed by Jonadab."
(interactive)
(color-theme-install
'(color-theme-example
((foreground-color . "wheat")
(background-color . "darkslategrey")
(background-mode . dark))
(default ((t (nil))))
(region ((t (:foreground "cyan" :background "dark cyan"))))
(underline ((t (:foreground "yellow" :underline t))))
(modeline ((t (:foreground "dark cyan" :background "wheat"))))
(modeline-buffer-id ((t (:foreground "dark cyan" :background "wheat"))))
(modeline-mousable ((t (:foreground "dark cyan" :background "wheat"))))
(modeline-mousable-minor-mode ((t (:foreground "dark cyan" :background "wheat"))))
(italic ((t (:foreground "dark red" :italic t))))
(bold-italic ((t (:foreground "dark red" :bold t :italic t))))
(font-lock-comment-face ((t (:foreground "Firebrick"))))
(bold ((t (:bold)))))))

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,194 @@
;;; Emacs Color theme based on the Tango Palette colors.
;;; First derived from color-theme-tango.el, created by danranx@gmail.com :
;;; http://www.emacswiki.org/emacs/color-theme-tango.el
;; Copyright (C) 2010 Julien Barnier <julien@nozav.org>
;; Project homepage : http://blog.nozav.org/post/2010/07/12/Updated-tangotango-emacs-color-theme
;; This file is NOT part of GNU Emacs.
;; This 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 2, or (at your option) any later
;; version.
;; This file 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 Emacs; see the file COPYING, or type `C-h C-c'. If not,
;; write to the Free Software Foundation at this address:
;; Free Software Foundation
;; 51 Franklin Street, Fifth Floor
;; Boston, MA 02110-1301
;; USA
;;; Code:
(eval-when-compile
(require 'color-theme))
(defun color-theme-tangotango ()
"A color theme based on Tango Palette colors."
;; Color codes :
;; - blue : "dodger blue"
;; - yellow : "#edd400"
;; - green : "#6ac214"
;; - orange/red : "tomato"
(interactive)
(color-theme-install
'(color-theme-tangotango
((background-color . "#2e3434")
(background-mode . dark)
(border-color . "#888a85")
(cursor-color . "#fce94f")
(foreground-color . "#eeeeec")
(mouse-color . "#8ae234"))
((help-highlight-face . underline)
(ibuffer-dired-buffer-face . font-lock-function-name-face)
(ibuffer-help-buffer-face . font-lock-comment-face)
(ibuffer-hidden-buffer-face . font-lock-warning-face)
(ibuffer-occur-match-face . font-lock-warning-face)
(ibuffer-read-only-buffer-face . font-lock-type-face)
(ibuffer-special-buffer-face . font-lock-keyword-face)
(ibuffer-title-face . font-lock-type-face))
(highlight ((t (:background "brown4" :foreground nil))))
(border ((t (:background "#888a85"))))
(fringe ((t (:background "grey10"))))
(mode-line ((t (:foreground "#bbbbbc" :background "#222222" :box (:line-width 1 :color nil :style released-button)))))
(mode-line-inactive ((t (:foreground "#bbbbbc" :background "#555753"))))
(mode-line-buffer-id ((t (:bold t :foreground "orange" :background nil))))
(region ((t (:background "dark slate blue"))))
(link ((t (:underline t :foreground "dodger blue"))))
(custom-link ((t (:inherit 'link))))
(match ((t (:bold t :background "#e9b96e" :foreground "#2e3436"))))
(tool-tips ((t (:inherit 'variable-pitch :foreground "black" :background "lightyellow"))))
(tooltip ((t (:inherit 'variable-pitch :foreground "black" :background "lightyellow"))))
(bold ((t (:bold t :underline nil :background nil))))
(italic ((t (:italic t :underline nil :background nil))))
(font-lock-builtin-face ((t (:foreground "#729fcf"))))
(font-lock-comment-face ((t (:foreground "#888a85"))))
(font-lock-constant-face ((t (:foreground "#8ae234"))))
(font-lock-doc-face ((t (:foreground "#888a85"))))
(font-lock-keyword-face ((t (:foreground "#729fcf" :bold t))))
(font-lock-string-face ((t (:foreground "#ad7fa8" :italic t))))
(font-lock-type-face ((t (:foreground "#8ae234" :bold t))))
(font-lock-variable-name-face ((t (:foreground "tomato"))))
(font-lock-warning-face ((t (:bold t :foreground "#f57900"))))
(font-lock-function-name-face ((t (:foreground "#edd400" :bold t))))
(comint-highlight-input ((t (:italic t :bold t))))
(comint-highlight-prompt ((t (:foreground "#8ae234"))))
(isearch ((t (:background "#f57900" :foreground "#2e3436"))))
(isearch-lazy-highlight-face ((t (:foreground "#2e3436" :background "#e9b96e"))))
(show-paren-match-face ((t (:foreground "#2e3436" :background "#73d216"))))
(show-paren-mismatch-face ((t (:background "#ad7fa8" :foreground "#2e3436"))))
(minibuffer-prompt ((t (:foreground "#729fcf" :bold t))))
(info-xref ((t (:foreground "#729fcf"))))
(info-xref-visited ((t (:foreground "#ad7fa8"))))
(diary-face ((t (:bold t :foreground "IndianRed"))))
(eshell-ls-clutter-face ((t (:bold t :foreground "DimGray"))))
(eshell-ls-executable-face ((t (:bold t :foreground "Coral"))))
(eshell-ls-missing-face ((t (:bold t :foreground "black"))))
(eshell-ls-special-face ((t (:bold t :foreground "Gold"))))
(eshell-ls-symlink-face ((t (:bold t :foreground "White"))))
(widget-button ((t (:bold t))))
(widget-mouse-face ((t (:bold t :foreground "white" :background "brown4"))))
(widget-field ((t (:foreground "orange" :background "gray30"))))
(widget-single-line-field ((t (:foreground "orange" :background "gray30"))))
(custom-group-tag ((t (:bold t :foreground "#edd400" :height 1.3))))
(custom-variable-tag ((t (:bold t :foreground "#edd400" :height 1.1))))
(custom-face-tag ((t (:bold t :foreground "#edd400" :height 1.1))))
(custom-state-face ((t (:foreground "#729fcf"))))
(custom-button ((t (:box (:line-width 1 :style released-button) :background "grey50" :foreground "black"))))
(custom-variable-button ((t (:inherit 'custom-button))))
(custom-button-mouse ((t (:inherit 'custom-button :background "grey60"))))
(custom-button-unraised ((t (:background "grey50" :foreground "black"))))
(custom-button-mouse-unraised ((t (:inherit 'custom-button-unraised :background "grey60"))))
(custom-button-pressed ((t (:inherit 'custom-button :box (:style pressed-button)))))
(custom-button-mouse-pressed-unraised ((t (:inherit 'custom-button-unraised :background "grey60"))))
(custom-documentation ((t (:italic t))))
(message-cited-text ((t (:foreground "#edd400"))))
(gnus-cite-face-1 ((t (:foreground "#ad7fa8"))))
(gnus-cite-face-2 ((t (:foreground "sienna4"))))
(gnus-cite-face-3 ((t (:foreground "khaki4"))))
(gnus-cite-face-4 ((t (:foreground "PaleTurquoise4"))))
(gnus-group-mail-1-empty-face ((t (:foreground "light cyan"))))
(gnus-group-mail-1-face ((t (:bold t :foreground "light cyan"))))
(gnus-group-mail-2-empty-face ((t (:foreground "turquoise"))))
(gnus-group-mail-2-face ((t (:bold t :foreground "turquoise"))))
(gnus-group-mail-3-empty-face ((t (:foreground "#729fcf"))))
(gnus-group-mail-3-face ((t (:bold t :foreground "#edd400"))))
(gnus-group-mail-low-empty-face ((t (:foreground "dodger blue"))))
(gnus-group-mail-low-face ((t (:bold t :foreground "dodger blue"))))
(gnus-group-news-1-empty-face ((t (:foreground "light cyan"))))
(gnus-group-news-1-face ((t (:bold t :foreground "light cyan"))))
(gnus-group-news-2-empty-face ((t (:foreground "turquoise"))))
(gnus-group-news-2-face ((t (:bold t :foreground "turquoise"))))
(gnus-group-news-3-empty-face ((t (:foreground "#729fcf"))))
(gnus-group-news-3-face ((t (:bold t :foreground "#edd400"))))
(gnus-group-news-low-empty-face ((t (:foreground "dodger blue"))))
(gnus-group-news-low-face ((t (:bold t :foreground "dodger blue"))))
(gnus-header-name-face ((t (:bold t :foreground "#729fcf"))))
(gnus-header-from ((t (:bold t :foreground "#edd400"))))
(gnus-header-subject ((t (:foreground "#edd400"))))
(gnus-header-content ((t (:italic t :foreground "#8ae234"))))
(gnus-header-newsgroups-face ((t (:italic t :bold t :foreground "LightSkyBlue3"))))
(gnus-signature-face ((t (:italic t :foreground "dark grey"))))
(gnus-summary-cancelled-face ((t (:background "black" :foreground "yellow"))))
(gnus-summary-high-ancient-face ((t (:bold t :foreground "rotal blue"))))
(gnus-summary-high-read-face ((t (:bold t :foreground "lime green"))))
(gnus-summary-high-ticked-face ((t (:bold t :foreground "tomato"))))
(gnus-summary-high-unread-face ((t (:bold t :foreground "white"))))
(gnus-summary-low-ancient-face ((t (:italic t :foreground "lime green"))))
(gnus-summary-low-read-face ((t (:italic t :foreground "royal blue"))))
(gnus-summary-low-ticked-face ((t (:italic t :foreground "dark red"))))
(gnus-summary-low-unread-face ((t (:italic t :foreground "white"))))
(gnus-summary-normal-ancient-face ((t (:foreground "royal blue"))))
(gnus-summary-normal-read-face ((t (:foreground "lime green"))))
(gnus-summary-normal-ticked-face ((t (:foreground "indian red"))))
(gnus-summary-normal-unread-face ((t (:foreground "white"))))
(gnus-summary-selected ((t (:background "brown4" :foreground "white"))))
(message-header-name-face ((t (:foreground "tomato"))))
(message-header-newsgroups-face ((t (:italic t :bold t :foreground "LightSkyBlue3"))))
(message-header-other-face ((t (:foreground "LightSkyBlue3"))))
(message-header-xheader-face ((t (:foreground "DodgerBlue3"))))
(message-header-subject ((t (:foreground "white"))))
(message-header-to ((t (:foreground "white"))))
(message-header-cc ((t (:foreground "white"))))
(org-hide ((t (:foreground "#2e3436"))))
(org-level-1 ((t (:bold t :foreground "dodger blue" :height 1.5))))
(org-level-2 ((t (:bold nil :foreground "#edd400" :height 1.2))))
(org-level-3 ((t (:bold t :foreground "#6ac214" :height 1.0))))
(org-level-4 ((t (:bold nil :foreground "tomato" :height 1.0))))
(org-date ((t (:underline t :foreground "magenta3"))))
(org-footnote ((t (:underline t :foreground "magenta3"))))
(org-link ((t (:foreground "skyblue2" :background "#2e3436"))))
(org-special-keyword ((t (:foreground "brown"))))
(org-verbatim ((t (:foreground "#eeeeec" :underline t :slant italic))))
(org-block ((t (:foreground "#bbbbbc"))))
(org-quote ((t (:inherit org-block :slant italic))))
(org-verse ((t (:inherit org-block :slant italic))))
(org-todo ((t (:bold t :foreground "Red"))))
(org-done ((t (:bold t :foreground "ForestGreen"))))
(org-agenda-structure ((t (:weight bold :foreground "tomato"))))
(org-agenda-date ((t (:foreground "#6ac214"))))
(org-agenda-date-weekend ((t (:weight normal :foreground "dodger blue"))))
(org-agenda-date-today ((t (:weight bold :foreground "#edd400"))))
(anything-header ((t (:bold t :background "grey15" :foreground "#edd400"))))
(ess-jb-comment-face ((t (:background "#2e3436" :foreground "firebrick" :slant italic))))
(ess-jb-hide-face ((t (:background "#2e3436" :foreground "#243436"))))
(ess-jb-h1-face ((t (:height 1.6 :foreground "dodger blue" :slant normal))))
(ess-jb-h2-face ((t (:height 1.4 :foreground "#6ac214" :slant normal))))
(ess-jb-h3-face ((t (:height 1.2 :foreground "#edd400" :slant normal))))
(ecb-default-highlight-face ((t (:background "#729fcf"))))
(ecb-tag-header-face ((t (:background "#f57900"))))
(magit-header ((t (:foreground "#edd400"))))
(magit-diff-add ((t (:foreground "#729fcf"))))
(magit-item-highlight ((t (:weight extra-bold :inverse-video t))))
)))
(provide 'color-theme-tangotango)

Binary file not shown.

View file

@ -0,0 +1 @@
default

View file

@ -0,0 +1,2 @@
9c9e1bf0c4a2ed90304bab5e7b00bbbe23ea1fe7 286
9c9e1bf0c4a2ed90304bab5e7b00bbbe23ea1fe7 default

Binary file not shown.

View file

@ -0,0 +1,2 @@
[paths]
default = http://bitbucket.org/lyro/vim-mode

View file

@ -0,0 +1,3 @@
revlogv1
store
fncache

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,22 @@
data/.hgignore.i
data/.hgtags.i
data/vim-combat.el.i
data/vim-commands.el.i
data/vim-compat.el.i
data/vim-ex-commands.el.i
data/vim-ex.el.i
data/vim-insert-mode.el.i
data/vim-keymap.el.i
data/vim-keys.el.i
data/vim-maps.el.i
data/vim-modes.el.i
data/vim-motions.el.i
data/vim-node.el.i
data/vim-normal-mode.el.i
data/vim-scroll.el.i
data/vim-search.el.i
data/vim-undo.el.i
data/vim-vim.el.i
data/vim-visual-mode.el.i
data/vim-window.el.i
data/vim.el.i

Binary file not shown.

View file

@ -0,0 +1,5 @@
286 9c9e1bf0c4a2ed90304bab5e7b00bbbe23ea1fe7 e20b66a15626ce3c3dedc3de035c0d65915f1159
1f59539819aa706d915e97ecdf7a513d1e5e664e v0.1
9c22feb593237c76560cfc1b817c2ece500e6ac9 v0.2
15dff001f097be2ffc0b717edb7fd019a36e407a v0.3

View file

@ -0,0 +1 @@
default

View file

View file

@ -0,0 +1,2 @@
~$
\.elc$

View file

@ -0,0 +1,3 @@
1f59539819aa706d915e97ecdf7a513d1e5e664e v0.1
9c22feb593237c76560cfc1b817c2ece500e6ac9 v0.2
15dff001f097be2ffc0b717edb7fd019a36e407a v0.3

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,132 @@
;;; vim-ex-commands.el - Implementation of some ex-mode commands.
;; Copyright (C) 2009, 2010 Frank Fischer
;; Author: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;;
;; This file is not part of GNU Emacs.
;;; Code:
(defun* vim:save-buffer (file-name &key begin end mustbenew append)
"Saves the lines from `begin' to `end' to file `file-name'."
(with-current-buffer vim:ex-current-buffer
(when (null file-name)
(setq file-name (buffer-file-name))
(unless file-name
(error "Please specify a file-name for this buffer!")))
(let (beg-pos end-pos)
(when begin
(setq beg-pos (save-excursion
(goto-line begin)
(line-beginning-position)))
(setq end-pos (if end
(save-excursion
(goto-line end)
(line-end-position))
beg-pos)))
(cond
((and (null beg-pos)
(string= file-name (buffer-file-name)))
(save-buffer))
((and (null beg-pos)
(null (buffer-file-name)))
(write-file file-name))
(t
(write-region beg-pos end-pos file-name append nil nil mustbenew))))))
(vim:defcmd vim:cmd-write (motion (argument:file file) nonrepeatable)
"Saves file `file'."
(vim:save-buffer file
:begin (and motion (vim:motion-first-line motion))
:end (and motion (vim:motion-last-line motion))
:mustbenew t))
(vim:defcmd vim:cmd-write-q (motion (argument:file file) nonrepeatable)
"Overwrites file `file'."
(vim:save-buffer file
:begin (and motion (vim:motion-first-line motion))
:end (and motion (vim:motion-last-line motion))
:mustbenew nil))
(vim:defcmd vim:cmd-write-all (nonrepeatable)
"Saves all buffers."
(save-some-buffers nil))
(vim:defcmd vim:cmd-write-all-q (nonrepeatable)
"Overwrites all buffers."
(save-some-buffers t))
(vim:defcmd vim:cmd-edit ((argument:file file) nonrepeatable)
"Visits a certain file."
(if file
(find-file file)
(when (buffer-file-name)
(find-file (buffer-file-name)))))
(vim:defcmd vim:cmd-buffer ((argument:buffer buffer) nonrepeatable)
"Switches to another buffer."
(if buffer
(when (or (get-buffer buffer)
(y-or-n-p (format "No buffer with name \"%s\" exists. Create new buffer? " buffer)))
(switch-to-buffer buffer))
(switch-to-buffer (other-buffer))))
(vim:defcmd vim:cmd-delete-buffer ((argument:buffer buffer) nonrepeatable)
"Deletes a buffer."
(kill-buffer buffer))
(vim:defcmd vim:cmd-delete-buffer-q ((argument:buffer buffer) nonrepeatable)
"Deletes a buffer without saving."
(if buffer
(with-current-buffer buffer
(set-buffer-modified-p nil))
(set-buffer-modified-p nil))
(kill-buffer buffer))
(vim:defcmd vim:cmd-quit (nonrepeatable)
"Closes the current window, exits Emacs if this is the last window."
(condition-case nil
(delete-window)
(error
(condition-case nil
(delete-frame)
(error (save-buffers-kill-emacs))))))
(vim:defcmd vim:cmd-quit-q (nonrepeatable)
"Closes the current window, exits Emacs if this is the last window."
(condition-case nil
(delete-window)
(error
(condition-case nil
(delete-frame)
(error (kill-emacs))))))
(vim:defcmd vim:cmd-quit-all (nonrepeatable)
"Exits Emacs, asking for saving."
(save-buffers-kill-emacs))
(vim:defcmd vim:cmd-quit-all-q (nonrepeatable)
"Exits Emacs, without saving."
(kill-emacs))
(vim:defcmd vim:cmd-save-and-quit (nonrepeatable)
"Exits Emacs, without saving."
(save-buffers-kill-emacs 1))
(vim:defcmd vim:cmd-save-and-close ((argument:file file) nonrepeatable)
"Saves the current buffer and closes the window."
(vim:cmd-write :argument file)
(vim:cmd-quit))
(vim:defcmd vim:cmd-save-and-close-q ((argument:file file) nonrepeatable)
"Saves the current buffer and closes the window."
(vim:cmd-write-q :argument file)
(vim:cmd-quit))
(provide 'vim-ex-commands)
;;; vim-ex-commands.el ends here

440
.emacs.d/vim-mode/vim-ex.el Normal file
View file

@ -0,0 +1,440 @@
;;; vim-ex.el - Ex-mode.
;; Copyright (C) 2009, 2010 Frank Fischer
;; Author: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;;
;; This file is not part of GNU Emacs.
;;; Code:
(defvar vim:ex-commands nil
"List of pairs (command . function).")
(defvar vim:ex-current-buffer)
(vim:deflocalvar vim:ex-local-commands nil
"List of pairs (command . function).")
(defvar vim:ex-history nil
"History of ex-commands.")
(defun vim:emap (keys command)
"Maps an ex-command to some function."
(unless (find-if #'(lambda (x) (string= (car x) keys)) vim:ex-commands)
(add-to-list 'vim:ex-commands (cons keys command))))
(defun vim:local-emap (keys command)
"Maps an ex-command to some function buffer-local."
(unless (find-if #'(lambda (x) (string= (car x) keys)) vim:ex-local-commands)
(add-to-list 'vim:ex-local-commands (cons keys command))))
(defun vim:ex-binding (cmd)
"Returns the current binding of `cmd' or nil."
(with-current-buffer vim:ex-current-buffer
(or (cdr-safe (assoc cmd vim:ex-local-commands))
(cdr-safe (assoc cmd vim:ex-commands)))))
(defvar vim:ex-keymap (make-sparse-keymap)
"Keymap used in ex-mode.")
(define-key vim:ex-keymap "\t" 'minibuffer-complete)
(define-key vim:ex-keymap [return] 'exit-minibuffer)
(define-key vim:ex-keymap (kbd "RET") 'exit-minibuffer)
(define-key vim:ex-keymap " " 'vim:ex-expect-argument)
(define-key vim:ex-keymap (kbd "C-j") 'vim:ex-execute-command)
(define-key vim:ex-keymap (kbd "C-g") 'abort-recursive-edit)
(define-key vim:ex-keymap [up] 'previous-history-element)
(define-key vim:ex-keymap [down] 'next-history-element)
(define-key vim:ex-keymap "\d" 'vim:ex-delete-backward-char)
(defun vim:ex-delete-backward-char (n)
"Delete the previous `n' characters. If ex-buffer is empty,
cancel ex-mode."
(interactive "p")
(if (and (>= n 1)
(zerop (length (minibuffer-contents))))
(exit-minibuffer))
(delete-backward-char n))
(defvar vim:ex-keep-reading nil)
(defvar vim:ex-cmdline nil)
(defvar vim:ex-cmd nil)
(defvar vim:ex-beg nil)
(defvar vim:ex-end nil)
(defun vim:ex-split-cmdline (cmdline)
(multiple-value-bind (cmd-region beg end) (vim:ex-parse cmdline)
(if (null cmd-region)
(values cmdline "" cmdline "" beg end)
(let ((range (substring cmdline 0 (car cmd-region)))
(cmd (substring cmdline (car cmd-region) (cdr cmd-region)))
(spaces "")
(arg (substring cmdline (cdr cmd-region))))
;; skip whitespaces
(when (string-match "\\`\\s-*" arg)
(setq spaces (match-string 0 arg)
arg (substring arg (match-end 0))))
(values range cmd spaces arg beg end)))))
(defun vim:ex-expect-argument (n)
;; called if the space separating the command from the argument has
;; been pressed
(interactive "p")
(let ((cmdline (vim:minibuffer-contents)))
(self-insert-command n)
(multiple-value-bind (range cmd spaces arg beg end) (vim:ex-split-cmdline cmdline)
(when (and (= (point) (point-max))
(zerop (length spaces))
(zerop (length arg)))
(while (stringp cmd)
(setq cmd (vim:ex-binding cmd)))
(if (null cmd) (ding)
(let ((result (case (vim:cmd-arg cmd)
(file
(vim:ex-complete-file-argument nil nil nil))
(buffer
(vim:ex-complete-buffer-argument nil nil nil))
((t)
(vim:ex-complete-text-argument nil nil nil)))))
(when result (insert result))))))))
(defun vim:ex-complete (cmdline predicate flag)
(multiple-value-bind (range cmd spaces arg beg end) (vim:ex-split-cmdline cmdline)
(setq vim:ex-cmd cmd)
(cond
;; only complete at the end of the command
((< (point) (point-max)) nil)
;; if at the end of a command, complete the command
((and (zerop (length spaces)) (zerop (length arg)))
(let ((result (vim:ex-complete-command cmd predicate flag)))
(cond
((null result) nil)
((eq t result) t)
((stringp result)
(if flag result (concat range result)))
((listp result) (if flag result (mapcar #'(lambda (x) (concat range x)) result)))
(t (error "Completion returned unexpected value.")))))
;; otherwise complete the argument
(t
(let ((result (vim:ex-complete-argument arg predicate flag)))
(cond
((null result) nil)
((eq t result) t)
((stringp result) (if flag result (concat range cmd spaces result)))
((listp result) (if flag result (mapcar #'(lambda (x) (concat range cmd spaces x)) result)))
(t (error "Completion returned unexpected value."))))))))
(defun vim:ex-complete-command (cmd predicate flag)
;; completes the command
(with-current-buffer vim:ex-current-buffer
(cond
((null flag) (or (try-completion cmd vim:ex-local-commands predicate)
(try-completion cmd vim:ex-commands predicate)))
((eq t flag) (or (all-completions cmd vim:ex-local-commands predicate)
(all-completions cmd vim:ex-commands predicate)))
((eq 'lambda flag) (or (vim:test-completion cmd vim:ex-local-commands predicate)
(vim:test-completion cmd vim:ex-commands predicate))))))
(defun vim:ex-complete-argument (arg predicate flag)
;; completes the argument
(let ((cmd vim:ex-cmd))
(while (stringp cmd)
(setq cmd (vim:ex-binding cmd)))
(if (null cmd) (ding)
(case (vim:cmd-arg cmd)
(file
(vim:ex-complete-file-argument arg predicate flag))
(buffer
(vim:ex-complete-buffer-argument arg predicate flag))
((t)
(vim:ex-complete-text-argument arg predicate flag))
(t (ding))))))
(defun vim:ex-complete-file-argument (arg predicate flag)
;; completes a file-name
(if (null arg)
default-directory
(let ((dir (or (file-name-directory arg)
(with-current-buffer vim:ex-current-buffer default-directory)))
(fname (file-name-nondirectory arg)))
(cond
((null dir) (ding))
((null flag)
(let ((result (file-name-completion fname dir)))
(case result
((nil) nil)
((t) t)
(t (concat dir result)))))
((eq t flag)
(file-name-all-completions fname dir))
((eq 'lambda flag)
(eq (file-name-completion fname dir) t))))))
(defun vim:ex-complete-buffer-argument (arg predicate flag)
;; completes a buffer name
(when arg
(let ((buffers (mapcar #'(lambda (buffer) (cons (buffer-name buffer) nil)) (buffer-list t))))
(cond
((null flag)
(try-completion arg buffers predicate))
((eq t flag)
(all-completions arg buffers predicate))
((eq 'lambda flag)
(vim:test-completion arg buffers predicate))))))
(defun vim:ex-complete-text-argument (arg predicate flag)
;; completes an arbitrary text-argument
(when arg
(case flag
((nil) t)
((t) (list arg))
('lambda t))))
(defun vim:ex-execute-command (cmdline)
(interactive)
(multiple-value-bind (range cmd spaces arg beg end) (vim:ex-split-cmdline cmdline)
(setq vim:ex-cmd cmd)
(let ((cmd vim:ex-cmd)
(motion (cond
((and beg end)
(vim:make-motion :begin (save-excursion
(goto-line beg)
(line-beginning-position))
:end (save-excursion
(goto-line end)
(line-beginning-position))
:has-begin t
:type 'linewise))
(beg
(vim:make-motion :begin (save-excursion
(goto-line beg)
(line-beginning-position))
:end (save-excursion
(goto-line beg)
(line-beginning-position))
:has-begin t
:type 'linewise))))
(count (and (not end) beg)))
(while (stringp cmd)
(setq cmd (vim:ex-binding cmd)))
(when (zerop (length arg))
(setq arg nil))
(with-current-buffer vim:ex-current-buffer
(cond
(cmd (case (vim:cmd-type cmd)
('complex
(if (vim:cmd-arg-p cmd)
(funcall cmd :motion motion :argument arg)
(funcall cmd :motion motion)))
('simple
(when end
(error "Command does not take a range: %s" vim:ex-cmd))
(if (vim:cmd-arg-p cmd)
(if (vim:cmd-count-p cmd)
(funcall cmd :count beg :argument arg)
(funcall cmd :argument arg))
(if (vim:cmd-count-p cmd)
(funcall cmd :count count)
(funcall cmd))))
(t (error "Unexpected command-type bound to %s" vim:ex-cmd))))
(beg (vim:motion-go-to-first-non-blank-beg :count (or end beg)))
(t (ding)))))))
;; parser for ex-commands
(defun vim:ex-parse (text)
"Extracts the range-information from `text'.
Returns a list of up to three elements: (cmd beg end)"
(let (begin
(begin-off 0)
sep
end
(end-off 0)
(pos 0)
(cmd nil))
(multiple-value-bind (beg npos) (vim:ex-parse-address text pos)
(when npos
(setq begin beg
pos npos)))
(multiple-value-bind (off npos) (vim:ex-parse-offset text pos)
(when npos
(unless begin (setq begin 'current-line))
(setq begin-off off
pos npos)))
(when (and (< pos (length text))
(or (= (aref text pos) ?\,)
(= (aref text pos) ?\;)))
(setq sep (aref text pos))
(incf pos)
(multiple-value-bind (e npos) (vim:ex-parse-address text pos)
(when npos
(setq end e
pos npos)))
(multiple-value-bind (off npos) (vim:ex-parse-offset text pos)
(when npos
(unless end (setq end 'current-line))
(setq end-off off
pos npos))))
;; handle the special '%' range
(when (or (eq begin 'all) (eq end 'all))
(setq begin 'first-line
begin-off 0
end 'last-line
end-off 0
sep ?,))
(when (= pos (or (string-match "[a-zA-Z0-9!]+" text pos) -1))
(setq cmd (cons (match-beginning 0) (match-end 0))))
(multiple-value-bind (start end) (vim:ex-get-range (and begin (cons begin begin-off)) sep (and end (cons end end-off)))
(values cmd start end))))
(defun vim:ex-parse-address (text pos)
(cond
((>= pos (length text)) nil)
((= pos (or (string-match "[0-9]+" text pos) -1))
(values (cons 'abs (string-to-number (match-string 0 text)))
(match-end 0)))
((= (aref text pos) ?$)
(values (cons 'abs (line-number-at-pos (point-max))) (1+ pos)))
((= (aref text pos) ?\%)
(values 'all (1+ pos)))
((= (aref text pos) ?.)
(values 'current-line (1+ pos)))
((= (aref text pos) ?')
(if (>= (1+ pos) (length text))
nil
(values `(mark ,(aref text (1+ pos))) (+ 2 pos))))
((= (aref text pos) ?/)
(when (string-match "\\([^/]+\\|\\\\.\\)\\(?:/\\|$\\)"
text (1+ pos))
(values (cons 're-fwd (match-string 1 text))
(match-end 0))))
((= (aref text pos) ??)
(when (string-match "\\([^?]+\\|\\\\.\\)\\(?:?\\|$\\)"
text (1+ pos))
(values (cons 're-bwd (match-string 1 text))
(match-end 0))))
((and (= (aref text pos) ?\\)
(< pos (1- (length text))))
(case (aref text (1+ pos))
(?/ (values 'next-of-prev-search (1+ pos)))
(?? (values 'prev-of-prev-search (1+ pos)))
(?& (values 'next-of-prev-subst (1+ pos)))))
(t nil)))
(defun vim:ex-parse-offset (text pos)
(let ((off nil))
(while (= pos (or (string-match "\\([-+]\\)\\([0-9]+\\)?" text pos) -1))
(if (string= (match-string 1 text) "+")
(setq off (+ (or off 0) (if (match-beginning 2)
(string-to-number (match-string 2 text))
1)))
(setq off (- (or off 0) (if (match-beginning 2)
(string-to-number (match-string 2 text))
1))))
(setq pos (match-end 0)))
(and off (values off pos))))
(defun vim:ex-get-range (start sep end)
(with-current-buffer vim:ex-current-buffer
(when start
(setq start (vim:ex-get-line start)))
(when (and sep end)
(save-excursion
(when (= sep ?\;) (goto-line start))
(setq end (vim:ex-get-line end))))
(values start end)))
(defun vim:ex-get-line (address)
(let ((base (car address))
(offset (cdr address)))
(cond
((null base) nil)
((consp offset)
(let ((line (vim:ex-get-line (car address))))
(when line
(save-excursion
(goto-line line)
(vim:ex-get-line (cdr address))))))
(t
(+ offset
(case (or (car-safe base) base)
(abs (cdr base))
;; TODO: (1- ...) may be wrong if the match is the empty string
(re-fwd (save-excursion
(beginning-of-line 2)
(and (re-search-forward (cdr base))
(line-number-at-pos (1- (match-end 0))))))
(re-bwd (save-excursion
(beginning-of-line 0)
(and (re-search-backward (cdr base))
(line-number-at-pos (match-beginning 0)))))
(current-line (line-number-at-pos (point)))
(first-line (line-number-at-pos (point-min)))
(last-line (line-number-at-pos (point-max)))
(mark (line-number-at-pos (vim:get-local-mark (cadr base))))
(next-of-prev-search (error "Next-of-prev-search not yet implemented."))
(prev-of-prev-search (error "Prev-of-prev-search not yet implemented."))
(next-of-prev-subst (error "Next-of-prev-subst not yet implemented."))
(t (error "Invalid address: %s" address))))))))
(defun vim:ex-read-command (&optional initial-input)
"Starts ex-mode."
(interactive)
(let ((vim:ex-current-buffer (current-buffer)))
(let ((minibuffer-local-completion-map vim:ex-keymap))
(let ((result (completing-read ":" 'vim:ex-complete nil nil initial-input 'vim:ex-history)))
(when (and result
(not (zerop (length result))))
(vim:ex-execute-command result))))))
(provide 'vim-ex)
;;; vim-ex.el ends here

View file

@ -0,0 +1,79 @@
;;; vim-insert-mode.el - VIM insert-mode.
;; Copyright (C) 2009, 2010 Frank Fischer
;; Author: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;;
;; This file is not part of GNU Emacs.
;;; TODO :
;; - for some reason GNU Emacs does not show '-- REPLACE --'
;;; Code:
(vim:deflocalvar vim:last-insert-undo nil)
(defcustom vim:insert-mode-replace-cursor 'hbar
"Cursor for replace-mode."
:group 'vim-mode)
(vim:define-keymap insert-mode "insert-mode" :map-command imap)
(vim:define-mode insert "VIM insert-mode"
:ident "I"
:message "-- INSERT --"
:keymaps '(vim:insert-mode-keymap)
:command-function 'vim:insert-mode-command
:cursor 'bar)
(add-hook 'vim:insert-mode-on-hook 'vim:insert-mode-activated)
(add-hook 'vim:insert-mode-off-hook 'vim:insert-mode-deactivated)
(vim:defcmd vim:insert-mode-toggle-replace ()
"Toggles overwrite-mode in insert-mode."
(unless (vim:insert-mode-p)
(error "Toggling overwrite-mode only allowed in insert-mode."))
(overwrite-mode nil)
(if overwrite-mode
(progn
(let (message-log-max) (message "-- REPLACE --"))
(setq cursor-type vim:insert-mode-replace-cursor)
(vim:update-mode-line "R"))
(progn
(let (message-log-max) (message "-- INSERT --"))
(setq cursor-type vim:insert-mode-cursor)
(vim:update-mode-line "I"))))
(defun vim:insert-mode-command (command)
"Executes a simple command in insert mode."
(case (vim:cmd-type command)
('simple (vim:normal-execute-simple-command command))
('complex (error "No complex command allowed in insert-mode."))
(t (vim:normal-execute-motion command))))
(defun vim:insert-mode-activated ()
"Called when insert-mode is activated."
(overwrite-mode -1)
(setq vim:last-insert-undo vim:last-undo)
(add-hook 'pre-command-hook 'vim:insert-save-key-sequence))
(defun vim:insert-mode-deactivated ()
"Called when insert-mode is deactivated."
(overwrite-mode -1)
(vim:set-mark ?^)
(remove-hook 'pre-command-hook 'vim:insert-save-key-sequence)
;; the command that has just ended insert-mode should NOT be repeatable
;; and will therefore NOT override repeat-sequence.
(setq vim:repeat-events (vconcat vim:repeat-events
vim:current-key-sequence))
(setq vim:last-undo vim:last-insert-undo))
(defun vim:insert-save-key-sequence ()
"Called in insert-mode to save key-events."
(when (and (vim:toplevel-execution)
(not (eq this-command 'vim:intercept-ESC)))
(setq vim:current-key-sequence (vconcat vim:current-key-sequence
(vim:this-command-keys)))))
(provide 'vim-insert-mode)
;;; vim-insert-mode.el ends here

View file

@ -0,0 +1,144 @@
;;; vim-keymap.el - Basic keymapping for vim-mode
;; Copyright (C) 2009, 2010 Frank Fischer
;; Author: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;;
;; This file is not part of GNU Emacs.
;;; Code:
(defmacro vim:kbdmacro-to-command (events)
"Creates a command passing prefix-argument to given keyboard-macro `events'."
(let ((arg (gensym)))
`(lambda (,arg)
(interactive "P")
(execute-kbd-macro
(if ,arg
(vconcat (number-to-string (prefix-numeric-value ,arg))
,events)
,events)))))
(defun* vim:map (keys command &key (keymap nil))
"Maps the sequence of events `keys' to a `command' in a certain
`keymap.'"
(if (or (stringp command)
(vectorp command))
(lexical-let ((kbdevents command))
(define-key keymap keys (vim:kbdmacro-to-command kbdevents)))
(define-key keymap keys command)))
(defun vim:make-keymap (&optional parent)
"Creates a new keymap with a certain `parent' keymap."
(let ((kmap (make-sparse-keymap)))
(when parent (set-keymap-parent kmap parent))
kmap))
(defmacro vim:define-keymap (name
doc
&key
map-command)
"Defines global and local keymaps for a mode with name
vim:`name'-[local-]keymap and a map command vim:`map-command'
and vim:local-`map-command'."
(let ((glbkeym (concat "vim:" (symbol-name name) "-keymap"))
(lockeym (concat "vim:" (symbol-name name) "-local-keymap")))
`(progn
(defconst ,(intern glbkeym) (vim:make-keymap)
,(concat "VIM global keymap: " doc))
(defconst ,(intern lockeym) (vim:make-keymap)
,(concat "VIM buffer local keymap: " doc))
,@(when map-command
`((defsubst ,(intern (concat "vim:" (symbol-name map-command)))
(keys command)
,(concat "Maps the sequence of events `keys' to a `command' in keymap "
glbkeym)
(vim:map keys command :keymap ,(intern glbkeym)))
(defsubst ,(intern (concat "vim:local-" (symbol-name map-command)))
(keys command)
,(concat "Maps the sequence of events `keys' to a `command' in keymap "
lockeym)
(vim:map keys command :keymap ,(intern lockeym))))))))
(font-lock-add-keywords 'emacs-lisp-mode '("vim:define-keymap"))
;; Interception of ESC event. The ESC event is intercepted. If not
;; followed by another key, i.e. not used as a prefix-key, the event
;; [escape] is sent, otherwise the interception-keymap is disabled for
;; the next command and the ESC event is resent.
(defcustom vim:intercept-ESC-timeout 0.1
"Time in seconds to wait for another key after an ESC event."
:group 'vim-mode)
(defconst vim:intercept-ESC-keymap (make-sparse-keymap)
"Keymap to map ESC to [escape].")
(define-minor-mode vim:intercept-ESC-mode
"VIM minor mode to capture ESC."
nil nil nil)
;; This function is defined in vim:compat.el
;; (defun vim:intercept-ESC () ...)
(defun vim:enable-intercept-ESC ()
"Enables interception of ESC after executing a (prefix-)command."
(unless (eq this-command 'vim:intercept-ESC)
(remove-hook 'pre-command-hook 'vim:enable-intercept-ESC)
(vim:intercept-ESC-mode 1)))
;; Catch '\e' and convert it to [escape] if not used as prefix key.
(vim:map (kbd "ESC") 'vim:intercept-ESC :keymap vim:intercept-ESC-keymap)
;; The override keymap, useful especially in normal-mode.
(defconst vim:override-keymap (make-keymap)
"Global parent keymap to override some Emacs default bindings.")
(suppress-keymap vim:override-keymap)
(vim:map (kbd "ESC ESC ESC")
(lambda ()
"Exits any VIM mode and returns to normal-mode."
(interactive)
(vim:activate-normal-mode)
(ding))
:keymap vim:override-keymap)
;; This function sets up the keymaps for the current mode.
(defmacro vim:set-keymaps (mode-name keymaps)
(when (eq (car-safe mode-name) 'quote)
(setq mode-name (cadr mode-name)))
(when (eq (car-safe keymaps) 'quote)
(setq keymaps (cadr keymaps)))
`(setq vim:emulation-mode-alist
(list ,@(cons '(cons 'vim:intercept-ESC-mode vim:intercept-ESC-keymap)
(mapcan #'(lambda (keym)
(let ((localname (intern (replace-regexp-in-string "mode-keymap" "mode-local-keymap"
(symbol-name keym)))))
(if (eq localname keym)
(list `(cons ',mode-name ,keym))
(list `(cons ',mode-name ,localname)
`(cons ',mode-name ,keym)))))
keymaps)))))
;; TODO: This function is currently empty and serves only as hook for
;; defadvice.
(defun vim:reset-key-state ()
"Resets the current internal key-state."
nil)
(vim:deflocalvar vim:current-key-sequence nil
"The key-sequence of the current command.")
(vim:deflocalvar vim:new-buffer nil
"The buffer the be made current at the end of key-handline.")
(defun vim:clear-key-sequence ()
"Clears the internal log of key-sequences."
(setq vim:current-key-sequence nil))
(provide 'vim-keymap)
;;; vim-keymap.el ends here

View file

@ -0,0 +1,364 @@
;;; vim-maps.el
;; Copyright (C) 2009, 2010 Frank Fischer
;; Author: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;;
;; This file is not part of GNU Emacs.
;;; Commentary:
;; This file contains all standard keymaps. Key mappings are defined
;; using one of the following vim-like macros:
;; - vim:map ... general mapping in an arbitrary mode
;; - vim:nmap ... mapping in the normal-mode keymap
;; - vim:omap ... mapping in the operator-pending keymap
;; - vim:imap ... mapping in the insert-mode keymap
;; - vim:vmap ... mapping in the visual-mode keymap
;; - vim:emap ... mapping in the ex-mode keymap
;;
;; Furthermore, for each of these map-function there's a buffer-local
;; variant
;;
;; - vim:local-nmap ... mapping in the normal-mode local keymap
;; - vim:local-omap ... mapping in the operator-pending local keymap
;; - vim:local-imap ... mapping in the insert-mode local keymap
;; - vim:local-vmap ... mapping in the visual-mode local keymap
;; - vim:local-emap ... mapping in the ex-mode local keymap
;;
;; The local versions should be used to define mode specific bindings
;; as local-set-key would do.
;;
;; Commands should usually be placed in the normal-mode keymap.
;; Motions should be placed in the operator-pending keymap. All
;; commands in the operator-pending-keymap are available as
;; operator-pending in normal-mode and visual-mode (but may be
;; overwritten by the corresponding keymaps) and as motion-arguments
;; for complex commands in normal-mode.
;;
;; A mapping has one of the following two forms:
;;
;; (vim:map KEYEVENTS 'my-command)
;;
;; (vim:map KEYEVENTS MAPEVENTS)
;;
;; The first form maps the events in KEYEVENTS to the command
;; my-command. The second form defines a vim-like mapping of
;; KEYEVENTS to MAPEVENTS, i.e. the activation of KEYEVENTS invokes
;; the (key-)events in MAPEVENTS.
;;
;; KEYEVENTS is a usual Emacs-sequence of events as it would be used by
;; define-key.
;;; TODO:
;; - better mapping to support stuff like
;; (vim:def-map "c" "d{motion}a")
;;
;; - because of this, mapping "cc" to "0C" does not work with a
;; count since the count is eaten by the '0'
;;
;; - similarily 'o' and 'O' won't work
;;
;; - should we have a 'deep-mapping' function: for example, "x" is
;; mapped to "dl" in the default keymap. If someone decides to
;; redefine "l" to some other command, "x" will change its
;; behaviour, too. A 'deep-mapping' should save the mapping on
;; definition of "x", therefor let "x" behave as usual even after
;; redefining "l"
;;; Code:
(vim:nmap "\\" 'vim:cmd-emacs)
(vim:nmap (kbd "C-z") 'vim:activate-emacs-mode)
(vim:map (kbd "C-z") 'vim:activate-normal-mode :keymap vim:emacs-keymap)
(vim:omap [escape] 'vim:operator-pending-mode-exit)
(vim:omap "0" 'vim:motion-beginning-of-line-or-digit-argument)
(vim:omap "1" 'digit-argument)
(vim:omap "2" 'digit-argument)
(vim:omap "3" 'digit-argument)
(vim:omap "4" 'digit-argument)
(vim:omap "5" 'digit-argument)
(vim:omap "6" 'digit-argument)
(vim:omap "7" 'digit-argument)
(vim:omap "8" 'digit-argument)
(vim:omap "9" 'digit-argument)
(vim:nmap "\"" 'vim:select-register)
(vim:nmap "ZZ" 'vim:cmd-write-and-close)
(vim:mmap "h" 'vim:motion-left)
(vim:mmap "l" 'vim:motion-right)
(vim:mmap "^" 'vim:motion-first-non-blank)
(vim:mmap "$" 'vim:motion-end-of-line)
(vim:mmap "g_" 'vim:motion-last-non-blank)
(vim:mmap "k" 'vim:motion-up)
(vim:mmap "j" 'vim:motion-down)
(vim:mmap "-" "k^")
(vim:mmap "+" "j^")
(vim:mmap "G" 'vim:motion-go-to-first-non-blank-end)
(vim:mmap "gg" 'vim:motion-go-to-first-non-blank-beg)
(vim:mmap "w" 'vim:motion-fwd-word)
(vim:mmap "W" 'vim:motion-fwd-WORD)
(vim:mmap "e" 'vim:motion-fwd-word-end)
(vim:mmap "E" 'vim:motion-fwd-WORD-end)
(vim:mmap "b" 'vim:motion-bwd-word)
(vim:mmap "B" 'vim:motion-bwd-WORD)
(vim:mmap "ge" 'vim:motion-bwd-word-end)
(vim:mmap "gE" 'vim:motion-bwd-WORD-end)
(vim:mmap "(" 'vim:motion-bwd-sentence)
(vim:mmap ")" 'vim:motion-fwd-sentence)
(vim:mmap "{" 'vim:motion-bwd-paragraph)
(vim:mmap "}" 'vim:motion-fwd-paragraph)
(vim:mmap "]]" 'vim:motion-fwd-section)
(vim:mmap "][" 'vim:motion-fwd-section)
(vim:mmap "[[" 'vim:motion-bwd-section)
(vim:mmap "[]" 'vim:motion-bwd-section)
(vim:omap "f" 'vim:motion-find)
(vim:omap "F" 'vim:motion-find-back)
(vim:omap "t" 'vim:motion-find-to)
(vim:omap "T" 'vim:motion-find-back-to)
(vim:omap ";" 'vim:motion-repeat-last-find)
(vim:omap "," 'vim:motion-repeat-last-find-opposite)
(vim:omap "%" 'vim:motion-jump-item)
(vim:omap "'" 'vim:motion-mark-line)
(vim:omap "`" 'vim:motion-mark)
(vim:omap "iw" 'vim:motion-inner-word)
;(vim:nmap "x" "dl")
(vim:nmap "m" 'vim:cmd-set-mark)
(vim:nmap "x" 'vim:cmd-delete-char)
(vim:nmap "D" "d$")
(vim:nmap "d" 'vim:cmd-delete)
(vim:nmap "C" 'vim:cmd-change-rest-of-line)
(vim:nmap "c" 'vim:cmd-change)
(vim:nmap "s" 'vim:cmd-change-char)
(vim:nmap "r" 'vim:cmd-replace-char)
(vim:nmap "R" 'vim:cmd-replace)
(vim:nmap "y" 'vim:cmd-yank)
(vim:nmap "Y" "yy")
(vim:nmap "p" 'vim:cmd-paste-behind)
(vim:nmap "P" 'vim:cmd-paste-before)
(vim:nmap "J" 'vim:cmd-join-lines)
(vim:nmap "/" 'vim:search-start)
(vim:nmap "?" 'vim:search-start-backward)
(vim:nmap "*" 'vim:search-word)
(vim:nmap "#" 'vim:search-word-backward)
(vim:nmap "g*" 'vim:search-unbounded-word)
(vim:nmap "g#" 'vim:search-unbounded-word-backward)
(vim:nmap "n" 'vim:search-repeat)
(vim:nmap "N" 'vim:search-repeat-opposite)
;; The next two maps are very special for an active search.
(vim:map "n" 'vim:search-repeat :keymap vim:search-keymap)
(vim:map "N" 'vim:search-repeat-opposite :keymap vim:search-keymap)
(vim:nmap "i" 'vim:cmd-insert)
(vim:nmap "a" 'vim:cmd-append)
(vim:nmap "I" 'vim:cmd-Insert)
(vim:nmap "A" 'vim:cmd-Append)
(vim:nmap "o" 'vim:cmd-insert-line-below)
(vim:nmap "O" 'vim:cmd-insert-line-above)
(vim:nmap "u" 'vim:cmd-undo)
(vim:nmap (kbd "C-r") 'vim:cmd-redo)
(vim:nmap "." 'vim:cmd-repeat)
(vim:nmap "=" 'vim:cmd-indent)
(vim:nmap "<" 'vim:cmd-shift-left)
(vim:nmap ">" 'vim:cmd-shift-right)
(vim:nmap "~" "g~l")
(vim:nmap "g~" 'vim:cmd-toggle-case)
(vim:nmap "gU" 'vim:cmd-make-upcase)
(vim:nmap "gu" 'vim:cmd-make-downcase)
(vim:omap (kbd "C-e") 'vim:scroll-line-down)
(vim:omap (kbd "C-d") 'vim:scroll-down)
(vim:omap (kbd "C-f") 'vim:scroll-page-down)
(vim:omap "z+" 'vim:scroll-bottom-line-to-top)
(vim:omap (kbd "C-y") 'vim:scroll-line-up)
(vim:omap (kbd "C-u") 'vim:scroll-up)
(vim:omap (kbd "C-b") 'vim:scroll-page-up)
(vim:omap "z^" 'vim:scroll-top-line-to-bottom)
(vim:omap "zt" 'vim:scroll-line-to-top)
(vim:omap (vconcat "z" [return]) "zt^")
(vim:omap (kbd "z RET") (vconcat "z" [return]))
(vim:omap "zz" 'vim:scroll-line-to-center)
(vim:omap "z." "z.^")
(vim:omap "zb" 'vim:scroll-line-to-bottom)
(vim:omap "z-" "zb^")
(vim:wmap (kbd "C-w +") 'vim:window-increase-height)
(vim:wmap (kbd "C-w -") 'vim:window-decrease-height)
(vim:wmap (kbd "C-w =") 'vim:window-balance)
(vim:wmap (kbd "C-w >") 'vim:window-increase-width)
(vim:wmap (kbd "C-w <") 'vim:window-decrease-width)
(vim:wmap (kbd "C-w H") 'vim:window-move-far-left)
(vim:wmap (kbd "C-w J") 'vim:window-move-very-bottom)
(vim:wmap (kbd "C-w K") 'vim:window-move-very-top)
(vim:wmap (kbd "C-w L") 'vim:window-move-far-right)
(vim:wmap (kbd "C-w R") 'vim:window-rotate-upwards)
(vim:wmap (kbd "C-w C-R") (kbd "C-w R"))
(vim:wmap (kbd "C-w r") 'vim:window-rotate-downwards)
(vim:wmap (kbd "C-w C-r") (kbd "C-w r"))
(vim:wmap (kbd "C-w _") 'vim:window-set-height)
(vim:wmap (kbd "C-w C-_") (kbd "C-w _"))
(vim:wmap (kbd "C-w |") 'vim:window-set-width)
(vim:wmap (kbd "C-w b") 'vim:window-bottom-right)
(vim:wmap (kbd "C-w C-b") (kbd "C-w b"))
(vim:wmap (kbd "C-w t") 'vim:window-top-left)
(vim:wmap (kbd "C-w C-t") (kbd "C-w t"))
(vim:wmap (kbd "C-w c") 'vim:window-close)
(vim:wmap (kbd "C-w h") 'vim:window-left)
(vim:wmap (kbd "C-w C-h") (kbd "C-w h"))
(vim:wmap (kbd "C-w j") 'vim:window-down)
(vim:wmap (kbd "C-w C-j") (kbd "C-w j"))
(vim:wmap (kbd "C-w k") 'vim:window-up)
(vim:wmap (kbd "C-w C-k") (kbd "C-w k"))
(vim:wmap (kbd "C-w l") 'vim:window-right)
(vim:wmap (kbd "C-w C-l") (kbd "C-w l"))
(vim:wmap (kbd "C-w p") 'vim:window-lru)
(vim:wmap (kbd "C-w C-p") (kbd "C-w p"))
(vim:wmap (kbd "C-w w") 'vim:window-next)
(vim:wmap (kbd "C-w C-w") (kbd "C-w w"))
(vim:wmap (kbd "C-w W") 'vim:window-prev)
(vim:wmap (kbd "C-w n") 'vim:window-new)
(vim:wmap (kbd "C-w C-n") (kbd "C-w n"))
(vim:wmap (kbd "C-w o") 'vim:window-only)
(vim:wmap (kbd "C-w C-o") (kbd "C-w o"))
(vim:wmap (kbd "C-w s") 'vim:window-split)
(vim:wmap (kbd "C-w C-s") (kbd "C-w s"))
(vim:wmap (kbd "C-w S") (kbd "C-w s"))
(vim:wmap (kbd "C-w v") 'vim:window-vsplit)
(vim:wmap (kbd "C-w C-v") (kbd "C-w v"))
(vim:nmap "v" 'vim:visual-toggle-normal)
(vim:nmap "V" 'vim:visual-toggle-linewise)
(vim:nmap (kbd "C-v") 'vim:visual-toggle-block)
(vim:nmap "gv" 'vim:visual-mode-reactivate)
(vim:nmap ":" 'vim:ex-read-command)
(vim:nmap "q" 'vim:cmd-toggle-macro-recording)
(vim:nmap "@" 'vim:cmd-execute-macro)
(vim:imap (vector vim:ESC-event) 'vim:insert-mode-exit)
(vim:imap [insert] 'vim:insert-mode-toggle-replace)
(vim:imap [kp-insert] [insert])
(vim:imap [insertchar] [insert])
(vim:vmap (vector vim:ESC-event) 'vim:visual-mode-exit)
(vim:vmap "v" 'vim:visual-toggle-normal)
(vim:vmap "V" 'vim:visual-toggle-linewise)
(vim:vmap (kbd "C-v") 'vim:visual-toggle-block)
(vim:vmap "\"" 'vim:select-register)
(vim:vmap "d" 'vim:cmd-delete)
(vim:vmap "D" 'vim:cmd-delete)
(vim:vmap "x" 'vim:cmd-delete)
(vim:vmap "c" 'vim:cmd-change)
(vim:vmap "C" "Vc")
(vim:vmap "r" 'vim:cmd-replace-region)
(vim:vmap "R" 'vim:cmd-change)
(vim:vmap "s" 'vim:cmd-change)
(vim:vmap "S" 'vim:cmd-change)
(vim:vmap "y" 'vim:cmd-yank)
(vim:vmap "Y" 'vim:cmd-yank)
(vim:vmap "J" 'vim:cmd-join)
(vim:vmap "=" 'vim:cmd-indent)
(vim:vmap "<" 'vim:cmd-shift-left)
(vim:vmap ">" 'vim:cmd-shift-right)
(vim:vmap "~" 'vim:cmd-toggle-case)
(vim:vmap "U" 'vim:cmd-make-upcase)
(vim:vmap "u" 'vim:cmd-make-downcase)
(vim:vmap "I" 'vim:visual-insert)
(vim:vmap "A" 'vim:visual-append)
(vim:vmap "o" 'vim:visual-exchange-point-and-mark)
(vim:vmap "O" 'vim:visual-jump-point)
(vim:vmap ":" 'vim:visual-ex-read-command)
(vim:emap "edit" 'vim:cmd-edit)
(vim:emap "e" "edit")
(vim:emap "write" 'vim:cmd-write)
(vim:emap "w" "write")
(vim:emap "write!" 'vim:cmd-write-q)
(vim:emap "w!" "write!")
(vim:emap "wall" 'vim:cmd-write-all)
(vim:emap "wa" "wall")
(vim:emap "wall!" 'vim:cmd-write-all-q)
(vim:emap "wa!" "wall!")
(vim:emap "buffer" 'vim:cmd-buffer)
(vim:emap "b" "buffer")
(vim:emap "split" 'vim:window-split)
(vim:emap "sp" "split")
(vim:emap "vsplit" 'vim:window-vsplit)
(vim:emap "vs" "vsplit")
(vim:emap "new" 'vim:window-new)
(vim:emap "vnew" 'vim:window-vnew)
(vim:emap "vne" "vnew")
(vim:emap "close" 'vim:window-close)
(vim:emap "clo" "close")
(vim:emap "only" 'vim:window-only)
(vim:emap "on" "only")
(vim:emap "quit" 'vim:cmd-quit)
(vim:emap "q" "quit")
(vim:emap "quit!" 'vim:cmd-quit-q)
(vim:emap "q!" "quit")
(vim:emap "wq" 'vim:cmd-save-and-close)
(vim:emap "wq!" 'vim:cmd-save-and-close-q)
(vim:emap "quitall" 'vim:cmd-quit-all)
(vim:emap "quita" "quitall")
(vim:emap "qall" "quitall")
(vim:emap "qa" "qall")
(vim:emap "quitall!" 'vim:cmd-quit-all-q)
(vim:emap "quita!" "quitall!")
(vim:emap "qall!" "quitall!")
(vim:emap "qa!" "qall!")
(vim:emap "wqall" 'vim:cmd-save-and-quit)
(vim:emap "wqa" "wqall")
(vim:emap "xall" "wqall")
(vim:emap "xa" "xall")
(vim:emap "bdelete" 'vim:cmd-delete-buffer)
(vim:emap "bd" "bdelete")
(vim:emap "bdelete!" 'vim:cmd-delete-buffer-q)
(vim:emap "bd!" "bdelete!")
(vim:emap "substitute" 'vim:cmd-substitute)
(vim:emap "s" "substitute")
(vim:emap "marks" 'vim:cmd-show-marks)
(vim:nmap (vector vim:down-mouse-1) 'vim:visual-mouse-clicked)
(vim:vmap (vector vim:down-mouse-1) 'vim:visual-mouse-clicked)
(provide 'vim-maps)
;;; vim-maps.el ends here

View file

@ -0,0 +1,87 @@
;;; vim-modes.el
;; Copyright (C) 2009, 2010 Frank Fischer
;; Author: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;;
;; This file is not part of GNU Emacs.
;;; Code:
(vim:deflocalvar vim:mode-string)
(defun vim:update-mode-line (ident)
"Updates the mode-line to show the specified identifier `ident'."
(setq vim:mode-string (concat "<" (or ident "?") ">"))
(force-mode-line-update))
(defun vim:mode-name (mode)
"Converts a mode-name to vim-mode naming conventions, e.g.
'normal is converted to 'vim:normal-mode."
(intern (concat "vim:" (symbol-name mode) "-mode")))
(vim:deflocalvar vim:active-mode nil
"The currently active vim-mode.")
(vim:deflocalvar vim:active-command-function nil
"The command function of the currently active vim-mode.")
(defun vim:activate-mode (mode)
"Activates a certain vim-mode, disabling the currently active one."
(when vim:active-mode
(funcall vim:active-mode -1))
(when mode
(funcall (vim:mode-name mode) 1)))
(defmacro* vim:define-mode (name doc
&rest body
&key
ident
message
command-function
(cursor ''box)
keymaps)
"Defines a new VIM-mode with certain `name', mode-line-identifier `ident',
activation `message', a `command-function' to be called when a
vim-command should be executed, a `cursor' shape and a list of `keymaps'."
(let* ((mode-name (vim:mode-name name))
(pred-name (intern (concat (symbol-name mode-name) "-p")))
(on-name (intern (concat "vim:activate-" (symbol-name name) "-mode")))
(cursor-name (intern (concat (symbol-name mode-name)
"-cursor"))))
`(progn
(defcustom ,cursor-name ,cursor
,(concat "The cursor-type for vim-mode " (symbol-name name) ".")
:group 'vim-mode)
(define-minor-mode ,mode-name ,doc nil nil nil
(when ,mode-name
,@(when ident `((vim:update-mode-line ,ident)))
,@(when message `((let (message-log-max) (message ,message))))
(setq vim:active-mode ',mode-name)
(setq vim:active-command-function
,(if command-function
command-function
'vim:default-command-function))
(vim:set-cursor ,cursor-name)
(vim:set-keymaps ',mode-name ,keymaps))
,@(progn
(while (keywordp (car body)) (pop body) (pop body))
body))
(defun ,pred-name ()
,(concat "Returns t iff vim-mode is in " (symbol-name name) " mode.")
(and ,mode-name t))
(defun ,on-name ()
,(concat "Activates " (symbol-name name) " mode.")
(interactive)
(vim:activate-mode ',name)))))
(font-lock-add-keywords 'emacs-lisp-mode '("vim:define-mode"))
(provide 'vim-modes)
;;; vim-modes.el ends here

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,192 @@
;;; vim-insert-mode.el - VIM normal mode.
;; Copyright (C) 2009, 2010 Frank Fischer
;; Author: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;;
;; This file is not part of GNU Emacs.
;;; TODO:
;; - bindings in local-omap keymap will not be seen as motions in
;; normal-mode since the parent-keymap of the normal-mode keymap
;; is operator-pending-keymap and not its local counterpart. The
;; reason is that the binding of the local counterpart will be
;; changed to a buffer-local binding.
;;; Code:
(defconst vim:operator-repeat-keymap (vim:make-keymap)
"Keymap to bind the repeat-operator-event.")
(vim:define-keymap operator-pending-mode
"operator pending mode"
:map-command omap)
(vim:define-mode operator-pending "VIM operator-pending mode"
:ident "O"
:keymaps '(vim:operator-pending-mode-keymap
vim:motion-mode-keymap
vim:operator-repeat-keymap
vim:override-keymap)
:command-function 'vim:operator-pending-mode-command)
(add-hook 'vim:operator-pending-mode-hook 'vim:operator-pending-activate)
(add-hook 'vim:operator-pending-mode-off-hook 'vim:operator-pending-deactivate)
(defun vim:operator-pending-activate ()
(cond
(vim:operator-pending-mode
(setq vim:operator-repeat-last-event (vector last-command-event))
(vim:map vim:operator-repeat-last-event 'vim:motion-lines
:keymap vim:operator-repeat-keymap)
(add-hook 'post-command-hook 'vim:operator-pending-mode-exit))
(vim:operator-repeat-last-event
(vim:map vim:operator-repeat-last-event nil :keymap vim:operator-repeat-keymap))))
(defun vim:operator-pending-deactivate ()
(remove-hook 'post-command-hook 'vim:operator-pending-mode-exit))
(defun vim:operator-pending-mode-exit ()
"Exits operator-pending-mode and returns to normal-mode."
(interactive)
(unless (or (vim:cmd-function this-command)
(eq this-command 'digit-argument)
(eq this-command 'universal-argument-other-key))
(vim:activate-normal-mode)))
(defun vim:operator-pending-mode-command (command)
"Executes a complex command in operator-pending mode."
(case (vim:cmd-type command)
('simple (error "No simple-commands allowed in operator-pending mode."))
('complex (error "No complex-commands allowed in operator-pending mode."))
(t (vim:normal-execute-complex-command command)))
(when (vim:operator-pending-mode-p)
(vim:activate-normal-mode)))
(vim:define-keymap normal-mode "normal mode" &map-command nmap)
(vim:define-mode normal "VIM normal mode"
:ident "N"
:message "-- NORMAL --"
:keymaps '(vim:normal-mode-keymap
vim:operator-pending-mode-keymap
vim:motion-mode-keymap
vim:window-mode-keymap
vim:override-keymap)
:command-function 'vim:normal-mode-command)
(defun vim:normal-mode-command (command)
"Executes a motion or simple-command or prepares a complex command."
(case (vim:cmd-type command)
('simple (vim:normal-execute-simple-command command))
('complex (vim:normal-prepare-complex-command command))
('special (error "no special so far"))
(t (vim:normal-execute-motion command))))
(defun vim:normal-execute-motion (command)
"Executes a motion."
(setq vim:current-motion command)
(when current-prefix-arg
(setq vim:current-motion-count (prefix-numeric-value current-prefix-arg)))
(when (vim:cmd-char-arg-p command)
(setq vim:current-motion-arg (read-char-exclusive)))
(vim:execute-current-motion)
(vim:reset-key-state)
(vim:clear-key-sequence)
(vim:adjust-point))
(defun vim:normal-execute-simple-command (command)
"Executes a simple command."
(when current-prefix-arg
(setq vim:current-cmd-count (prefix-numeric-value current-prefix-arg)))
(when (vim:cmd-char-arg-p command)
(setq vim:current-cmd-arg (read-char-exclusive)))
(let ((parameters nil)
(vim:last-undo buffer-undo-list))
(when (vim:cmd-count-p command)
(push vim:current-cmd-count parameters)
(push :count parameters))
(when (vim:cmd-char-arg-p command)
(push vim:current-cmd-arg parameters)
(push :argument parameters))
(when (and (vim:cmd-register-p command)
vim:current-register)
(push vim:current-register parameters)
(push :register parameters))
(vim:apply-save-buffer (vim:cmd-function command) parameters)
(when (vim:cmd-repeatable-p command)
(setq vim:repeat-events (vconcat vim:current-key-sequence
(vim:this-command-keys))))
(vim:connect-undos vim:last-undo))
(vim:reset-key-state)
(vim:clear-key-sequence)
(vim:adjust-point))
(defun vim:normal-prepare-complex-command (command)
"Prepares a complex command, switching to operator-pending mode."
(when current-prefix-arg
(setq vim:current-cmd-count (prefix-numeric-value current-prefix-arg)))
(setq vim:current-cmd command)
(setq vim:current-key-sequence (vconcat vim:current-key-sequence (vim:this-command-keys)))
(vim:activate-operator-pending-mode))
(defun vim:normal-execute-complex-command (motion-command)
"Executes a complex command with a certain motion command."
(setq vim:current-motion motion-command)
(when current-prefix-arg
(setq vim:current-motion-count (prefix-numeric-value current-prefix-arg)))
(when (or vim:current-motion-count vim:current-cmd-count)
(setq vim:current-motion-count (* (or vim:current-cmd-count 1)
(or vim:current-motion-count 1)))
(setq vim:current-cmd-count nil))
(when (vim:cmd-char-arg-p motion-command)
(setq vim:current-motion-arg (read-char-exclusive)))
(let ((vim:last-undo buffer-undo-list))
(if (and (vim:cmd-register-p vim:current-cmd) vim:current-register)
(vim:funcall-save-buffer (vim:cmd-function vim:current-cmd)
:motion (vim:get-current-cmd-motion)
:register vim:current-register)
(vim:funcall-save-buffer (vim:cmd-function vim:current-cmd)
:motion (vim:get-current-cmd-motion)))
(when (vim:cmd-repeatable-p vim:current-cmd)
(setq vim:repeat-events (vconcat vim:current-key-sequence
(vim:this-command-keys))))
(vim:connect-undos vim:last-undo))
(vim:reset-key-state)
(vim:clear-key-sequence)
(vim:adjust-point))
(vim:define-mode operator-pending "VIM operator-pending mode"
:ident "O"
:keymaps '(vim:operator-pending-mode-keymap
vim:motion-mode-keymap
vim:operator-repeat-keymap
vim:override-keymap)
:command-function 'vim:operator-pending-mode-command)
(provide 'vim-normal-mode)
;;; vim-normal-mode.el ends here

View file

@ -0,0 +1,136 @@
;;; vim-scroll.el - Implementation of scrolling commands
;; Copyright (C) 2009, 2010 Frank Fischer
;; Author: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;;
;; This file is not part of GNU Emacs.
;;; Commentary:
;; This file contains implementations for the scrolling. Scroll
;; operations are usually just simple commands and should not be
;; repeatable but should keep visual mode.
;;; Code:
(vim:define-keymap motion-mode "motion mode" :map-command mmap)
(vim:define-mode motion "VIM motion mode"
:ident "M"
:keymaps '(vim:motion-mode-keymap vim:window-mode-keymap)
:command-function 'vim:normal-mode-command)
(defun vim:num-visible-lines ()
"Returns the number of currently visible lines."
(- (window-height) 1))
(defun vim:max-scroll-up ()
"Returns the maximal number of lines that can be scrolled up."
(1- (line-number-at-pos (window-start))))
(defun vim:max-scroll-down ()
"Returns the maximal number of lines that can be scrolled down."
(if (pos-visible-in-window-p (window-end))
0
(1+ (- (line-number-at-pos (point-max))
(line-number-at-pos (window-end))))))
(vim:defcmd vim:scroll-line-up (count nonrepeatable keep-visual)
"Scrolls the window `count' lines upwards."
(vim:use-last-column)
(scroll-down (or count 1)))
(vim:defcmd vim:scroll-line-down (count nonrepeatable keep-visual)
"Scrolls the window `count' lines downwards."
(vim:use-last-column)
(scroll-up (or count 1)))
(vim:defcmd vim:scroll-up (count nonrepeatable keep-visual)
"Scrolls the window and the cursor `count' lines upwards, default half of the screen."
(vim:use-last-column)
(let ((p (point))
(c (or count (/ (vim:num-visible-lines) 2))))
(save-excursion
(scroll-down (min (vim:max-scroll-up) c)))
(forward-line (- c))
(when (= (line-number-at-pos p)
(line-number-at-pos (point)))
(ding))))
(vim:defcmd vim:scroll-down (count nonrepeatable keep-visual)
"Scrolls the window and the cursor `count' lines downwards, default half of the screen."
(vim:use-last-column)
(let ((p (point))
(c (or count (/ (vim:num-visible-lines) 2))))
(save-excursion
(scroll-up (min (vim:max-scroll-down) c)))
(forward-line c)
(when (= (line-number-at-pos p)
(line-number-at-pos (point)))
(ding))))
(vim:defcmd vim:scroll-page-up (count nonrepeatable keep-visual)
"Scrolls the window `count' pages upwards."
(vim:use-last-column)
(condition-case nil
(dotimes (i (or count 1))
(scroll-down nil))
(error (goto-char (point-min)))))
(vim:defcmd vim:scroll-page-down (count nonrepeatable keep-visual)
"Scrolls the window `count' pages upwards."
(vim:use-last-column)
(condition-case nil
(dotimes (i (or count 1))
(scroll-up nil))
(error (goto-char (point-max)))))
(vim:defcmd vim:scroll-line-to-top (count nonrepeatable keep-visual)
"Scrolls line number `count' (or the cursor line) to the top of the window."
(vim:use-last-column)
(goto-line (or count (line-number-at-pos (point))))
(recenter 0))
(vim:defcmd vim:scroll-line-to-center (count nonrepeatable keep-visual)
"Scrolls line number `count' (or the cursor line) to the center of the window."
(vim:use-last-column)
(goto-line (or count (line-number-at-pos (point))))
(recenter nil))
(vim:defcmd vim:scroll-line-to-bottom (count nonrepeatable keep-visual)
"Scrolls line number `count' (or the cursor line) to the bottom of the window."
(vim:use-last-column)
(goto-line (or count (line-number-at-pos (point))))
(recenter -1))
(vim:defcmd vim:scroll-bottom-line-to-top (count nonrepeatable keep-visual)
"Scrolls the line right below the window or line `count' to the top of the window."
(if count
(goto-line count)
(goto-char (window-end))
(unless (bobp) (backward-char)))
(recenter 0)
(vim:motion-first-non-blank))
(vim:defcmd vim:scroll-top-line-to-bottom (count nonrepeatable keep-visual)
"Scrolls the line right below the window or line `count' to the top of the window."
(if count
(goto-line count)
(goto-char (window-start)))
(recenter -1)
(vim:motion-first-non-blank))
(provide 'vim-scroll)
;;; vim-scroll.el ends here

View file

@ -0,0 +1,243 @@
;;; vim-search.el - Search und substitute commands for ex-mode.
;; Copyright (C) 2009, 2010 Frank Fischer
;; Author: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;;
;; This file is not part of GNU Emacs.
;; TODO:
;;
;; - searching currently uses isearch. Although this is quite powerful,
;; it's only usuably as interactive search and difficult to use with
;; semi-interactive stuff like the "*" command. The current implementation
;; using unread-command-events is quite ugly.
;; - the substitute command should be more interactive and especially an operation
;; without the 'g' option should highlight all future occurences
;;; Code:
(defconst vim:search-keymap (make-sparse-keymap))
(vim:set-keymap-default-binding vim:search-keymap 'vim:search-mode-exit)
(vim:deflocalvar vim:search-last-direction nil
"The last search direction, either 'forward or 'backward.")
(defun vim:search-mode-activate ()
(setq cursor-type vim:normal-mode-cursor))
(defun vim:search-mode-deactivate ()
(isearch-exit))
(vim:defcmd vim:search-mode-exit ()
(vim:activate-normal-mode)
(push last-command-event unread-command-events))
;; Search mode is a very special mode being activated during a search
;; command. Its purpose is to disable highlighting of search results
;; if something else than a repeat-search event occurs.
(vim:define-mode search "VIM search mode"
:ident "S"
:keymaps '(vim:search-keymap)
:command-function 'vim:search-mode-command)
(add-hook 'vim:search-mode-on-hook 'vim:search-mode-activate)
(add-hook 'vim:search-mode-off-hook 'vim:search-mode-activate)
(defun vim:search-mode-command (command)
"Executes a simple-command in search-mode."
(case (vim:cmd-type command)
('simple (vim:normal-execute-simple-command command))
(t (error "Only simple commands allowed in search-mode."))))
(vim:defcmd vim:search-start (nonrepeatable)
"Starts an incremental regexp search."
(let ((search-nonincremental-instead nil))
(ad-activate 'isearch-message-prefix)
(isearch-forward-regexp)
(ad-deactivate 'isearch-message-prefix)
(setq vim:last-search-direction (if isearch-forward 'forward 'backward))))
(vim:defcmd vim:search-start-backward (nonrepeatable)
"Starts an incremental regexp search."
(let ((search-nonincremental-instead nil))
(ad-activate 'isearch-message-prefix)
(isearch-backward-regexp)
(ad-deactivate 'isearch-message-prefix)
(setq vim:last-search-direction (if isearch-forward 'forward 'backward))))
(vim:defcmd vim:search-repeat (nonrepeatable)
"Repeats the last incremental search."
(unless (vim:search-mode-p)
(vim:activate-search-mode))
(ad-activate 'isearch-message-prefix)
(isearch-repeat vim:last-search-direction)
(ad-deactivate 'isearch-message-prefix))
(vim:defcmd vim:search-repeat-opposite (nonrepeatable)
"Starts an incremental regexp search."
(unless (vim:search-mode-p)
(vim:activate-search-mode))
(ad-activate 'isearch-message-prefix)
(isearch-repeat (if (eq vim:last-search-direction 'forward) 'backward 'forward))
(ad-deactivate 'isearch-message-prefix))
(defadvice isearch-message-prefix (after vim:isearch-message-prefix (&optional c-q-hack ellipsis nonincremental))
"This advice changes the minibuffer indicator to '/' or '?'"
(setq ad-return-value (if isearch-forward "/" "?")))
(defun vim:start-word-search (unbounded direction)
(condition-case nil
(goto-char (vim:motion-bwd-word-end :count 1))
(error nil))
(save-excursion
(re-search-forward (concat "\\<[" vim:word "]+\\>")))
(when (eq direction 'backward)
(goto-char (1+ (match-end 0))))
(let ((events (reverse (append (if (eq direction 'forward)
"/"
"?")
(if unbounded
(regexp-quote (match-string 0))
(concat "\\<"
(regexp-quote (match-string 0))
"\\>"))
[return]
"n"
nil))))
(while events
(push (car events) unread-command-events)
(setq events (cdr events)))))
(vim:defcmd vim:search-word (nonrepeatable)
"Searches the next occurence of word under the cursor."
(vim:start-word-search nil 'forward))
(vim:defcmd vim:search-word-backward (nonrepeatable)
"Searches the next occurence of word under the cursor."
(vim:start-word-search nil 'backward))
(vim:defcmd vim:search-unbounded-word (nonrepeatable)
"Searches the next occurence of word under the cursor."
(vim:start-word-search t 'forward))
(vim:defcmd vim:search-unbounded-word-backward (nonrepeatable)
"Searches the next occurence of word under the cursor."
(vim:start-word-search t 'backward))
(vim:defcmd vim:cmd-substitute (motion argument nonrepeatable)
"The VIM substitutde command: [range]s/pattern/replacement/flags"
(multiple-value-bind (pattern replacement flags) (vim:parse-substitute argument)
(lexical-let* ((pattern pattern)
(replacement replacement)
(first-line (if motion (vim:motion-first-line motion) (line-number-at-pos (point))))
(last-line (if motion (vim:motion-last-line motion) (line-number-at-pos (point))))
(whole-line (and flags (find ?g flags)))
(confirm (and flags (find ?c flags)))
(ignore-case (and flags (find ?i flags)))
(dont-ignore-case (and flags (find ?I flags)))
(case-fold-search (or (and case-fold-search
(not dont-ignore-case))
(and (not case-fold-search)
ignore-case)))
(case-replace case-fold-search)
(last-point (point))
(overlay (make-overlay (point) (point)))
(next-line (line-number-at-pos (point)))
(nreplaced 0))
(unwind-protect
(if whole-line
;; this one is easy, just use the built in function
(vim:perform-replace pattern replacement confirm t nil nil nil
(save-excursion
(goto-line first-line)
(line-beginning-position))
(save-excursion
(goto-line last-line)
(line-end-position)))
(if confirm
(progn
;; this one is more difficult, we have to do the
;; highlighting and questioning on our own
(overlay-put overlay 'face
(if (internal-find-face 'isearch nil)
'isearch 'region))
(map-y-or-n-p #'(lambda (x)
(set-match-data x)
(move-overlay overlay (match-beginning 0) (match-end 0))
(concat "Query replacing "
(match-string 0)
" with "
(match-substitute-replacement replacement case-fold-search)
": "))
#'(lambda (x)
(set-match-data x)
(replace-match replacement case-fold-search)
(incf nreplaced)
(setq last-point (point)))
#'(lambda ()
(let ((end (save-excursion
(goto-line last-line)
(line-end-position))))
(goto-line next-line)
(beginning-of-line)
(when (and (> end (point))
(re-search-forward pattern end t nil))
(setq last-point (point))
(setq next-line (1+ (line-number-at-pos (point))))
(match-data))))))
;; just replace the first occurences per line
;; without highlighting and asking
(goto-line first-line)
(beginning-of-line)
(while (and (<= (line-number-at-pos (point)) last-line)
(re-search-forward pattern (save-excursion
(goto-line last-line)
(line-end-position))
t nil))
(incf nreplaced)
(replace-match replacement)
(setq last-point (point))
(forward-line)
(beginning-of-line)))
(goto-char last-point)
(if (= nreplaced 1)
(message "Replaced 1 occurence")
(message "Replaced %d occurences" nreplaced)))
;; clean-up the overlay
(delete-overlay overlay)))))
(defun vim:parse-substitute (text)
(when (string-match "\\`\\s-*/\\(\\(?:[^/]\\|\\\\.\\)+\\)/\\(\\(?:[^/]\\|\\\\.\\)*\\)\\(?:/\\([giIc]*\\)\\)?\\s-*\\'"
text)
(let ((pattern (match-string 1 text))
(replacement (match-string 2 text))
(flags (match-string 3 text)))
(values pattern
;; handle some special escapes, especially \\ and \/
(replace-regexp-in-string "\\\\."
(lambda (x)
(cond ((string= x "\\n") "\n")
((string= x "\\t") "\t")
((string= x "\\r") "\r")
((string= x "\\/") "/")
((string= x "\\\\") "\\\\\\\\")
(t x)))
replacement)
flags))))
(provide 'vim-search)
;;; vim-search.el ends here

View file

@ -0,0 +1,71 @@
;;; vim-undo.el - Undo/Redo for VIM.
;; Copyright (C) 2009, 2010 Frank Fischer
;; Author: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;;
;; This file is not part of GNU Emacs.
;;; Commentary:
;; Before the execution of an editing command, the calling function
;; should save the current head of buffer-undo-list. When the
;; editing-command has finished, the calling function should use
;; vim:connect-undos to connect the changes made during editing to one
;; single undo-block.
;;
;; Insert-mode has a special handling: when activated, it stores the
;; current head of buffer-undo-list in vim:last-insert-undo and used
;; this pointer to connect all editing actions during insert-mode to
;; one undo-block when insert-mode is deactivated. If a function
;; activates insert-mode it may modify vim:last-insert-undo to an
;; apropriate value (see vim:execute-mapping for an example).
;;; Code:
(condition-case nil
(require 'redo)
(error
(message "vim-mode: Could not load 'redo', redo-command not available.")))
(defvar vim:last-undo)
;; undo stuff
(defun vim:connect-undos (last-undo)
(labels
((find-mark (lst)
(while (not (or (null lst)
(eq lst last-undo)))
(setq lst (cdr lst)))
(not (null lst))))
;; ensure last-undo is still in the undo list
(when (and last-undo
(not (eq last-undo buffer-undo-list))
(find-mark buffer-undo-list))
;; add the end-of-command mark if not already there
(unless (null (car buffer-undo-list))
(push nil buffer-undo-list))
;; remove all nils until the mark
(let ((lst buffer-undo-list))
(while (and lst
(not (eq (cdr lst) last-undo)))
(if (null (cadr lst))
(setcdr lst (cddr lst))
(setq lst (cdr lst))))))))
(vim:defcmd vim:cmd-undo (count nonrepeatable)
(setq vim:last-undo nil)
(dotimes (i (or count 1))
(undo)))
(vim:defcmd vim:cmd-redo (count nonrepeatable)
(setq vim:last-undo nil)
(redo (or count 1)))
(provide 'vim-undo)
;;; vim-undo.el ends here

View file

@ -0,0 +1,404 @@
;;; vim-vim.el - Basic functions and macros for vim-mode.
;; Copyright (C) 2009, 2010 Frank Fischer
;; Author: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;;
;; This file is not part of GNU Emacs.
;;; Code:
(defvar vim:repeat-events nil
"The sequence of events for the repeat command.")
(vim:deflocalvar vim:current-register nil
"The register of the current command.")
(vim:deflocalvar vim:current-cmd-count nil
"The count of the current command.")
(vim:deflocalvar vim:current-cmd nil
"The node of the current command.")
(vim:deflocalvar vim:current-cmd-arg nil
"The argument of the current command.")
(vim:deflocalvar vim:current-motion-count nil
"The count of the current motion.")
(vim:deflocalvar vim:current-motion nil
"The node of the current motion.")
(vim:deflocalvar vim:current-motion-arg nil
"The argument of the current motion.")
(vim:deflocalvar vim:current-motion-type nil
"The type of the current motion (inclusive, exclusive, linewise).")
(defun vim:toplevel-execution ()
"Returns t iff this is a toplevel execution, not a mapping or repeat."
(not executing-kbd-macro))
(defadvice vim:reset-key-state (before vim:vim-reset-key-state)
"Resets the current state of the keymap."
(setq vim:current-register nil
vim:current-cmd-count nil
vim:current-cmd nil
vim:current-cmd-arg nil
vim:current-motion-count nil
vim:current-motion nil
vim:current-motion-arg nil
vim:current-motion-type nil))
(ad-activate 'vim:reset-key-state)
(defmacro* vim:defcmd (name (&rest args) &rest body)
"Defines a new VIM-command."
(declare (indent defun))
(let ((count nil)
(register nil)
(motion nil)
(argument nil)
(keep-visual nil)
(repeatable t)
(params nil)
(named-params nil)
(doc nil))
;; extract documentation string
(if (and (consp body)
(cdr body)
(stringp (car body)))
(setq doc (car body)
body (cdr body))
(setq doc (format "VIM - command (%s %s)" name args)))
;; collect parameters
(dolist (arg args)
(case (if (consp arg) (car arg) arg)
('count
(setq count t)
(push '(count nil) params)
(when (and (consp arg)
(not (eq (cadr arg) 'count)))
(push `(,(cadr arg) count) named-params)))
('register
(setq register t)
(push '(register nil) params)
(when (and (consp arg)
(not (eq (cadr arg) 'register)))
(push `(,(cadr arg) register) named-params)))
('motion
(when motion
(error "%s: only one motion argument may be specified: %s" 'vim:defcmd arg))
(setq motion t)
(push 'motion params)
(when (and (consp arg)
(not (eq (cadr arg) 'motion)))
(push `(,(cadr arg) motion) named-params)))
('motion:optional
(when motion
(error "%s: only one motion argument may be specified: %s" 'vim:defcmd arg))
(setq motion ''optional)
(push 'motion params)
(when (and (consp arg)
(not (eq (cadr arg) 'motion)))
(push `(,(cadr arg) motion) named-params)))
((argument argument:char argument:file argument:buffer)
(when argument
(error "%s: only one argument may be specified: %s" 'vim:defcmd arg))
(let* ((arg-name (symbol-name (if (consp arg) (car arg) arg)))
(pos (position ?: arg-name))
(arg-type (if pos
`',(intern (substring arg-name (1+ pos)))
t)))
(setq argument arg-type)
(push 'argument params)
(when (and (consp arg)
(not (eq (cadr arg) 'argument)))
(push `(,(cadr arg) argument) named-params))))
('keep-visual (setq keep-visual t))
('do-not-keep-visual (setq keep-visual nil))
('repeatable (setq repeatable t))
('nonrepeatable (setq repeatable nil))
(t (error "%s: Unexpected argument: %s" 'vim:defcmd arg))))
`(progn
(put ',name 'type ',(if motion 'complex 'simple))
(put ',name 'count ,count)
(put ',name 'motion ,motion)
(put ',name 'argument ,argument)
(put ',name 'register ,register)
(put ',name 'keep-visual ,keep-visual)
(put ',name 'repeatable ,repeatable)
(put ',name 'function
(function* (lambda (,@(when params `(&key ,@params))
,@(when named-params `(&aux ,@named-params)))
,@body)))
(defun* ,name (&rest args)
,doc
(interactive)
(if (vim:called-interactively-p)
(funcall vim:active-command-function ',name)
(apply (get ',name 'function) args))))))
(defmacro* vim:defmotion (name (&rest args) &rest body)
(declare (indent defun))
(let ((type nil)
(count nil)
(argument nil)
(params nil)
(named-params nil)
(doc nil))
;; extract documentation string
(if (and (consp body)
(cdr body)
(stringp (car body)))
(setq doc (car body)
body (cdr body))
(setq doc (format "VIM - motion (%s %s)" name args)))
;; collect parameters
(dolist (arg args)
(case (if (consp arg) (car arg) arg)
((inclusive exclusive linewise block)
(setq type arg))
('count
(setq count t)
(push '(count nil) params)
(when (and (consp arg)
(not (eq (cadr arg) 'count)))
(push `(,(cadr arg) count) named-params)))
((argument argument:char)
(when argument
(error "%s: only one argument may be specified: %s" 'vim:defcmd arg))
(setq argument ''char)
(push 'argument params)
(when (and (consp arg)
(not (eq (cadr arg) 'argument)))
(push `(,(cadr arg) argument) named-params)))
(t (error "%s: Unexpected argument: %s" 'vim:defmotion arg))))
(unless type
(error "%s: Motion type must be specified" 'vim:defmotion))
`(progn
(put ',name 'type ',type)
(put ',name 'count ,count)
(put ',name 'argument ,argument)
(put ',name 'function
(function* (lambda (,@(when params `(&key ,@params))
,@(when named-params `(&aux ,@named-params)))
(vim:do-motion ',type (progn ,@body)))))
(defun* ,name (&rest args)
,doc
(interactive)
(if (vim:called-interactively-p)
(vim:execute-command ',name)
(apply (get ',name 'function) args))))))
(font-lock-add-keywords 'emacs-lisp-mode '("vim:defcmd" "vim:defmotion"))
(defun vim:cmd-count-p (cmd)
"Returns non-nil iff command cmd takes a count."
(get cmd 'count))
(defun vim:cmd-register-p (cmd)
"Returns non-nil iff command may take a register."
(get cmd 'register))
(defun vim:cmd-motion-p (cmd)
"Returns non-nil iff command `cmd' takes a motion parameter."
(get cmd 'motion))
(defun vim:cmd-arg (cmd)
"Returns the type of command's argument."
(get cmd 'argument))
(defun vim:cmd-arg-p (cmd)
"Returns non-nil iff command cmd takes an argument of arbitrary type."
(not (null (get cmd 'argument))))
(defun vim:cmd-text-arg-p (cmd)
"Returns non-nil iff command cmd takes a text argument."
(eq (vim:cmd-arg cmd) t))
(defun vim:cmd-char-arg-p (cmd)
"Returns non-nil iff command cmd takes a char argument."
(eq (vim:cmd-arg cmd) 'char))
(defun vim:cmd-file-arg-p (cmd)
"Returns non-nil iff command cmd takes a file argument."
(eq (vim:cmd-arg cmd) 'file))
(defun vim:cmd-buffer-arg-p (cmd)
"Returns non-nil iff command cmd takes a buffer argument."
(eq (vim:cmd-arg cmd) 'buffer))
(defun vim:cmd-repeatable-p (cmd)
"Returns non-nil iff command cmd is repeatable."
(get cmd 'repeatable))
(defun vim:cmd-keep-visual-p (cmd)
"Returns non-nil iff command cmd should stay in visual mode."
(get cmd 'keep-visual))
(defun vim:cmd-type (cmd)
"Returns the type of command cmd."
(get cmd 'type))
(defun vim:cmd-function (cmd)
"Returns the function of command `cmd'."
(get cmd 'function))
(defmacro vim:apply-save-buffer (&rest args)
"Like `apply' but stores the current buffer."
(let ((ret (gensym)))
`(progn
(save-current-buffer
(let ((,ret (apply ,@args)))
(setq vim:new-buffer (current-buffer))
,ret)))))
(defmacro vim:funcall-save-buffer (&rest args)
"Like `funcall' but stores the current buffer."
(let ((ret (gensym)))
`(progn
(save-current-buffer
(let ((,ret (funcall ,@args)))
(setq vim:new-buffer (current-buffer))
,ret)))))
(defun vim:select-register ()
"Sets the register for the next command."
(interactive)
(setq vim:current-register (read-char-exclusive)))
(defun vim:get-register (register)
"Returns the content of `register', signals error on fail."
(let ((txt (get-register register)))
(unless txt
(error "Register '%c' empty." register))
txt))
(defun vim:execute-command (cmd)
"Executes the vim-command `cmd'.
If an error occures, this function switches back to normal-mode.
Since all vim-mode commands go through this function, this is
the perfect point to do some house-keeping."
(condition-case err
(funcall vim:active-command-function cmd)
(error
(vim:reset-key-state)
(vim:clear-key-sequence)
(vim:adjust-point)
(vim:activate-normal-mode)
(signal (car err) (cdr err)))))
(defun vim:execute-current-motion ()
"Executes the current motion and returns the representing
vim:motion object."
(if (null vim:current-motion)
nil
(let ((cmd vim:current-motion)
(count (if (or vim:current-cmd-count
vim:current-motion-count)
(* (or vim:current-cmd-count 1)
(or vim:current-motion-count 1))
nil))
(parameters nil))
;; build the parameter-list
(when (vim:cmd-char-arg-p cmd)
(push vim:current-motion-arg parameters)
(push :argument parameters))
(when (vim:cmd-count-p cmd)
(push count parameters)
(push :count parameters))
(vim:apply-save-buffer cmd parameters))))
(defun vim:get-current-cmd-motion ()
"Returns the motion range for the current command w.r.t.
command-specific transformations."
(let ((motion (save-excursion (vim:execute-current-motion))))
(when (and (eq (vim:motion-type motion) 'exclusive)
(save-excursion
(goto-char (vim:motion-end-pos motion))
(bolp)))
;; exclusive motions may be modified
(let ((end (vim:adjust-end-of-line-position (1- (vim:motion-end-pos motion)))))
(if (< (vim:motion-begin motion)
(vim:motion-end motion))
(setf (vim:motion-end motion) end)
(setf (vim:motion-begin motion) end)))
(if (save-excursion
(goto-char (vim:motion-begin-pos motion))
(vim:looking-back "^\\s-*"))
;; motion becomes linewise(-exclusive)
(setf (vim:motion-type motion) 'linewise)
;; motion becomes inclusive
(setf (vim:motion-type motion) 'inclusive)))
motion))
(defconst vim:emacs-keymap (vim:make-keymap)
"Keymap for EMACS mode.")
(vim:define-mode emacs "VIM emacs-mode"
:ident "E"
:message "-- EMACS --"
:keymaps '(vim:emacs-keymap)
:command-function 'vim:normal-mode-command)
;; from viper
(defsubst vim:ESC-event-p (event)
(let ((ESC-keys '(?\e (control \[) escape))
(key (event-basic-type event)))
(member key ESC-keys)))
;; from viper
(defun vim:escape-to-emacs (events)
"Executes some `events' in emacs."
(let* ((vim-key-mode nil)
(unread-command-events events)
(keys (read-key-sequence nil))
(event (elt (listify-key-sequence keys) 0)))
(when (vim:ESC-event-p event)
(let ((unread-command-events keys))
(setq keys (read-key-sequence nil))))
(let ((command (key-binding keys)))
(setq this-command command)
(setq last-command-event (elt keys (1- (length keys))))
(setq last-command-char last-command-event)
(command-execute command)
(when (memq command '(digit-argument
universal-argument))
(vim:escape-to-emacs nil)))))
(provide 'vim-vim)
;;; vim-vim.el ends here

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,328 @@
;;; vim-window.el - Implementation of window commands.
;; Copyright (C) 2009, 2010 Frank Fischer
;; Author: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;;
;; This file is not part of GNU Emacs.
;;; Commentary:
;; This file contains implementations for the window operations.
;; Window operations are usually just simple commands and should not
;; be repeatable.
;;; Code:
(condition-case nil
(require 'windmove)
(error
(message "vim-mode: Could not load 'windmove', window-commands not available.")
nil))
(vim:define-keymap window-mode "window mode" :map-command wmap)
(vim:define-mode window "VIM window mode"
:ident "W"
:keymaps '(vim:window-mode-keymap)
:command-function 'vim:normal-mode-command)
(defun vim:resize-window (new-size &optional horizontal)
"Sets the current window's with or height to `new-size'."
(let ((wincfg (current-window-configuration))
(nwins (length (window-list)))
(count (if horizontal
(- new-size (window-width))
(- new-size (window-height)))))
(catch 'loop
(save-window-excursion
(while (not (zerop count))
(if (> count 0)
(progn (enlarge-window 1 horizontal) (decf count))
(progn
(shrink-window 1 horizontal)
(incf count)))
(if (= nwins (length (window-list)))
(setq wincfg (current-window-configuration))
(throw 'loop t)))))
(set-window-configuration wincfg)))
(defun vim:get-buffer-tree (wintree)
"Extracts the buffer tree from a given window-tree."
(if (consp wintree)
(cons (car wintree) (mapcar #'vim:get-buffer-tree (cddr wintree)))
(window-buffer wintree)))
(defun vim:restore-window-tree (win tree)
"Restores the given buffer-tree layout as subwindows of win."
(cond
((and (consp tree) (cddr tree))
(let ((newwin (split-window win nil (not (car tree)))))
(vim:restore-window-tree win (cadr tree))
(vim:restore-window-tree newwin (cons (car tree) (cddr tree)))))
((consp tree)
(set-window-buffer win (cadr tree)))
(t (set-window-buffer win tree))))
(vim:defcmd vim:window-split (count (argument:file file) nonrepeatable)
"Splits the current window horizontally, `count' lines height, editing a certain `file'."
(let ((new-win (split-window (selected-window) count)))
(when file
(vim:cmd-edit :argument file))))
(vim:defcmd vim:window-vsplit (count (argument:file file) nonrepeatable)
"Splits the current window vertically, `count' columns width, editing a certain `file'."
(let ((new-win (split-window (selected-window) count t)))
(when file
(vim:cmd-edit :argument file))))
(vim:defcmd vim:window-close (nonrepeatable)
"Closes the current window."
(delete-window))
(vim:defcmd vim:window-only (nonrepeatable)
"Closes all but the current window."
(delete-other-windows))
(vim:defcmd vim:window-left (count nonrepeatable)
"Move the cursor to new `count'-th window left of the current one."
(dotimes (i (or count 1))
(windmove-left)))
(vim:defcmd vim:window-right (count nonrepeatable)
"Move the cursor to new `count'-th window right of the current one."
(dotimes (i (or count 1))
(windmove-right)))
(vim:defcmd vim:window-up (count nonrepeatable)
"Move the cursor to new `count'-th window above the current one."
(dotimes (i (or count 1))
(windmove-up)))
(vim:defcmd vim:window-down (count nonrepeatable)
"Move the cursor to new `count'-th window below the current one."
(dotimes (i (or count 1))
(windmove-down)))
(vim:defcmd vim:window-bottom-right (nonrepeatable)
"Move the cursor to bottom-right window."
(do ((success t))
((not success))
(setq success nil)
(condition-case nil
(progn
(windmove-right)
(setq success t))
(error nil))
(condition-case nil
(progn
(windmove-down)
(setq success t))
(error nil))))
(vim:defcmd vim:window-top-left (nonrepeatable)
"Move the cursor to top-left window."
(do ((success t))
((not success))
(setq success nil)
(condition-case nil
(progn
(windmove-left)
(setq success t))
(error nil))
(condition-case nil
(progn
(windmove-up)
(setq success t))
(error nil))))
(vim:defcmd vim:window-lru (nonrepeatable)
"Move the cursor to the previous (last accessed) window."
(select-window (get-lru-window)))
(vim:defcmd vim:window-next (count nonrepeatable)
"Move the cursor to the next window in the cyclic order.
With `count' go to the count-th window in the order starting from
top-left."
(if (not count)
(select-window (next-window))
(vim:window-top-left)
(other-window (1- (or count 1)))))
(vim:defcmd vim:window-prev (count nonrepeatable)
"Move the cursor to the previous window in the cyclic order.
With `count' go to the count-th window in the order starting from
top-left."
(if (not count)
(select-window (previous-window))
(vim:window-top-left)
(other-window (1- (or count 1)))))
(vim:defcmd vim:window-new (count (argument:file file) nonrepeatable)
"Splits the current window horizontally and opens a new buffer or edits a certain `file'."
(split-window (selected-window) count)
(if file
(vim:cmd-edit :argument file)
(let ((buffer (generate-new-buffer "*new*")))
(set-window-buffer (selected-window) buffer)
(with-current-buffer buffer (normal-mode)))))
(vim:defcmd vim:window-vnew (count (argument:file file) nonrepeatable)
"Splits the current window vertically and opens a new buffer name or edits a certain `file'."
(split-window (selected-window) count t)
(if file
(vim:cmd-edit :argument file)
(let ((buffer (generate-new-buffer "*new*")))
(set-window-buffer (selected-window) buffer)
(with-current-buffer buffer (normal-mode)))))
(vim:defcmd vim:window-balance (nonrepeatable)
"Balances all window sizes."
(balance-windows))
(vim:defcmd vim:window-increase-height (count nonrepeatable)
"Increase current window height by `count'."
(vim:resize-window (+ (window-height) (or count 1))))
(vim:defcmd vim:window-decrease-height (count nonrepeatable)
"Decrease current window height by `count'."
(vim:resize-window (- (window-height) (or count 1))))
(vim:defcmd vim:window-increase-width (count nonrepeatable)
"Increase current window width by `count'."
(vim:resize-window (+ (window-width) (or count 1)) t))
(vim:defcmd vim:window-decrease-width (count nonrepeatable)
"Decrease current window width by `count'."
(vim:resize-window (- (window-width) (or count 1)) t))
(vim:defcmd vim:window-set-height (count nonrepeatable)
"Sets the height of the current window to `count'."
(vim:resize-window (or count (frame-height)) nil))
(vim:defcmd vim:window-set-width (count nonrepeatable)
"Sets the width of the current window to `count'."
(vim:resize-window (or count (frame-width)) t))
(vim:defcmd vim:window-rotate-upwards (nonrepeatable)
"Rotates the windows according to the currenty cyclic ordering."
(let ((wlist (window-list))
(blist (mapcar #'(lambda (w) (window-buffer w))
(window-list))))
(setq blist (append (cdr blist) (list (car blist))))
(while (and wlist blist)
(set-window-buffer (car wlist) (car blist))
(setq wlist (cdr wlist)
blist (cdr blist)))
(select-window (car (last (window-list))))))
(vim:defcmd vim:window-rotate-downwards (nonrepeatable)
"Rotates the windows according to the currenty cyclic ordering."
(let ((wlist (window-list))
(blist (mapcar #'(lambda (w) (window-buffer w))
(window-list))))
(setq blist (append (last blist) blist))
(while (and wlist blist)
(set-window-buffer (car wlist) (car blist))
(setq wlist (cdr wlist)
blist (cdr blist)))
(select-window (cadr (window-list)))))
(vim:defcmd vim:window-move-very-top (nonrepeatable)
"Closes the current window, splits the upper-left one horizontally
and redisplays the current buffer there."
(unless (one-window-p)
(let ((b (current-buffer)))
(delete-window)
(let ((btree (vim:get-buffer-tree (car (window-tree)))))
(vim:window-only)
(let ((newwin (selected-window))
(subwin (split-window)))
(vim:restore-window-tree subwin btree)
(set-window-buffer newwin b)
(select-window newwin))))
(balance-windows)))
(vim:defcmd vim:window-move-far-left (nonrepeatable)
"Closes the current window, splits the upper-left one vertically
and redisplays the current buffer there."
(unless (one-window-p)
(let ((b (current-buffer)))
(delete-window)
(let ((btree (vim:get-buffer-tree (car (window-tree)))))
(vim:window-only)
(let ((newwin (selected-window))
(subwin (split-window-horizontally)))
(vim:restore-window-tree subwin btree)
(set-window-buffer newwin b)
(select-window newwin))))
(balance-windows)))
(vim:defcmd vim:window-move-far-right (nonrepeatable)
"Closes the current window, splits the lower-right one vertically
and redisplays the current buffer there."
(unless (one-window-p)
(let ((b (current-buffer)))
(delete-window)
(let ((btree (vim:get-buffer-tree (car (window-tree)))))
(vim:window-only)
(let ((subwin (selected-window))
(newwin (split-window-horizontally)))
(vim:restore-window-tree subwin btree)
(set-window-buffer newwin b)
(select-window newwin))))
(balance-windows)))
(vim:defcmd vim:window-move-very-bottom (nonrepeatable)
"Closes the current window, splits the lower-right one horizontally
and redisplays the current buffer there."
(unless (one-window-p)
(let ((b (current-buffer)))
(delete-window)
(let ((btree (vim:get-buffer-tree (car (window-tree)))))
(vim:window-only)
(let ((subwin (selected-window))
(newwin (split-window)))
(vim:restore-window-tree subwin btree)
(set-window-buffer newwin b)
(select-window newwin))))
(balance-windows)))
(provide 'vim-window)
;;; vim-window.el ends here

223
.emacs.d/vim-mode/vim.el Normal file
View file

@ -0,0 +1,223 @@
;;; vim.el --- a VIM-emulation for Emacs
;; Copyright (C) 2009, 2010 Frank Fischer
;; Author: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;; Maintainer: Frank Fischer <frank.fischer@mathematik.tu-chemnitz.de>,
;; URL: http://www.emacswiki.org/emacs/VimMode
;; License: GPLv2 or later, as described below under "License"
;; Compatibility: Emacs 22, 23, XEmacs 21.4
;; Version: 0.3.0
;; Keywords: emulation, vim
;; Human-Keywords: vim, emacs
;;
;; This file is not part of GNU Emacs.
;;; Acknowledgements:
;; This package contains code from several other packages:
;;
;; - rect-mark.el
;; - viper
;; - vimpulse.el
;; - windmove.el
;;
;; Special thanks go to the authors of those packages.
;;; Commentary:
;; A simple VIM-mode for Emacs
;;
;; This project is in a VERY early development state and many function
;; have not been implemented yet.
;;
;; If you want to try, open this file in your Emacs and evaluate the buffer.
;; The mode can be activated by 'M-x vim-mode'.
;;
;; Don't forget to disable Viper if you want to try vim-mode.
;;
;; The project is divided into many files. Each file implements some
;; almost-independent feature. If you want to learn how to implement
;; new commands or motions, look at the files vim-commands.el and
;; vim-motions.el.
;;
;; Here is a short description of the contents of each file:
;;
;; - vim.el: This file just sets up the mode and loads the other files.
;;
;; - vim-compat.el: Compatibility layer for different Emacsen.
;;
;; - vim-keymap.el: A few functions for defining keymaps for vim-mode.
;;
;; - vim-vim.el: This file contains the macros for defining motions
;; and commands as well as some utility functions for
;; calling them.
;;
;; - vim-modes.el: Each VIM-mode (normal-mode, insert-mode, ...) corresponds
;; to an Emacs-minor-mode. This file contains some macros and
;; functions to define new vim-modes in this context.
;;
;; - vim-insert-mode.el: The implementation of insert-mode.
;;
;; - vim-normal-mode.el: The implementation of normal-mode.
;;
;; - vim-visual-mode.el: The implementation of visual-mode.
;;
;; - vim-ex-mode.el: The implementation of ex-mode.
;;
;; - vim-commands.el: The implementations of commands like 'delete',
;; 'yank', 'paste' and so on.
;;
;; - vim-motions.el: The implementations of motion commands like 'h',
;; 'i', 'j', 'k', 'f', 'w', ...
;;
;; - vim-scroll.el: The implementation of scrolling commands like
;; 'zz', 'Ctrl-F'.
;;
;; - vim-window-el: The implementation of window commands like 'C-w s'.
;;
;; - vim-ex-commands.el: The implementations of commands like ':edit'
;; or ':buffer'.
;;
;; - vim-search.el: The implementation of '/' and ':substitute'.
;;
;; - vim-undo.el: Some variables and functions for undo/redo.
;;
;; - vim-maps.el: The definition of the basic keymaps. This file
;; connects the keymaps with the commands and motions
;; defined in vim-commands.el and vim-motions.el.
;;
;; TODO:
;;
;; HAVE:
;; - framework for keymaps, motions, commands and command-mappings
;; - insert-mode, normal-mode, visual-mode and ex-mode
;; - simple motions
;; - deletion, yank, paste, change, replace
;; - undo/redo
;; - repeat
;;
;; MISSING:
;; - better Emacs integration (modes, buffer local variables, ...)
;; - text objects
;; - several commands
;; - marks and register
;; - ...
;; - several calls 'looking-back' may be inefficient
;;; Code:
(eval-when-compile
(require 'cl))
(defgroup vim-mode nil
"A VIM emulation mode."
:group 'emulations)
(defcustom vim:default-initial-mode
'normal
"The default initial vim sub-mode."
:type '(symbol :tag "vim-mode start mode")
:group 'vim-mode)
(defcustom vim:initial-modes
'((debugger-mode . window)
(compilation-mode . window)
(grep-mode . window)
(gud-mode . window)
(sldb-mode . window)
(slime-repl-mode . window)
(reftex-select-bib-mode . window)
(completion-list-mode . window)
(help-mode . motion)
(Info-mode . motion))
"Associated list of (major-mode . vim:mode) which specifies the
vim sub-mode in which vim-mode should start when a buffer with the
given major-mode is created."
:type '(repeat (cons (symbol :tag "major mode") (symbol :tag "vim-mode start mode")))
:group 'vim-mode)
(defmacro vim:deflocalvar (name &rest args)
"Defines a buffer-local variable."
(declare (indent defun))
`(progn
(defvar ,name ,@args)
(make-variable-buffer-local ',name)))
(font-lock-add-keywords 'emacs-lisp-mode '("vim:deflocalvar"))
(defvar vim:emulation-mode-alist nil
"List of all keymaps used by some modes.")
(let ((load-path (cons (expand-file-name ".") load-path)))
(eval-when-compile
(load "vim-compat")
(load "vim-keymap")
(load "vim-modes")
(load "vim-vim")
(load "vim-normal-mode")
(load "vim-insert-mode")
(load "vim-visual-mode")
(load "vim-commands")
(load "vim-motions")
(load "vim-scroll")
(load "vim-window")
(load "vim-undo")
(load "vim-ex")
(load "vim-ex-commands")
(load "vim-search")
(load "vim-maps"))
(require 'vim-compat)
(require 'vim-keymap)
(require 'vim-modes)
(require 'vim-vim)
(require 'vim-normal-mode)
(require 'vim-insert-mode)
(require 'vim-visual-mode)
(require 'vim-commands)
(require 'vim-motions)
(require 'vim-scroll)
(require 'vim-window)
(require 'vim-undo)
(require 'vim-ex)
(require 'vim-ex-commands)
(require 'vim-search)
(require 'vim-maps))
(define-minor-mode vim-local-mode
"VIM emulation mode."
:lighter " VIM"
:init-value nil
:global nil
(if vim-local-mode
(progn
(make-local-variable 'vim:emulation-mode-alist)
(vim:initialize-keymaps t))
(progn
(vim:initialize-keymaps nil)
(setq global-mode-string
(delq 'vim:mode-string global-mode-string ))
(vim:activate-mode nil))))
(define-globalized-minor-mode vim-mode vim-local-mode vim:initialize)
(defun vim:initialize ()
(unless (vim:minibuffer-p)
(let ((mode (cdr (or (assoc major-mode vim:initial-modes)
(cons t vim:default-initial-mode)))))
(when mode
(setq vim:active-mode nil)
(vim-local-mode 1)
(vim:intercept-ESC-mode 1)
(vim:activate-mode mode)
(unless (memq 'vim:mode-string global-mode-string)
(setq global-mode-string
(append '("" vim:mode-string) (cdr global-mode-string))))))))
(provide 'vim)
;;; vim.el ends here

7118
.emacs.d/vimpulse.el Normal file

File diff suppressed because it is too large Load diff