diff options
author | (quasar) nebula <qznebula@protonmail.com> | 2024-05-17 09:25:31 -0300 |
---|---|---|
committer | (quasar) nebula <qznebula@protonmail.com> | 2024-05-17 09:25:31 -0300 |
commit | d0487877d453d31a63709f84678566a7f27f7db7 (patch) | |
tree | e7a364a59101ec4b6d15f29f465ec68695c0583a /.vim/pack/editing/start/vimacs | |
parent | ddad5db88aaa0e6fbf3f1bbb43bc549270f50598 (diff) |
The Vimacs plugin (form vim-scripts) includes a "tab-indent" file which we don't want the behavior of. It's convenient enough to just drop the file, but we have to manually include the files we *do* want instead of using a submodule.
Diffstat (limited to '.vim/pack/editing/start/vimacs')
-rw-r--r-- | .vim/pack/editing/start/vimacs/doc/vimacs.txt | 1366 | ||||
-rw-r--r-- | .vim/pack/editing/start/vimacs/plugin/vimacs-0.93.vim | 931 |
2 files changed, 2297 insertions, 0 deletions
diff --git a/.vim/pack/editing/start/vimacs/doc/vimacs.txt b/.vim/pack/editing/start/vimacs/doc/vimacs.txt new file mode 100644 index 0000000..969e456 --- /dev/null +++ b/.vim/pack/editing/start/vimacs/doc/vimacs.txt @@ -0,0 +1,1366 @@ +*vimacs.txt* Vimacs: Emacs mappings (emulation) for Vim + +|Vimacs.01| Introduction +|Vimacs.02| Installing Vimacs +|Vimacs.03| Vimacs Options +|Vimacs.04| Changes for Emacs users +|Vimacs.05| Changes for Vim users +|Vimacs.06| Key Map +|Vimacs.07| Design Comments +|Vimacs.08| Known Problems +|Vimacs.09| Revision History (ChangeLog) +|Vimacs.10| In the Future ... (TODO list) +|Vimacs.11| Contact, Help, Credits + + +============================================================================== +*Vimacs.01* Introduction + + *vimacs* + + *vimacs-introduction* + +Vimacs (Vim-Improved eMACS) brings Emacs' extensive key bindings and modeless +editing features to the Vim world, while completely retaining Vim's +powerful moded editing style. + +Vimacs is based on the keymaps of GNU Emacs 21 and XEmacs, so if you are +familiar with them, you'll feel right at home in Vimacs. For Emacs users, +most (if not all) of the common key maps in Emacs are present in Vimacs, such +as <C-Space>, <C-w> and <C-y> to mark, kill and yank regions, <C-x><C-f> to +find a file, and <C-x>2 to vertically split a window. However, you can now +take advantage of the incredible power of Vim's Normal and Command modes with +a touch of the <Esc> key. + +Why use Vimacs instead of Emacs? Vim's configuration and option tweaking is +arguably much easier than doing the same task in the Emacs world; its +scripting language is simpler and more conventional than LISP, and still very +powerful. Python, Perl, and |libcall()| (C library interface) support allow +for incredibly powerful scripting if you need something which is the equal of +ELISP. Vim is heavily optimised for speed and text editing; you may find Vim +to be much quicker in many tasks. While Emacs and Vim may run on equally as +many platforms, Vim often has superior support for non-Unix operating systems +in comparison to Emacs; e.g. Vim for Win32 can natively function as a DDE +server and can integrate into Microsoft Visual Studio. + +If you're a long-time Vim user, you retain vi's powerful moded editing +paradigm while gaining all the benefits of Emacs' modeless editing. After a +while, the <C-a> and <C-e> keys will become second nature to you, just as +you're used to the |h|, |j|, |k|, and |l| keys for movement. Some of the keys +familiar to you in Insert mode have been changed, but you won't take long to +get used to Emacs' keys: just like Vim, Emacs' key layout has been designed so +that commonly used keys are quick to access. Emacs' initially strange key +layout will reward you later on for its efficiency, just like Vim does. Emacs +experts are just as fast as Vim experts in manipulating text, and as a bonus, +you start becoming familiar with Emacs keybindings, which are gradually +becoming more pervasive in Unix applications. (Even MacOS X supports some +Emacs keys in its dialog boxes!) + + *vimacs-terminology* + +Vim and Emacs use different (and sometimes conflicting) terminology. Since +Vimacs runs within the Vim environment, we will use the Vim terminology rather +than Emacs terminology. + + Emacs Terminology Vim Terminology + + (key)binding map + point cursor + kill yank + yank paste + register mark + rectangle block + kill-ring registers + +It is Vim standard that key bindings are written in |<>| notation; thankfully +this is essentially the same as Emacs' key binding notation. In Emacs, the +key combination Control-x followed by Control-f is written as "C-x C-f"; in +Vim, this is written as "<C-x><C-f>". Meta-f in Emacs is written as "M-f"; in +Vim, this is written as "<M-f>" or "<A-f>". (The 'A' stands for Alt; in Vim, +there is no distinction between the Meta and Alt keys.) Vim helpfiles also +use a |CTRL-X_CTRL-F|-style notation; Vimacs-specific keys will use a +|vimacs:CTRL-X_CTRL-F| notation. + +For the gory details of Vim notation, see |notation|. + + *vimacs-help-navigation* + +Emacs users: If you are not in insert mode (if you do not see a line at the +bottom of the screen saying "-- INSERT MODE --"), use <C-]> to follow a link, +and <C-t> to go back a link. If you are using Vimacs keybindings and are in +Insert mode, you can follow a help link such as |vimacs-introduction| by +moving your cursor over it and pressing <M-.>. This is the same as Emacs' +typical <M-.> keybinding, which is the |vimacs:find-tags| command. Jump back +to your previous position using the <M-*> key. + +Vim users: Pressing <M-.> in Insert mode performs the same function as +|CTRL-]| in Normal mode. <M-*> is equivalent to |CTRL-T|. + + +============================================================================== +*Vimacs.02* Installing Vimacs + + *vimacs-quickstart* + +The following quick start guides are for Win32 and Unix systems. Detailed +installation instructions follow afterward. + + *vimacs-win32-quickstart* + +Firstly, you'll need Vim 6 installed. Vimacs won't work on older +versions. + +To install Vimacs, copy the .txt file in the archive to your Vim +documentation directory (typically "C:\Program Files\vim\vimfiles\doc"), +and copy the .vim file to your plugin directory (typically "C:\Program +Files\vim\vimfiles\plugin"). + +See the |vimacs-installation| topic in the main Vimacs help file for full +information. + + *vimacs-unix-quickstart* + +Firstly, you'll need Vim 6 installed. Vimacs won't work on older +versions. So, make sure you're running Vim 6: +> + vim --version | head -1 +< +The reply you get should say "VIM - Vi IMproved 6.0" (or higher). + +To install Vimacs, execute the following commands in your shell: +> + mkdir -p $HOME/.vim/doc + mkdir -p $HOME/.vim/plugin + cp -R doc plugin $HOME/.vim +< +Run the following command in a shell to make Vim rescan your documentation +directory: +> + vim --cmd "helptags $HOME/.vim/doc" --cmd "q" +< +That's it. If you're a Vim user, Emacs key mappings will now be enabled +whenever you're in Vim's Insert mode. If you're an Emacs user and have +never used Vim before, you probably want to always keep Vim in Insert +Mode, and use Select mode rather than Visual mode: +> + echo 'set insertmode' >> $HOME/.vimrc + echo 'set selectmode += cmd' >> $HOME/.vimrc +< +Vimacs is now completely installed. However ... + +If you want to have a more sophisticated setup, where you can type a +different command (such as 'vimacs') to always start in Insert mode, but +typing 'vim' starts Vim in Normal mode, read on. + +Put the shell script located at plugin/vimacs/vim somewhere in your $PATH, +and symlink it to the appropriate files. Change the $myscriptdir variable +below to whatever directory you use for scripts; if you don't currently +have one, you'll need to mkdir the directory and add it to your $PATH. +(Consult your local Unix expert on adding directories to your $PATH if you +don't know how to do this.) +> + myscriptdir=$HOME/bin + mkdir -p $myscriptdir + cp plugin/vimacs/vim $myscriptdir + chmod 755 $myscriptdir/vim + ln -s $myscriptdir/vim $myscriptdir/gvim + ln -s $myscriptdir/vim $myscriptdir/vm + ln -s $myscriptdir/vim $myscriptdir/gvm + ln -s $myscriptdir/vim $myscriptdir/vimacs + ln -s $myscriptdir/vim $myscriptdir/gvimacs + myscriptdir= +< +For more detailed installation instructions, see |vimacs-installation| in +the Vimacs help file. + + *vimacs-installation* + +Vimacs is designed for Vim 6 only; if you are running Vim 5.x, please upgrade +to Vim 6. There is no intention to `port' Vimacs to run on older versions of +Vim. + +Vimacs is a Vim 6 plugin; simply drop it into any Vim plugin directory, such +as "$HOME/.vim/plugin" on a Unix system, or "C:\Program +Files\vim\vimfiles\plugin" on Windows. You may also want to place this +documentation (the "vimacs.txt" file) in a Vim documentation directory; e.g. +"$HOME/.vim/doc", or "C:\Program Files\vim\vimfiles\doc". You should run the +|:helptags| command on the documentation directory after installation; see +|add-local-help| for more information. + +Vimacs does not initially start in Insert mode, to be consistent with what Vim +users normally expect. If you an Emacs user, you may wish to put +> + set insertmode + set selectmode += cmd +< +in your |.vimrc| startup file, so that you use a more Emacs-like selection +mode, as well as being in Insert mode straight away. + +Please read the |vimacs-unix| section if you are running Vimacs on a Unix +systems, and |vimacs-non-unix| if you are installing Vimacs on other operating +systems (e.g. Windows, Macintosh). + + *vimacs-unix* + *vimacs-unix-flow-control* + +Like Emacs, Vimacs uses the <C-s> key to search, and <C-q> to insert the next +character literally ('quoted-insert' in Emacs-speak; normally <C-v> in Vim). + +In many Unix terminals, <C-s> and <C-q> are flow control characters used to +stop and start terminal output, which means that Vim will look like it has +frozen when you press <C-s>. (This problem only affects the Unix console +version of Vim; gvim is not affected.) Emacs modifies your terminal's +settings, so it doesn't normally have this problem. Vim, however, does not +modify terminal settings, and thus you need to explicitly turn off flow +control. + +To solve the <C-s>/<C-q> flow control problem, you need to turn off XON/XOFF +flow control processing for your tty. The stty(1) command will do this: +> + $ stty -ixon -ixoff +< +You may wish to make a shell script somewhere in your path to do this +automatically, e.g. +> + $ cat << END > $HOME/bin/vim + #!/bin/sh + + # turn off flow control if we're a terminal + [ -t 0 ] && stty -ixon -ixoff + + exec /usr/bin/vim "$@" + END +< +For a more in-depth example of using a wrapper shell script to initialise Vim +(and Vimacs) to your choosing, see |vimacs-unix-progname| + + *vimacs-unix-meta-sends-esc* + +This applies to the console version of Vim only (i.e. not gvim). On many Unix +terminals, the Meta key typically generates an <Esc> followed by the +combination key; for example, pressing <M-x> generates the key sequences +<Esc>x. However, you may have a terminal emulator that sends <M-x> as an 'x' +with the 8th bit set, rather than as <Esc>x. Most Unix terminal emulators, +(including xterm) have an option to do this, but do not enable it by default. +If your terminal sends <M-x> as x with the 8th bit set, set the +|'g:VM_UnixConsoleRemapEsc'| option to 1. + +NOTE: This is not a Vimacs-specific problem; Vim also has to work around this +issue, with options like 'esckeys', 'timeout' and 'ttimeout'. + + *vimacs-unix-progname* + +Via the magic of shell scripts (and symlinks), it's possible to change the +default behaviour of Vimacs, depending on what you typed to run it. For +example: + + Command name Load Vimacs? Start in/use Insert mode? + + (g)vim yes no/no + (g)vimacs yes yes/yes + (g)vm[1] yes yes/yes + + 1. `vm' is an abbreviation for `ViMacs' + +To do the above, firstly, make a directory to store programs and scripts in, +and add that directory to your $PATH: +> + $ mkdir $HOME/bin + $ export PATH="$HOME/bin:$PATH" +< +Save the following shell script in the above directory as "vim". For +convenience, this script is also available in the plugin/vimacs directory; +simply copy it to $HOME/bin/vim. +> + #!/bin/sh + + # real path to vim + VIM_CMD=${VIM_CMD:-/usr/bin/vim} + GVIM_CMD=${GVIM_CMD:-/usr/bin/gvim} + + # what program name was i run as? + argv0=`basename $0` + + # turn off software flow control so <C-s> and <C-q> will work. you can add + # extra stty settings by setting $VIM_STTY (i use 'erase ^?' here) + [ -t 0 ] && stty -ixon -ixoff $VIM_STTY + + case "$argv0" in + g*) + VIM_CMD="$GVIM_CMD" + ;; + esac + + case "$argv0" in + *diff) + VIM_CMD="${VIM_CMD}diff" + ;; + esac + + case "$argv0" in + # This case has to come before *vim*, since *vim* will match *vimacs* + *vm*|*vimacs*) + exec $VIM_CMD --cmd "let g:VM_Enabled = 1" \ + --cmd "set insertmode" \ + "$@" + ;; + *vim*) + exec $VIM_CMD --cmd "let g:VM_Enabled = 1" \ + "$@" + ;; + esac + +< +Now, make your vim command executable: +> + chmod a+x $HOME/bin/vim +< +Finally, make symlinks from the `vim' shell script to the other commands +you'll be running it as: +> + ln -s $HOME/bin/vim $HOME/bin/gvim + ln -s $HOME/bin/vim $HOME/bin/vm + ln -s $HOME/bin/vim $HOME/bin/gvm + ln -s $HOME/bin/vim $HOME/bin/vimacs + ln -s $HOME/bin/vim $HOME/bin/gvimacs + ln -s $HOME/bin/vim $HOME/bin/vimdiff + ln -s $HOME/bin/vim $HOME/bin/gvimdiff + ln -s $HOME/bin/vim $HOME/bin/vmdiff + ln -s $HOME/bin/vim $HOME/bin/gvmdiff + ln -s $HOME/bin/vim $HOME/bin/vimacsdiff + ln -s $HOME/bin/vim $HOME/bin/gvimacsdiff +< +Now, after all that hard work, you can give Vim different personalities +just by running a different command name! + + *vimacs-non-unix* + +There are no special notes for running Vimacs on non-Unix operating systems. + + +============================================================================== +*Vimacs.03* Vimacs Options + + *vimacs-options* + +Vimacs can change its behaviour to your liking by setting variables in your +Vim startup file ("$HOME/.vimrc" in Unix; "C:\Program Files\vim\_vimrc" in +Windows; see |.vimrc| for more information). You can set variables using +|:let| command, e.g. + +> + let g:VM_CmdHeightAdj = 0 + let g:VM_NormalMetaXRemap = 1 +< + + *vimacs-option-list* + + *'g:VM_CmdHeightAdj'* + +'g:VM_CmdHeightAdj' number (default 1) + + Adjust the current 'cmdheight' setting. Vimacs will normally increase + the 'cmdheight' option to 2 if it's less than 2 and the 'showmode' + option is set, because the mode message will often obscure the most + recent message. + + *'g:VM_Dev'* + +'g:VM_Dev' number (default 0) + + Turn on "developer mode"; forces overwriting of commands, functions + and maps which already exist when Vimacs is loaded. Vimacs will not + typically load its own commands, functions or mappings if one + currently exist. + + *'g:VM_Enabled'* + +'g:VM_Enabled' number (default 1) + + Don't load Vimacs at all. May be useful in your startup script, e.g. + for Unix people who use the "less" Vim script: +> + if v:progname == "less" + source /usr/share/doc/vim/macros/less.vim + let g:VM_Enabled = 0 + endif +< + *'g:VM_F10Menu'* + +'g:VM_F10Menu' number (default 1) + + Enable the <F10> key to pull down the menus which are normally only + available in the GUI version of Vim. (GNU Emacs uses F10 for this + purpose.) + + *'g:VM_NormalMetaXRemap'* + +'g:VM_NormalMetaXRemap' number (default 1) + + In Normal mode, map the <M-x> key to go to Command mode (i.e. it has + the same effect as typing |:|). + + NOTE: <M-x> is always enabled in Insert mode; this option affects + <M-x> in Normal mode only. + + *'g:VM_SearchRepeatHighlight'* + +'g:VM_SearchRepeatHighlight' number (default 0) + + Highlight all occurances of your current search on the screen when you + repeat a search with <C-s> or <C-r>. This effectively turns on the + 'hls' option while you're searching. + + *'g:VM_SingleEscToNormal'* + +'g:VM_SingleEscToNormal' number (default 1) + + Only need to press the <Esc> once in Insert mode to return to Normal + mode. If this option is off, you need to press <Esc><Esc> to return + to Normal mode; see |vimacs-unix-esc-key| for rationale. + + *'g:VM_UnixConsoleMetaSendsEsc'* + +'g:VM_UnixConsoleMetaSendsEsc' number (default 1) + + Remap <Esc>x to become <M-x> (where x is any keypress); this is needed + for Unix terminals which send a Meta key as an Escape sequence, rather + than sending the keypress with the 8th bit on. Most Unix terminals + seem to do that these days. + + *vimacs-vim-options* + +Vimacs's operation is heavily influenced by a few of Vim's options. You can +set them in the usual manner (with the |:set| command). + + *'vimacs-backspace'* +'backspace' 'bs' string (default "") + global + {not in Vi} + + Vimacs will automatically set this option, since pressing <BS> in + Emacs typically backspaces over anything and everything :). + + *'vimacs-cedit'* +'cedit' string (Vi default: "", Vim default: CTRL-F) + global + {not in Vi} + {not available when compiled without the |+vertsplit| + feature} + + Currently, Vimacs relies on the 'cedit' option to be CTRL-F. This is + regarded as a bug, and will hopefully be fixed in the future. + + *'vimacs-esckeys'* +'esckeys' 'ek' boolean (Vim default: on, Vi default: off) + global + {not in Vi} + + Vimacs automatically sets this option. (Note that strictly speaking, + this may not be necessary ... please send me a patch if you can't live + with this behaviour). + + *'vimacs-hidden'* +'hidden' 'hid' boolean (default off) + global + {not in Vi} + + Vimacs will automatically set this option; Emacs always "hidden + buffers". + + *'vimacs-incsearch'* +'incsearch' 'is' boolean (default off) + global + {not in Vi} + {not available when compiled without the + |+extra_search| feature} + + CTRL-S (incremental search forward) and CTRL-R (incremental search + backward) will override Vim's 'incsearch' option; they will always do + an incremental search. + + *'vimacs-insertmode'* + +'insertmode' 'im' boolean (default off) + global + {not in Vi} + + Setting the 'insertmode' option makes Insert mode the default mode, + and effectively makes Vim modeless. This is important for Vimacs + since it allows for a much more complete emulation of Emacs. (See + Vim's 'insertmode' help entry for more detail.) + + When 'insertmode' is set and Vimacs is active, the CTRL-O and CTRL-L + keys change to the Emacs behaviour, and <Esc> still escapes back to + normal mode. + + See also: the |'g:VM_SingleEscToNormal'| option and + |vimacs-unix-esc-key|. + + *'vimacs-keymodel'* +'keymodel' 'km' string (default "") + global + {not in Vi} + + Vimacs will automatically manipulate this option to ensure that + marking blocks using <C-Space> (and the <Shift> key, if the "key" word + is included in 'selectmode') works as intended. + + *'vimacs-selection'* +'selection' 'sel' string (default "inclusive") + global + {not in Vi} + + Vimacs will change the default value of this option to "exclusive", + since it's very much more Emacs-like in its behaviour. + + *'vimacs-selectmode'* +'selectmode' 'slm' string (default "") + global + {not in Vi} + + If the "cmd" word is in the 'selectmode' option, Vimacs will use + Select mode when marking a block using <C-Space>. + + *'vimacs-timeout'* +'timeout' 'to' boolean (default on) + global + *'vimacs-ttimeout'* +'ttimeout' boolean (default off) + global + {not in Vi} + + Vimacs will automatically set these options for optimal behaviour, + depending on whether the 'insertmode' and |'g:VM_SingleEscToNormal'| + options are set, and whether you're running in a UNIX console or not. + + This is done for safety reasons; it's quite easy to screw up Vim if + use <Meta> key mappings extensively and you're running in a UNIX + console. + + *'vimacs-whichwrap'* +'whichwrap' 'ww' string (Vim default: "b,s", Vi default: "") + global + {not in Vi} + + Vimacs will automatically manipulate this option to obtain Emacs-like + behaviour. (If you're that pedantic about this option, why on earth + are you using Vimacs in the first place? Send me a patch, send me + a patch ...) + + *'vimacs-wildcharm'* +'wildcharm' 'wcm' number (default: none (0)) + global + {not in Vi} + + Vimacs automatically manipulates this option. If you don't like that, + send me a patch! + + *'vimacs-winaltkeys'* +'winaltkeys' 'wak' string (default "menu") + global + {not in Vi} + {only used in Win32, Motif, GTK and Photon GUI} + + Vimacs will automatically unset this option, since it interferes with + remapping the <Alt>/<Meta> keys. + + +============================================================================== +*Vimacs.04* Changes for Emacs users + +Nothing written yet. Send patches or hate mail to the |vimacs-author| :). + + +============================================================================== +*Vimacs.05* Changes for Vim users + +Nothing written yet. Send patches or hate mail to the |vimacs-author| :). + + +============================================================================== +*Vimacs.06* Key Map + +Emacs has many keys, and this section of the documentation is currently +incomplete. If you want to help complete this section, please send me +patches! + +Other than looking at the vimacs.vim script file itself, a suggested way of +learning the Emacs key set is from Emacs itself (and Emacs clones such as jed +and jmacs). Press <C-h>b in GNU Emacs or XEmacs to get a list of key +bindings. + +Files and Buffers + *vimacs:CTRL-X_CTRL-F* + +CTRL-X CTRL-F Loads a new file into the current window; see |:edit|. + + *vimacs:CTRL-X_CTRL-S* + +CTRL-X CTRL-S Saves the current buffer to disk, but only if's been + modified. See |:update|. + + *vimacs:CTRL-X_s* + +CTRL-X s Saves all changes buffers to disk; see |:wa|. + + *vimacs:CTRL-X_i* + +CTRL-X i Inserts a file into the current buffer. See |:read|. + + *vimacs:CTRL-X_CTRL-W* + +CTRL-X CTRL-W Saves the current buffer to disk as a different filename. + See |:write_f|. + + +Error Recovery + *vimacs:CTRL-_* + *vimacs:CTRL-X_CTRL_U* + +CTRL-_ +CTRL-X CTRL-U Undo your last action. + + +============================================================================== +*Vimacs.07* Design Comments + +This is a collection of anecdotes, design issues and ramblings that I came +across with when writing Vimacs. Vi was certainly never designed to be used +in a modeless way, and Vimacs pushes Vim's modeless functionality to its +limits, so I expected to encounter some bugs^H^H^H^Hundocumented features in +writing Vimacs. Somewhat surprisingly, there seems to be only a few small +problems in Vim which limit Vimacs' Emacs emulation capabilities, and these +tend to be philosophical or conceptual differences between the two editors +rather than being actual bugs. (Quite amazing, considering that the two +editors, at first glance, seem so completely different.) + + *vim-emacs-similarity* + +Many Emacs features actually have a direct 1:1 mapping to Vim commands; for +example, Emacs' |vimacs:META-A| command is exactly the same as Vim's Command +mode |(| command. Thus, many of the Vimacs commands were very simple to +imlpement. + + *cursor-at-eol* + +One of the bigger complications that arose in Vimacs is that the cursor +position is conceptually different between Vim's various modes. In Insert +mode, Vim's cursor is treated as being _between_ two characters, not "on" a +character. + +In Normal mode, the cursor is treated as being "on" a character, and not +between the characters. (If you use gvim, you can see that the cursor is a +normal block shape in Command mode, but the shape changes to a thin vertical +line in Insert Mode.) This means that switching from Insert mode to Normal +mode can cause problems if you're at the end of a line. The cursor seems to +'jump back' a character, because the cursor is _after_ the last character in +Insert mode, and when you revert to Normal mode, the cursor cannot be past the +end of the line, so it goes to the last character on the line. Going back to +Insert Mode from there therefore puts your cursor one character back from the +end of the line, rather than being at the end of the line. + +You can use the |a| command instead of the |i| to solve this problem, but then +you lose precision at the beginning of the line, rather than at the end. It's +not a particularly easy problem to solve; I hope that Bram Moolenar provides +an option to change this behaviour in the future. + + *remapping-CTRL_O* + +In Emacs, the <C-o> key is mapped to `open-line'; in Vim, <C-o> executes one +command in Normal mode, and then returns to Insert mode (see |i_CTRL-O|). +This poses a problem: internally, Vim uses <C-o> for many commands, and +remapping it to `open-line' causes problems. Commands such as |:amenu| use +<C-o> to return to Normal mode from Insert mode, and thus remapping <C-o> can +lead to interesting problems. + +There will be an option in the future to prevent <C-o> from being remapped at +all; of course, this means that you can't remap the <C-o> to a function at +all, which isn't ideal. + +The `proper' way to fix this would be for Vim to limit the <C-o> mapping to +Insert mode only, and fix the other commands (such as |:amenu|) so that they +always use the unmapped version of <C-o>. + + *vimacs-quotes* + +Conrad Parker: "Dude, I gotta get you doing some serious hacking +projects" + +Erik de Castro Lopo: "Oh, so you're the insane guy that K was talking +about" + +Wichert Akkerman: "Gross. Horror. Vim abuse. Mind if I include this as +an example in the Debian vim packages? :)" + +(add yours here if you like :) + + +============================================================================== +*Vimacs.08* Known Problems + + *vimacs-and-lazyredraw* + +Vim seems to be a bit buggy and occasionally doesn't redraw the screen +properly when it should, if you have the 'lazyredraw' option set. Please turn +it off if you notice redraw glitches. + +This is a problem in Vim, not Vimacs, but Vimacs seems to exarcerbate the +problem. + + *vimacs-meta-d-at-eol* + +Pressing <M-d> at the end of the line (EOL) doesn't delete the word. + + *vimacs-unix-esc-key* + +On Unix console systems (i.e. not gvim), you may get a warning when you press +<Esc> twice telling you to use the <F1> or <C-z> keys to return to Normal +mode. i.e. You can't do a simple <Esc> press to return to Normal mode, as you +normally do in Vi(m). In a nutshell, this is because of Vim's 'insertmode' +option. + +When 'insertmode' is turned on, Vim normally remaps the <Esc> key so that +novice users don't find themselves in Vim's Normal mode if they accidently hit +<Esc>. Remember that 'insertmode' is originally designed for |evim|, which is +a point-and-click editor in the style of Windows Notepad. You don't want +users winding up in Normal mode if they want something as simple as Notepad! + +Due to the way that Unix terminals were originally designed, if: + + 1. you are running Vimacs in a Unix console, + 2. have |g:VM_UseInsertMode| (and the 'insertmode' option) set + 3. have |g:VM_UnixConsoleRemapEsc| set + 4. have |g:VM_SingleEscToNormal| set + +when Vim receives an <Esc> key, it is completely impossible to determine +whether it is part of a Meta key mapping (such as <M-f>) or the single <Esc> +key press that you did to get out of Insert mode. The simple solution to this +is: either get used to the <F1> or <C-z> keys to get back to Insert mode, or +change one of the above g:VM_ settings. There's no way around it, sorry; this +is a limitation in the way that Vim and Unix consoles were designed. + +Another way to solve the problem is to always make the user press <Esc> twice +to get back to Normal mode. Vim will interpret an <Esc><Esc> in an +unambigious way, and therefore you will never have this problem. To do this, +turn off the |'g:VM_SingleEscToNormal'| option. The obvious problem with this +solution is that you need to change your habits, so that you must press +<Esc><Esc> to return to Normal mode, rather than a simple <Esc>. + +Deep Vim and Unix hackers may be interested to hear why this happens. Vim can +normally tell whether the <Esc> key is part of a Meta key sequence (such as +<Esc>f), by using its multitude of |:timeout|-related options. However, if +|:insertmode| is set (which it is if |g:VM_UseInsertMode| is set), Vim changes +the <Esc> key so that it no longer brings you out of Insert mode. To get +around this, we remap the <Esc> ourselves so that it does bring you out of +Insert mode. We can do this in an environment which has a completely +unambigious <Esc> key; i.e. an <Esc> is always an <Esc>. However, in the Unix +console, since many (most?) terminals send a <M-x> combo as <Esc>x, we must +change Vim's terminal settings to interpret a <Esc>x as <M-x>. However, now +there's no way for Vim to tell whether the first <Esc> is a single <Esc> by +itself, or part of a larger sequence like <Esc>x, because we have both the +<Esc> key remapped to <C-l> and the <Esc> key being part of a larger key +sequence. This unfortunate design flaw is therefore a limitation of both Vim +(because it changes the normal behaviour of <Esc>) and the Unix console +(because whoever designed the original terminals decided to put the real <Esc> +key on the keyboard, which should never have happened). Any suggestions to +fix this annoying situation would save me a lot of pain :). + + *vimacs-'cedit'* + +See the |'vimacs-cedit'| topic in the option summary for details. + + + +============================================================================== +*Vimacs.09* Revision History (ChangeLog) + + *vimacs-changelog* + + *vimacs-0.93* + +Made the thankyou (credits) list look a bit nicer :). + + *vimacs-0.92* + +<M-n> and <M-p> now cycle through the QuickFix list rather than perform the +next/previous search + +<M-d> at EOL now deletes the word at the start of the next line, +instead of the last character at the end of the current line + +<M-BS> on command line now deletes the word before the cursor + +<M-w> on command line copies the selection (to register) + +<C-y> on command line pastes the selection + +Indenting on <Tab> key moved to a tab-indent.vim + + *vimacs-0.91* + +Moved vi check to be much earlier in the script + +Rewrote <C-k>: it's (much) simpler now + +Updated Unix installation notes + +<C-Space> at EOL will now include the last character on the line + +Use Vim's 'keymodel' option instead of own g:VM_VisualMode variable + +Use Vim's 'selectmode' option instead of own g:VM_ShiftSel variable + + *vimacs-0.9* + +Added Piet Delport to THANKS section + +Wrote a function to initialise a variable to a default value, with Piet's help + +Added Barrie Stott to THANKS section + +Added navigation keys such as <M-f> to Operator Pending mode (actually done in +0.2, but I forgot to add it to the ChangeLog. Oops.) + +Automatically pop up list of buffers for <C-x>b + +Added <S-PageUp>, <S-PageDown>, <S-Home>, <S-End> to select region (for +g:VM_ShiftSel) + +Added commandline abbreviations for query_replace + +Added <M-x> to normal mode (yeah, I kept hitting <M-x> instead of just typing +a colon (':'); sad, innit? + +<C-M-s> is now remapped in Insert mode instead of Normal mode + +<M-%> (query-replace) and <C-M-%> (query-replace-regexp) now escape / +characters, so the s/// doesn't get messed up + +Remapped <Esc><Space> to <M-Space> (for UNIX terminals) + +<M-q> (fill-paragraph) now leaves cursor at fill point, thanks to the +very useful Mark() function stolen from foo.vim by Benji Fisher. + +Added <M-0> ... <M-9> bindings for quick escape into Normal mode + +Added <M-`> (that's Meta and a backtick) to return to Normal mode + +Added <F10> to pulldown the menus (in the GUI system), ala GNU Emacs + +Added VM_Enabled variable to allow users to not load Vimacs + +Properly fixed mapping of <Esc>x keys to <M-x> keys, using the :set +command rather than :map + +Added <C-x>r when in Visual mode to switch to Visual Block mode; this is +meant to (poorly) emulate Emacs' rectangle support. It'll almost +definitely be changed at a later date, because this isn't similar to how +Emacs works at all + +Changed <Silent> mappings to <silent> (see :help <silent>; it doesn't +mention that it's case-sensitive!) + +Made <C-s> and <C-r> search forward/backward from within a search prompt + +Added Hari Krishna Dara & Arun Easi to THANKS section + +Made <C-Space> be more Emacs-like by making Vim go into Select mode rather +than Visual mode. (This is now the default; set g:VM_VisualMode to 1 to +change it back to the old behaviour where <C-Space> triggers Visual mode.) + +Added g:VM_SearchRepeatHighlight option, which highlights the current item +you're searching for if you press <C-s> or <C-r> to search again + +Default for g:VM_AlwaysRemapEsc changed from 0 to 1, to maintain interface +consistency throughout all of vim's console/GUI versions + +Initial formal documentation (vimacs.txt: check it out!) + +Fixed <C-x><C-o> to leave one line + +Added <C-x><C-q> (toggle-readonly) + +Added <C-x><C-r> (find-file-read-only) + +Added <C-x><C-u> (upcase-region) + +<C-z> in Insert mode now jumps back to Command mode; to suspend Vimacs +from Insert mode, press <C-z> twice. Note that you'll be in Normal mode +when you resume + +Fixed <M-Space> highlighting one less character than the current word + +Changed all functions to have be internal to the script (i.e. use <SID> +mappings) + +Implemented primitive yank-pop (<M-y>) support, but hey, it does work ... + +Added Charles E. Campbell to THANKS section + +<C-l> now actually redraws as well as recentering cursor + +<C-Up> and <C-Down> move by paragraphs + +<C-M-v> scrolls other window down. + +Integration with Jeff Lanzarotta's BufExplorer plugin for <C-x>b. Vimacs will +launch BufExplorer when you press <C-x>b if you have it. BufExplorer will use +a default sort order of MRU, since this how it works in Emacs. You will need +BufExplorer 6.0.16 for this to work properly, otherwise ':insertmode' will +screw things up ... + +Added <C-M-/>, <C-M-x> and <C-]>: All map to Vim's |insert_expand| command + +Added <C-k> to |Cmdline-mode| + +<C-^> inserts the character above the cursor (|i_CTRL-Y|) + + +============================================================================== +*Vimacs.10* In the Future ... (TODO list) + + *vimacs-todo* + +Replace "set <M-x>=^[x" with a loop; ASCII range 7 to 127 + +Implement haskell-mode and <C-c><C-l> with vimsh for Manuel :) + +BufExplorer used for bdelete etc. commands? + +Don't overwrite maps. Err. Will be hard ... + +GotoLine should accept a range or argument + +Autoconfiscate ... is that overkill?! + +Make <C-x>b silent (for :BufExplorer?) + +C-x n p + +Emacs-like status line? + +"Mark stack" ala <C-Space> in Emacs, and <C-u><C-Space> to jump to last +marks + +Add Mac notes to documentation. + +Jed keys: <C-j> = newline but no indent, <C-x><C-l> = ?, <C-x><C-o> = +leave one line, <C-x><C-v> = find-alternate-file, + +Emacs folding keys + +Fix <C-M-s> and <C-s> to turn on regexps + +Bind <S-Del>, <C-Ins> and <S-Ins>? + +Follow mode (http://www.csd.uu.se/~andersl/follow.shtml). Maybe as a +separate script; e.g. vimacs-follow.vim + +Argument (M-1/M-2/etc) and universal argument keys. Ahahaha, good +luck to me ... (hmm, v:count1 looks promising!) + +mapcheck() everything -- oooh boy + +Port the rest of XEmacs' 419830213 bindings + +Zippy, Doctor, kitchen sink + + +============================================================================== +*Vimacs.11* Contact, Help, Credits + + *vimacs-author* + +The author of Vimacs is Andre Pang <ozone@vimacs.cx>. + + *vimacs-webpage* + +The official Vimacs webpage is at http://www.vimacs.cx/. It is also regularly +uplaoded to the Vim Online website, at http://vim.sourceforge.net/. + + *vimacs-thanks* + +Many people have inspired me to work on Vimacs. (This is actually a good +thing. Really ...) The following are a brief list of people who have been +particularly helpful: + + Manuel Chakravarty ~ + For introducing me to Emacs, otherwise I'd never be writing an + alternative for it ;) + + Piet Delport ~ + Vim scripting help + + Benji Fisher ~ + Vim scripting help, and the wonderful foo.vim script + + Barrie Stott ~ + Testing and feedback on early releases + + Hari Krishna Dara, Arun Easi ~ + Inspiration on how to map <C-s> and <C-r> to repeat your current search + + Charles E. Campbell ~ + Writing a document on how to write Vim plugins, convincing me use <SID>s + and <Plug>s for Vimacs's internal functions, Vim scripting help + + The Vim, GNU Emacs, and XEmacs teams ~ + For absolutely amazing text editors! + + *vimacs-suggestions* + +Please, please ask for key mappings which you consider to be fundamental +in Emacs! This is a serious project, it's not another Vigor :). I'm not +a veteran Emacs user by any means, so there are potentially scores of +keys which many consider to be fundamental which I am missing. Send me +a request (or even better, a patch!) if you feel like a favourite key +binding is missing, or if behaviour is incorrect. + + *vimacs-gpl2* + + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + <one line to give the program's name and a brief idea of what it does.> + Copyright (C) <year> <name of author> + + 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, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + <signature of Ty Coon>, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. + + +============================================================================== + vim:tw=78:sts=0:ts=8:fo=tcq2:isk=!-~,^*,^\|,^\":ts=8:ft=help:norl: + diff --git a/.vim/pack/editing/start/vimacs/plugin/vimacs-0.93.vim b/.vim/pack/editing/start/vimacs/plugin/vimacs-0.93.vim new file mode 100644 index 0000000..aa07fd8 --- /dev/null +++ b/.vim/pack/editing/start/vimacs/plugin/vimacs-0.93.vim @@ -0,0 +1,931 @@ +""" +"" Vimacs (0.93) +" +" Vim-Improved eMACS +" +" (Oh dear, what have I got myself into?) +" + +" +" Copyright (C) 2002 Andre Pang <ozone@vimacs.cx> +" +" Please see the documentation (vimacs.txt) for the README, installation +" notes, and the ChangeLog. +" + +" +" 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, write to the Free Software +" Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +" +" This General Public License does not permit incorporating your program into +" proprietary programs. If your program is a subroutine library, you may +" consider it more useful to permit linking proprietary applications with the +" library. If this is what you want to do, use the GNU Library General +" Public License instead of this License. +" + +" TODO: :h map-script +" :h cpoptions +" :h mapleader +" :h map-<SID> <SID> +" :h <Plug> +" :h undo? +" :h write-plugin + +" Have <unique> for all maps? + + +" Never load Vimacs if user wants true Vi! (We're not _that_ evil 8) +if v:progname =~ '^vi$' + finish +endif + +if version < 600 + " We require Vim 6 to work :( + echoerr 'Vimacs requires Vim 6 to run :(' + finish +endif + +" We want to be able to remap <> key codes and do line continuation +let s:saved_cpoptions = &cpoptions +set cpoptions-=<,C + + +" Set a default value for a variable only if it doesn't exist +" (like "$foo |= 'bar'" in Perl) +" +" Thanks to Piet Delport for this solution, and Benji Fisher for +" additional comments :) +" + +function! <SID>LetDefault(var_name, value) + if !exists(a:var_name) + execute 'let ' . a:var_name . '=' . a:value + endif +endfunction + +command! -nargs=+ LetDefault call s:LetDefault(<f-args>) + +" Load Vimacs by default +LetDefault g:VM_Enabled 1 + +" Developers may want to turn this on, to always load the file +LetDefault g:VM_Dev 0 + +if g:VM_Enabled == 0 || (exists("loaded_vimacs") && g:VM_Dev == 0) || &cp + finish +endif + + +" +" Function to mark a cursor position and restore it afterward -- used in a few +" functions, like FillParagraph(). Blatantly stolen from foo.vim by Benji +" Fisher :) +" + +function! <SID>Mark(...) + if a:0 == 0 + let mark = line(".") . "G" . virtcol(".") . "|" + normal! H + let mark = "normal!" . line(".") . "Gzt" . mark + execute mark + return mark + elseif a:0 == 1 + return "normal!" . a:1 . "G1|" + else + return "normal!" . a:1 . "G" . a:2 . "|" + endif +endfun + + +" +" It's a good idea to have a command height of at least 2 if showmode is on, +" because many important messages will be overwritten by the mode display. +" e.g. <C-x><C-s>, which saves the file, will display that the file has been +" saved, but the notice will be immediately overwritten by the modeline when +" this happens. +" + +" Don't fork around with cmdheight? +LetDefault g:VM_CmdHeightAdj 1 + +if &cmdheight == 1 && &showmode == 1 && g:VM_CmdHeightAdj + set cmdheight=2 +endif + + +" +" Vim options essential for emulating Emacs-ish behaviour +" + +" Turn off <Alt>/<Meta> pulling down GUI menu +set winaltkeys=no +" Emacs normally wraps everything +set whichwrap=b,s,<,>,h,l,[,],~ +" Emacs always has 'hidden buffers' +set hidden +" Backspace in Emacs normally backspaces anything :) +set backspace=indent,eol,start +" Want to be able to use <Tab> within our mappings +" (This has got to be the coolest option name ever, btw) +set wildcharm=<Tab> +" Recognise key sequences that start with <Esc> in Insert Mode +set esckeys + + +" +" For the UNIX console -- make <Esc>x == <M-x> +" + +" Pressing <M-x> sends <Esc>x? (As Unix terminals often do) +LetDefault g:VM_UnixConsoleMetaSendsEsc 1 + +" One or two <Esc>s required to go back to Normal mode? +LetDefault g:VM_SingleEscToNormal 1 + +if has("unix") && !has("gui_running") && g:VM_UnixConsoleMetaSendsEsc + " <Esc>x maps to <M-x> + set <M-1>=1 + set <M-2>=2 + set <M-3>=3 + set <M-4>=4 + set <M-5>=5 + set <M-6>=6 + set <M-7>=7 + set <M-8>=8 + set <M-9>=9 + set <M-0>=0 + set <M-a>=a + set <M-b>=b + set <M-c>=c + set <M-d>=d + set <M-e>=e + set <M-f>=f + set <M-g>=g + set <M-h>=h + set <M-i>=i + set <M-j>=j + set <M-k>=k + set <M-l>=l + set <M-m>=m + set <M-n>=n + set <M-o>=o + set <M-p>=p + set <M-q>=q + set <M-r>=r + set <M-s>=s + set <M-t>=t + set <M-u>=u + set <M-v>=v + set <M-w>=w + set <M-x>=x + set <M-y>=y + set <M-z>=z + set <M->= + set <M-/>=/ + " Doing "set <M->>=^[>" throws up an error, so we be dodgey and use Char-190 + " instead, which is ASCII 62 ('>' + 128). + set <Char-190>=> + set <M-<>=< + set <M-0>=0 + set <M-%>=% + set <M-*>=* + set <M-.>=. + set <M-^>=^ + " Can't set <M-Space> right now :( + set <M-Space>=^[<Space> + +endif + + +" +" One or two <Esc>s to get back to Normal mode? +" + +" on CmdwinLeave? +if g:VM_SingleEscToNormal == 1 + if &insertmode + if has('unix') && !has('gui_running') && g:VM_UnixConsoleMetaSendsEsc + inoremap <Esc><Esc> <C-o>:UseF1ForNormal<CR> + else + inoremap <Esc> <C-l> + endif + endif + + set notimeout + set ttimeout + set timeoutlen=50 +else + inoremap <Esc><Esc> <C-l> + vnoremap <Esc><Esc> <Esc> + set notimeout + set nottimeout +endif + +command! UseF1ForNormal echoerr "Use F1 or <C-z> to return to Normal mode. :help vimacs-unix-esc-key" + + +" +" Insert mode <-> Normal mode <-> Command mode +" + +inoremap <M-x> <C-o>: +inoremap <M-:> <C-o>: +inoremap <F1> <C-l> +inoremap <F2> <C-o> +inoremap <M-`> <C-o> +inoremap <silent> <C-z> <C-l>:echo "Returning to Normal mode; press <C-z> again to suspend Vimacs"<CR> +nnoremap <C-z> :call <SID>Suspend()<CR> +" M-` isn't defined in Emacs + +inoremap <M-1> <C-o>1 +inoremap <M-2> <C-o>2 +inoremap <M-3> <C-o>3 +inoremap <M-4> <C-o>4 +inoremap <M-5> <C-o>5 +inoremap <M-6> <C-o>6 +inoremap <M-7> <C-o>7 +inoremap <M-8> <C-o>8 +inoremap <M-9> <C-o>9 + +LetDefault g:VM_NormalMetaXRemap 1 + +if g:VM_NormalMetaXRemap == 1 + nnoremap <M-x> : +endif + +function! <SID>Suspend() + suspend! + if &insertmode + startinsert + endif +endfunction + + +" +" Leaving Vim +" + +inoremap <C-x><C-c> <C-o>:confirm qall<CR> + + +" +" Files & Buffers +" + +inoremap <C-x><C-f> <C-o>:hide edit<Space> +inoremap <C-x><C-s> <C-o>:update<CR> +inoremap <C-x>s <C-o>:wall<CR> +inoremap <C-x>i <C-o>:read<Space> +"what does C-x C-v do? +inoremap <C-x><C-w> <C-o>:write<Space> +inoremap <C-x><C-q> <C-o>:set invreadonly<CR> +inoremap <C-x><C-r> <C-o>:hide view<Space> + + +" +" Help Sistemmii (hi Finns) +" +"inoremap <C-h> <C-o>:help + + +" +" Error Recovery +" + +inoremap <C-_> <C-o>u +inoremap <C-x><C-u> <C-o>u +"lots of other stuff :( + + +" +" Incremental Searching and Query Replace +" + +inoremap <C-s> <C-o>:call <SID>StartSearch('/')<CR><C-o>/ +inoremap <C-r> <C-o>:call <SID>StartSearch('?')<CR><C-o>? +inoremap <M-n> <C-o>:cnext<CR> +" <M-n> not in Emacs: next in QuickFix +inoremap <M-p> <C-o>:cprevious<CR> +" <M-p> not in Emacs: previous in QuickFix +inoremap <C-M-s> <C-o>:call <SID>StartSearch('/')<CR><C-o>/ +inoremap <C-M-r> <C-o>:call <SID>StartSearch('?')<CR><C-o>? +inoremap <M-s> <C-o>:set invhls<CR> +inoremap <M-%> <C-o>:call <SID>QueryReplace()()<CR> +inoremap <C-M-%> <C-o>:call <SID>QueryReplace()_regexp()<CR> +cnoremap <C-r> <CR><C-o>?<Up> + +command! QueryReplace :call <SID>QueryReplace()() +command! QueryReplaceRegexp :call <SID>QueryReplace()_regexp() + +" Searching is a bit tricky because we have to emulate Emacs's behaviour of +" searching again when <C-s> or <C-r> is pressed _inside_ the search +" commandline. Vim has no equivalent to this, so we must use a bit of +" on-the-fly remap trickery (popular in Quake-style games) to provide +" different functionality for <C-s>, depending on whether you're in 'search +" mode' or not. +" +" We must map <C-g> and <CR> because we have to undo the map trickery that we +" set up when we abort/finish the search. All in all, it's not too complex +" when you actually look at what the code does. +" +" Note that <C-c> in Emacs is functionally the same as <CR>. + +LetDefault g:VM_SearchRepeatHighlight 0 + +function! <SID>StartSearch(search_dir) + let s:incsearch_status = &incsearch + let s:lazyredraw_status = &lazyredraw + set incsearch + cmap <C-c> <CR> + cnoremap <C-s> <CR><C-o>:call <SID>SearchAgain()<CR><C-o>/<Up> + cnoremap <C-r> <CR><C-o>:call <SID>SearchAgain()<CR><C-o>?<Up> + cnoremap <silent> <CR> <CR><C-o>:call <SID>StopSearch()<CR> + cnoremap <silent> <C-g> <C-c><C-o>:call <SID>AbortSearch()<CR> + cnoremap <silent> <Esc> <C-c><C-o>:call <SID>AbortSearch()<CR> + if a:search_dir == '/' + cnoremap <M-s> <CR><C-o>:set invhls<CR><Left><C-o>/<Up> + else + cnoremap <M-s> <CR><C-o>:set invhls<CR><Left><C-o>?<Up> + endif + let s:before_search_mark = <SID>Mark() +endfunction + +function! <SID>StopSearch() + cunmap <C-c> + cunmap <C-s> + cunmap <C-r> + cunmap <CR> + cunmap <C-g> + cnoremap <C-g> <C-c> + if exists("s:incsearch_status") + let &incsearch = s:incsearch_status + unlet s:incsearch_status + endif + if g:VM_SearchRepeatHighlight == 1 + if exists("s:hls_status") + let &hls = s:hls_status + unlet s:hls_status + endif + endif +endfunction + +function! <SID>AbortSearch() + call <SID>StopSearch() + if exists("s:before_search_mark") + execute s:before_search_mark + unlet s:before_search_mark + endif +endfunction + +function! <SID>SearchAgain() + if g:VM_SearchRepeatHighlight == 1 + if !exists("s:hls_status") + let s:hls_status = &hls + endif + set hls + endif +endfunction + +" Emacs' `query-replace' functions + +function! <SID>QueryReplace() + let magic_status = &magic + set nomagic + let searchtext = input("Query replace: ") + if searchtext == "" + echo "(no text entered): exiting to Insert mode" + return + endif + let replacetext = input("Query replace " . searchtext . " with: ") + let searchtext_esc = escape(searchtext,'/\^$') + let replacetext_esc = escape(replacetext,'/\') + execute ".,$s/" . searchtext_esc . "/" . replacetext_esc . "/cg" + let &magic = magic_status +endfunction + +function! <SID>QueryReplaceRegexp() + let searchtext = input("Query replace regexp: ") + if searchtext == "" + echo "(no text entered): exiting to Insert mode" + return + endif + let replacetext = input("Query replace regexp " . searchtext . " with: ") + let searchtext_esc = escape(searchtext,'/') + let replacetext_esc = escape(replacetext,'/') + execute ".,$s/" . searchtext_esc . "/" . replacetext_esc . "/cg" +endfunction + + +" +" Command line editing +" + +" Navigation +cmap <C-b> <Left> +cmap <C-f> <Right> +cnoremap <M-f> <S-Right> +cnoremap <M-b> <S-Left> +cmap <C-a> <Home> +cmap <C-e> <End> + +" Editing +cmap <M-p> <Up> +cmap <M-n> <Down> +cmap <C-d> <Del> +cnoremap <C-y> <C-r><C-o>" +cnoremap <M-w> <C-y> +cnoremap <M-BS> <C-w> +cnoremap <C-k> <C-f>d$<C-c><End> +"Should really use &cedit, not just <C-f> -- but how? + + +" +" Navigation +" + +" Insert/Visual/Operator mode maps +imap <C-b> <Left> +vmap <C-b> <Left> +omap <C-b> <Left> +imap <C-f> <Right> +vmap <C-f> <Right> +omap <C-f> <Right> +imap <C-p> <Up> +vmap <C-p> <Up> +omap <C-p> <Up> +imap <C-n> <Down> +vmap <C-n> <Down> +omap <C-n> <Down> +inoremap <M-f> <C-o>e<Right> +vnoremap <M-f> e<Right> +onoremap <M-f> e<Right> +inoremap <M-b> <C-Left> +vnoremap <M-b> <C-Left> +onoremap <M-b> <C-Left> +imap <C-a> <Home> +vmap <C-a> <Home> +omap <C-a> <Home> +imap <C-e> <End> +vmap <C-e> <End> +omap <C-e> <End> +inoremap <M-a> <C-o>( +vnoremap <M-a> ( +onoremap <M-a> ( +inoremap <M-e> <C-o>) +vnoremap <M-e> ) +onoremap <M-e> ) +inoremap <C-d> <Del> +vnoremap <C-d> <Del> +onoremap <C-d> <Del> +inoremap <M-<> <C-o>1G<C-o>0 +vnoremap <M-<> 1G0 +onoremap <M-<> 1G0 +inoremap <M->> <C-o>G<C-o>$ +vnoremap <M->> G$ +onoremap <M->> G$ +inoremap <C-v> <PageDown> +vnoremap <C-v> <PageDown> +onoremap <C-v> <PageDown> +inoremap <M-v> <PageUp> +vnoremap <M-v> <PageUp> +onoremap <M-v> <PageUp> +inoremap <M-m> <C-o>^ +vnoremap <M-m> ^ +onoremap <M-m> ^ +inoremap <C-x>= <C-g> +vnoremap <C-x>= <C-g> +onoremap <C-x>= <C-g> +inoremap <silent> <M-g> <C-o>:call <SID>GotoLine()<CR> +vnoremap <silent> <M-g> :<C-u>call <SID>GotoLine()<CR> +onoremap <silent> <M-g> :call <SID>GotoLine()<CR> +" Phear, <M-g> works properly even in Visual/Operator-Pending +" modes :) (It's rather dangerous with the latter, though ...) +inoremap <M-Left> <S-Left> +vnoremap <M-Left> <S-Left> +onoremap <M-Left> <S-Left> +inoremap <M-Right> <S-Right> +vnoremap <M-Right> <S-Right> +onoremap <M-Right> <S-Right> +inoremap <C-Up> <C-o>{ +vnoremap <C-Up> { +onoremap <C-Up> { +inoremap <C-Down> <C-o>} +vnoremap <C-Down> } +onoremap <C-Down> } + +command! GotoLine :call <SID>GotoLine() + +function! <SID>GotoLine() + let targetline = input("Goto line: ") + if targetline =~ "^\\d\\+$" + execute "normal! " . targetline . "G0" + elseif targetline =~ "^\\d\\+%$" + execute "normal! " . targetline . "%" + elseif targetline == "" + echo "(cancelled)" + else + echo " <- Not a Number" + endif +endfunction + +command! GotoLine :call <SID>GotoLine() + + +" +" General Editing +" + +inoremap <C-c> <Space><Left> +inoremap <C-u> <C-o>d0 +inoremap <C-q> <C-v> +inoremap <C-^> <C-y> +inoremap <M-r> <C-r>= + +"" Aborting +cnoremap <C-g> <C-c> +onoremap <C-g> <C-c> + + +" +" Killing and Deleting +" + +inoremap <C-d> <Del> +inoremap <silent> <M-d> <C-r>=<SID>KillWord()<CR> +inoremap <M-> <C-w> +inoremap <M-BS> <C-w> +inoremap <C-BS> <C-w> +inoremap <silent> <C-k> <C-r>=<SID>KillLine()<CR> +" Thanks to Benji Fisher for helping me with getting <C-k> to work! +inoremap <M-0><C-k> <C-o>d0 +inoremap <M-k> <C-o>d) +inoremap <C-x><BS> <C-o>d( +inoremap <M-z> <C-o>dt +inoremap <M-\> <Esc>beldwi + +function! <SID>KillWord() + if col('.') > strlen(getline('.')) + return "\<Del>\<C-o>dw" + else + return "\<C-o>dw" + endif +endfunction + +function! <SID>KillLine() + if col('.') > strlen(getline('.')) + " At EOL; join with next line + return "\<Del>" + else + " Not at EOL; kill until end of line + return "\<C-o>d$" + endif +endfunction + + +" +" Abbreviations +" + +inoremap <M-/> <C-p> +inoremap <C-M-/> <C-x> +inoremap <C-M-x> <C-x> +inoremap <C-]> <C-x> + + +" +" Visual stuff (aka 'marking' aka 'region' aka 'block' etc etc) +" + +set sel=exclusive +" Visual mode +inoremap <silent> <C-Space> <C-r>=<SID>StartVisualMode()<CR> +" Unix terminals produce <C-@>, not <C-Space> +imap <C-@> <C-Space> +vnoremap <C-x><C-Space> <Esc> +vnoremap <C-g> <Esc> +vnoremap <C-x><C-@> <Esc> +vnoremap <M-w> "1y +"May have to change to "1d and paste ... + +" Marking blocks +inoremap <M-Space> <C-o>:call <SID>StartMarkSel()<CR><C-o>viw +inoremap <M-h> <C-o>:call <SID>StartMarkSel()<CR><C-o>vap +inoremap <C-<> <C-o>:call <SID>StartMarkSel()<CR><C-o>v1G0o +inoremap <C->> <C-o>:call <SID>StartMarkSel()<CR><C-o>vG$o +inoremap <C-x>h <C-o>:call <SID>StartMarkSel()<CR><Esc>1G0vGo + +" Block operations +vnoremap <C-w> "1d +vnoremap <S-Del> "_d +vnoremap <C-x><C-x> o +vnoremap <C-x><C-u> U +vnoremap <M-x> : + +" Pasting +inoremap <silent> <C-y> <C-o>:call <SID>ResetKillRing()<CR><C-r><C-o>" +inoremap <S-Ins> <C-r><C-o>* +"inoremap <M-y> <C-o>:echoerr "Sorry, yank-pop is not yet implemented!"<CR> +inoremap <M-y> <C-o>:call <SID>YankPop()<CR> + +function! <SID>YankPop() + undo + if !exists("s:kill_ring_position") + call <SID>ResetKillRing() + endif + execute "normal! i\<C-r>\<C-o>" . s:kill_ring_position . "\<Esc>" + call <SID>IncrKillRing() +endfunction + +function! <SID>ResetKillRing() + let s:kill_ring_position = 3 +endfunction + +function! <SID>IncrKillRing() + if s:kill_ring_position >= 9 + let s:kill_ring_position = 2 + else + let s:kill_ring_position = s:kill_ring_position + 1 + endif +endfunction + +function! <SID>StartMarkSel() + if &selectmode =~ 'key' + set keymodel-=stopsel + endif +endfunction + +function! <SID>StartVisualMode() + call <SID>StartMarkSel() + if col('.') > strlen(getline('.')) + " At EOL + return "\<Right>\<C-o>v\<Left>" + else + return "\<C-o>v" + endif +endfunction + + +" +" Use <Shift> to select text, ala Windows. +" (XEmacs supports this) +" + +" We need to make sure that the 'keymodel' option has stopsel before we +" start the actual marking, so that the user can cancel it with any +" navigational key as she normally would. This is in contrast to the +" <C-Space> style of marking, where navigational keys do _not_ cancel +" marking. +" +" Note that this doesn't work properly if the user remaps + +inoremap <silent> <S-Up> <C-o>:call <SID>StartShiftSel()<CR><S-Up> +inoremap <silent> <S-Down> <C-o>:call <SID>StartShiftSel()<CR><S-Down> +inoremap <silent> <S-Left> <C-o>:call <SID>StartShiftSel()<CR><S-Left> +inoremap <silent> <S-Right> <C-o>:call <SID>StartShiftSel()<CR><S-Right> +inoremap <silent> <S-End> <C-o>:call <SID>StartShiftSel()<CR><S-End> +inoremap <silent> <S-Home> <C-o>:call <SID>StartShiftSel()<CR><S-Home> +inoremap <silent> <S-PageUp> <C-o>:call <SID>StartShiftSel()<CR><S-PageUp> +inoremap <silent> <S-PageDown> <C-o>:call <SID>StartShiftSel()<CR><S-PageDown> + +function! <SID>StartShiftSel() + if &selectmode =~ "key" + set keymodel+=stopsel + endif +endfunction + + +" +" Window Operations +" + +inoremap <C-x>2 <C-o><C-w>s +inoremap <C-x>3 <C-o><C-w>v +inoremap <C-x>0 <C-o><C-w>c +inoremap <C-x>1 <C-o><C-w>o +inoremap <C-x>o <C-o><C-w>w +" <C-x>O is not defined in Emacs ... +inoremap <C-x>O <C-o><C-w>W +inoremap <C-Tab> <C-o><C-w>w +inoremap <C-S-Tab> <C-o><C-w>W +inoremap <C-x>+ <C-o><C-w>= +inoremap <silent> <C-M-v> <C-o>:ScrollOtherWindow<CR> + +inoremap <C-x>4<C-f> <C-o>:FindFileOtherWindow<Space> +inoremap <C-x>4f <C-o>:FindFileOtherWindow<Space> + +function! <SID>number_of_windows() + let i = 1 + while winbufnr(i) != -1 + let i = i + 1 + endwhile + return i - 1 +endfunction + +function! <SID>FindFileOtherWindow(filename) + let num_windows = <SID>number_of_windows() + if num_windows <= 1 + wincmd s + endif + wincmd w + execute "edit " . a:filename + wincmd W +endfunction + +command! -nargs=1 -complete=file FindFileOtherWindow :call <SID>FindFileOtherWindow(<f-args>) + +command! ScrollOtherWindow silent! execute "normal! \<C-w>w\<PageDown>\<C-w>W" + + +" +" Formatting +" + +inoremap <silent> <M-q> <C-o>:call <SID>FillParagraph()<CR> +inoremap <script> <C-o> <CR><Left> +inoremap <C-M-o> <C-o>:echoerr "<C-M-o> not supported yet; sorry!"<CR> +inoremap <C-x><C-o> <C-o>:call <SID>DeleteBlankLines()<CR> +" Try GoZ<Esc>:g/^$/.,/./-j<CR>Gdd +inoremap <M-^> <Up><End><C-o>J +vnoremap <C-M-\> = +vnoremap <C-x><Tab> = + +command! FillParagraph :call <SID>FillParagraph() + +function! <SID>FillParagraph() + let old_cursor_pos = <SID>Mark() + normal! gqip + execute old_cursor_pos +endfunction + +function! <SID>DeleteBlankLines() + if getline(".") == "" || getline(". + 1") == "" || getline(". - 1") == "" + ?^.\+$?+1,/^.\+$/-2d"_" + endif + normal j +endfunction + + + +" +" Case Change +" + +inoremap <M-l> <C-o>gul<C-o>w +inoremap <M-u> <C-o>gUe<C-o>w +inoremap <M-c> <C-o>gUl<C-o>w + + +" +" Buffers +" + +inoremap <C-x>b <C-r>=<SID>BufExplorerOrBufferList()<CR> +inoremap <C-x><C-b> <C-o>:buffers<CR> +inoremap <C-x>k <C-o>:bdelete<Space> + +"" Integration with the BufExplorer plugin. Phear :) (I so love <C-r>=) +function! <SID>BufExplorerOrBufferList() + if exists(":BufExplorer") + if !exists("g:bufExplorerSortBy") + " If user hasn't specified a sort order, default to MRU because that's + " the default in Emacs, and also select the last viewed file. + let g:bufExplorerSortBy = "mru" + endif +" echo bufexplorer_initial_keys + return "\<C-o>:BufExplorer\<CR>" + else + return "\<C-o>:buffer \<Tab>" + endif +endfunction + + +" +" Marks (a.k.a. "Registers" in Emacs) +" + +inoremap <C-x>/ <C-o>:call <SID>PointToRegister()<CR> +inoremap <C-x>r<Space> <C-o>:call <SID>PointToRegister()<CR> +inoremap <C-x>r<C-Space> <C-o>:call <SID>PointToRegister()<CR> +inoremap <C-x>r<C-@> <C-o>:call <SID>PointToRegister()<CR> + +inoremap <C-x>rj <C-o>:call <SID>JumpToRegister()<CR> +inoremap <C-x>p <C-o><C-o> +" <C-x>p not in Emacs -- goes to Previous entry in jump list + +command! PointToRegister :call PointToRegister() +command! JumpToRegister :call JumpToRegister() + +function! <SID>PointToRegister() + echo "Point to mark: " + let c = nr2char(getchar()) + execute "normal! m" . c +endfunction + +function! <SID>JumpToRegister() + echo "Jump to mark: " + let c = nr2char(getchar()) + execute "normal! `" . c +endfunction + + + +" +" Transposing +" + +"" for testing -- foo bar baz quux + +inoremap <C-t> <Left><C-o>x<C-o>p +" M-t behaviour is not exactly the same as Emacs; live with it or send me +" a patch :) (Personally, I find Emacs's M-t behaviour not very +" Do-What-I-Mean'ish anyway) +inoremap <M-t> <Esc>dawbhpi +inoremap <C-x><C-t> <Up><C-o>dd<End><C-o>p<Down> +inoremap <C-M-t> <C-o>:echoerr "C-M-t is not implemented yet; sorry!"<CR> + + +" +" Tags +" + +inoremap <M-.> <C-o><C-]> +inoremap <M-*> <C-o><C-t> +inoremap <C-x>4. <C-o><C-w>} + + +" +" Shells +" + +vnoremap <M-!> ! +inoremap <M-!> <C-o>:! + + +" +" Rectangles +" + +vnoremap <C-x>r <C-v> + + +" +" Abbreviations? +" + + +" +" GNU Info Reader? +" + + +" +" Keyboard Macros +" + + +" +" Redraw +" + +inoremap <C-l> <C-o>zz<C-o><C-l> + + +" +" Enable menus in the console (like GNU Emacs) +" Thanks to Piet Delport for this great idea! +" + +LetDefault g:VM_F10Menu 1 + +if g:VM_F10Menu == 1 + runtime menu.vim + inoremap <F10> <C-o>:emenu <Tab> +endif + + +" +" We're done :) +" + +delcommand LetDefault +delfunction s:LetDefault + +" Restore cpoptions +let &cpoptions = s:saved_cpoptions + +let loaded_vimacs = 1 + +" vim:sw=2 + |