1
0
forked from aniani/vim

updated for version 7.0225

This commit is contained in:
Bram Moolenaar 2006-03-15 22:59:18 +00:00
parent 5671873089
commit 7d47b6eed7
17 changed files with 186 additions and 59 deletions

View File

@ -1,7 +1,7 @@
" netrw.vim: Handles file transfer and remote directory listing across a network
" AUTOLOAD PORTION
" Date: Mar 13, 2006
" Version: 80
" Date: Mar 14, 2006
" Version: 81
" Maintainer: Charles E Campbell, Jr <drchipNOSPAM at campbellfamily dot biz>
" GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
" Copyright: Copyright (C) 1999-2005 Charles E. Campbell, Jr. {{{1
@ -23,7 +23,7 @@
if &cp || exists("g:loaded_netrw")
finish
endif
let g:loaded_netrw = "v80"
let g:loaded_netrw = "v81"
if v:version < 700
echohl WarningMsg | echo "***netrw*** you need vim version 7.0 or later for version ".g:loaded_netrw." of netrw" | echohl None
finish
@ -2803,21 +2803,7 @@ fun! netrw#DirBrowse(dirname)
let s:last_sort_by= g:netrw_sort_by
" set up ShellCmdPost handling. Append current buffer to browselist
if !exists("s:netrw_browselist")
let s:netrw_browselist= []
endif
if g:netrw_fastbrowse <= 1 && (empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1])
call add(s:netrw_browselist,bufnr("%"))
" call Decho("browselist=".string(s:netrw_browselist))
endif
if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
" call Decho("setting up local-browser shell command refresh")
let s:netrw_browser_shellcmd= 1
augroup AuNetrwShellCmd
au!
au ShellCmdPost * call s:LocalBrowseShellCmdRefresh()
augroup END
endif
call s:LocalFastBrowser()
" get the new directory name
if has("win32") || has("win95") || has("win64") || has("win16")
@ -3368,6 +3354,47 @@ fun! s:LocalBrowseRename(path) range
" call Dret("LocalBrowseRename")
endfun
" ---------------------------------------------------------------------
" LocalFastBrowser: handles setting up/taking down fast browsing for the {{{2
" local browser
fun! s:LocalFastBrowser()
" call Dfunc("LocalFastBrowser()")
" initialize browselist, a list of buffer numbers that the local browser has used
if !exists("s:netrw_browselist")
let s:netrw_browselist= []
endif
" append current buffer to fastbrowse list
if g:netrw_fastbrowse <= 1 && (empty(s:netrw_browselist) || bufnr("%") > s:netrw_browselist[-1])
call add(s:netrw_browselist,bufnr("%"))
" call Decho("browselist=".string(s:netrw_browselist))
endif
" enable autocmd events to handle refreshing/removing local browser buffers
" If local browse buffer is currently showing: refresh it
" If local browse buffer is currently hidden : wipe it
if !exists("s:netrw_browser_shellcmd") && g:netrw_fastbrowse <= 1
" call Decho("setting up local-browser shell command refresh")
let s:netrw_browser_shellcmd= 1
augroup AuNetrwShellCmd
au!
au ShellCmdPost,FocusGained * call s:LocalBrowseShellCmdRefresh()
augroup END
" user must have changed fastbrowse to its fast setting, so remove
" the associated autocmd events
if g:netrw_fastbrowse > 1 && exists("s:netrw_browser_shellcmd")
unlet s:netrw_browser_shellcmd
augroup AuNetrwShellCmd
au!
augroup END
augroup! AuNetrwShellCmd
endif
" call Dret("LocalFastBrowser")
endfun
" ---------------------------------------------------------------------
" LocalObtain: copy selected file to current working directory {{{2
fun! s:LocalObtain()
@ -3883,6 +3910,7 @@ fun! s:NetOptionSave()
let w:cinokeep = &cino
let w:comkeep = &com
let w:cpokeep = &cpo
let w:hidkeep = &hidden
let w:magickeep = &magic
if !g:netrw_keepdir
let w:dirkeep = getcwd()
@ -3894,7 +3922,7 @@ fun! s:NetOptionSave()
setlocal cino =
setlocal com =
setlocal cpo -=aA
setlocal nocin noai noci magic nospell fo=nroql2
setlocal nocin noai noci magic nospell fo=nroql2 nohid
setlocal tw =0
setlocal report=10000
if has("win32") && !has("win95")
@ -3926,6 +3954,7 @@ fun! s:NetOptionRestore()
if exists("w:dirkeep") |exe "lcd ".w:dirkeep |unlet w:dirkeep |endif
if exists("w:fokeep") |let &fo = w:fokeep |unlet w:fokeep |endif
if exists("w:gdkeep") |let &gd = w:gdkeep |unlet w:gdkeep |endif
if exists("w:hidkeep") |let &hidden = w:hidkeep |unlet w:hidkeep |endif
if exists("w:magic") |let &magic = w:magic |unlet w:magic |endif
if exists("w:repkeep") |let &report = w:repkeep |unlet w:repkeep |endif
if exists("w:spellkeep")|let &spell = w:spellkeep |unlet w:spellkeep|endif

View File

@ -1,4 +1,4 @@
*autocmd.txt* For Vim version 7.0aa. Last change: 2006 Mar 10
*autocmd.txt* For Vim version 7.0aa. Last change: 2006 Mar 15
VIM REFERENCE MANUAL by Bram Moolenaar
@ -270,6 +270,7 @@ Name triggered by ~
Various
|FileChangedShell| Vim notices that a file changed since editing started
|FileChangedShellPost| After handling a file changed since editing started
|FileChangedRO| before making the first change to a read-only file
|ShellCmdPost| after executing a shell command
@ -279,6 +280,7 @@ Name triggered by ~
|SpellFileMissing| a spell file is used but it can't be found
|SourcePre| before sourcing a Vim script
|VimResized| after the Vim window size changed
|FocusGained| Vim got input focus
|FocusLost| Vim lost input focus
|CursorHold| the user doesn't press a key for a while
@ -537,6 +539,9 @@ FileChangedShell When Vim notices that the modification time of
commands for the FileChangedShell event no
other FileChangedShell event will be
triggered.
*FileChangedShellPost*
FileChangedShellPost After handling a file that was changed outside
of Vim. Can be used to update the statusline.
*FileEncoding*
FileEncoding Obsolete. It still works and is equivalent
to |EncodingChanged|.
@ -764,6 +769,10 @@ VimLeavePre Before exiting Vim, just before writing the
Mostly useful with a "*" pattern. >
:autocmd VimLeavePre * call CleanupStuff()
< To detect an abnormal exit use |v:dying|.
*VimResized*
VimResized After the Vim window was resized, thus 'lines'
and/or 'columns' changed. Not when starting
up though.
*WinEnter*
WinEnter After entering another window. Not done for
the first window, when Vim has just started.

View File

@ -1,4 +1,4 @@
*diff.txt* For Vim version 7.0aa. Last change: 2006 Mar 14
*diff.txt* For Vim version 7.0aa. Last change: 2006 Mar 15
VIM REFERENCE MANUAL by Bram Moolenaar
@ -51,6 +51,8 @@ splits add the |-o| argument: >
vimdiff -o file1 file2 [file3]
If you always prefer horizontal splits include "horizontal" in 'diffopt'.
In each of the edited files these options are set:
'diff' on
@ -58,7 +60,7 @@ In each of the edited files these options are set:
'scrollopt' includes "hor"
'wrap' off
'foldmethod' "diff"
'foldcolumn' 2
'foldcolumn' value from 'diffopt', default is 2
These options are set local to the window. When editing another file they are
reset to the global value.
@ -107,7 +109,9 @@ To make these commands use a vertical split, prepend |:vertical|. Examples: >
:vert diffsplit main.c~
:vert diffpatch /tmp/diff
<
If you always prefer a vertical split include "vertical" in 'diffopt'.
*E96*
There can be up to four buffers with 'diff' set.
@ -378,8 +382,8 @@ will have the same effect. These variables are set to the file names used:
Example (this does the same as 'patchexpr' being empty): >
let patchexpr=MyPatch()
function MyPatch
set patchexpr=MyPatch()
function MyPatch()
:call system("patch -o " . v:fname_out . " " . v:fname_in .
\ " < " . v:fname_diff)
endfunction

View File

@ -1,4 +1,4 @@
*options.txt* For Vim version 7.0aa. Last change: 2006 Mar 12
*options.txt* For Vim version 7.0aa. Last change: 2006 Mar 15
VIM REFERENCE MANUAL by Bram Moolenaar
@ -1624,6 +1624,8 @@ A jump table for the options with a short description can be found at |Q_op|.
*'completeopt'* *'cot'*
'completeopt' 'cot' string (default: "menu,preview")
global
{not available when compiled without the
|+insert_expand| feature}
{not in Vi}
A comma separated list of options for Insert mode completion
|ins-completion|. The supported values are:
@ -1644,7 +1646,6 @@ A jump table for the options with a short description can be found at |Q_op|.
preview Show extra information about the currently selected
completion in the preview window.
*'confirm'* *'cf'* *'noconfirm'* *'nocf'*
'confirm' 'cf' boolean (default off)
global
@ -2184,11 +2185,20 @@ A jump table for the options with a short description can be found at |Q_op|.
exactly. It should ignore adding trailing
white space, but not leading white space.
horizontal Start diff mode with horizontal splits (unless
explicitly specified otherwise).
vertical Start diff mode with vertical splits (unless
explicitly specified otherwise).
foldcolumn:{n} Set the 'foldcolumn' option to {n} when
starting diff mode. Without this 2 is used.
Examples: >
:set diffopt=filler,context:4
:set diffopt=
:set diffopt=filler
:set diffopt=filler,foldcolumn:3
<
*'digraph'* *'dg'* *'nodigraph'* *'nodg'*
'digraph' 'dg' boolean (default off)
@ -5019,6 +5029,17 @@ A jump table for the options with a short description can be found at |Q_op|.
global
When on a ":" prompt is used in Ex mode.
*'pumheight'* *'ph'*
'pumheight' 'ph' number (default 0)
global
{not available when compiled without the
|+insert_expand| feature}
{not in Vi}
Determines the maximum number of items to show in the popup menu.
When zero as much space as available is used.
|ins-completion-menu|.
*'quoteescape'* *'qe'*
'quoteescape' 'qe' string (default "\")
local to buffer

View File

@ -1,4 +1,4 @@
*pi_netrw.txt* For Vim version 7.0. Last change: Mar 10, 2006
*pi_netrw.txt* For Vim version 7.0. Last change: Mar 14, 2006
VIM REFERENCE MANUAL by Charles E. Campbell, Jr.
@ -1439,6 +1439,13 @@ which is loaded automatically at startup (assuming :set nocp).
==============================================================================
11. History *netrw-history* {{{1
v81: * FocusGained also used to refresh/wipe local browser directory
buffers
* (bugfix) netrw was leaving [Scratch] buffers behind when the
the user had the "hidden" option set. The 'hidden' option is
now bypassed.
v80: * ShellCmdPost event used in conjunction with g:netrw_fastbrowse
to refresh/wipe local browser directory buffers.
v79: * directories are now displayed with nowrap
* (bugfix) if the column width was smaller than the largest
file's name, then netrw would hang when using wide-listing

View File

@ -646,6 +646,7 @@ $VIMRUNTIME starting.txt /*$VIMRUNTIME*
'pex' options.txt /*'pex'*
'pexpr' options.txt /*'pexpr'*
'pfn' options.txt /*'pfn'*
'ph' options.txt /*'ph'*
'pheader' options.txt /*'pheader'*
'pi' options.txt /*'pi'*
'pm' options.txt /*'pm'*
@ -665,6 +666,7 @@ $VIMRUNTIME starting.txt /*$VIMRUNTIME*
'printoptions' options.txt /*'printoptions'*
'prompt' options.txt /*'prompt'*
'pt' options.txt /*'pt'*
'pumheight' options.txt /*'pumheight'*
'pvh' options.txt /*'pvh'*
'pvw' options.txt /*'pvw'*
'qe' options.txt /*'qe'*
@ -3979,6 +3981,7 @@ FileAppendPost autocmd.txt /*FileAppendPost*
FileAppendPre autocmd.txt /*FileAppendPre*
FileChangedRO autocmd.txt /*FileChangedRO*
FileChangedShell autocmd.txt /*FileChangedShell*
FileChangedShellPost autocmd.txt /*FileChangedShellPost*
FileEncoding autocmd.txt /*FileEncoding*
FileReadCmd autocmd.txt /*FileReadCmd*
FileReadPost autocmd.txt /*FileReadPost*
@ -4181,6 +4184,7 @@ View starting.txt /*View*
VimEnter autocmd.txt /*VimEnter*
VimLeave autocmd.txt /*VimLeave*
VimLeavePre autocmd.txt /*VimLeavePre*
VimResized autocmd.txt /*VimResized*
Virtual-Replace-mode insert.txt /*Virtual-Replace-mode*
VisVim if_ole.txt /*VisVim*
Visual visual.txt /*Visual*

4
src/auto/configure vendored
View File

@ -2838,6 +2838,10 @@ if test "`(uname) 2>/dev/null`" = Darwin; then
echo "$as_me:$LINENO: result: yes" >&5
echo "${ECHO_T}yes" >&6
if test x$prefix = xNONE; then
prefix=/Applications
fi
echo "$as_me:$LINENO: checking --disable-darwin argument" >&5
echo $ECHO_N "checking --disable-darwin argument... $ECHO_C" >&6
# Check whether --enable-darwin or --disable-darwin was given.

View File

@ -85,6 +85,11 @@ AC_MSG_CHECKING([for Darwin (Mac OS X)])
if test "`(uname) 2>/dev/null`" = Darwin; then
AC_MSG_RESULT(yes)
dnl Default install directory is not /usr/local
if test x$prefix = xNONE; then
prefix=/Applications
fi
AC_MSG_CHECKING(--disable-darwin argument)
AC_ARG_ENABLE(darwin,
[ --disable-darwin Disable Darwin (Mac OS X) support.],

View File

@ -52,8 +52,8 @@
static EventHandlerUPP mouseWheelHandlerUPP = NULL;
SInt32 gMacSystemVersion;
#if defined(FEAT_MBYTE)
#define USE_CARBONKEYHANDLER
#ifdef MACOS_CONVERT
# define USE_CARBONKEYHANDLER
static EventHandlerUPP keyEventHandlerUPP = NULL;
#endif
@ -130,7 +130,7 @@ static struct
Boolean isPanelVisible;
} gFontPanelInfo = { 0, 0, 0, false };
#if defined(FEAT_MBYTE)
#ifdef MACOS_CONVERT
# define USE_ATSUI_DRAWING
ATSUStyle gFontStyle;
Boolean gIsFontFallbackSet;
@ -419,7 +419,7 @@ points_to_pixels(char_u *str, char_u **end, int vertical)
return pixels;
}
#if defined(FEAT_MBYTE)
#ifdef MACOS_CONVERT
/*
* Deletes all traces of any Windows-style mnemonic text (including any
* parentheses) from a menu item and returns the cleaned menu item title.
@ -4437,7 +4437,7 @@ clip_mch_request_selection(VimClipboard *cbd)
#endif
tempclip[scrapSize] = 0;
#if defined(FEAT_MBYTE)
#ifdef MACOS_CONVERT
/* Convert from utf-16 (clipboard) */
size_t encLen = 0;
char_u *to = mac_utf16_to_enc((UniChar *)tempclip, scrapSize, &encLen);
@ -4510,7 +4510,7 @@ clip_mch_set_selection(VimClipboard *cbd)
type = clip_convert_selection(&str, (long_u *) &scrapSize, cbd);
#if defined(FEAT_MBYTE)
#ifdef MACOS_CONVERT
size_t utf16_len = 0;
UniChar *to = mac_enc_to_utf16(str, scrapSize, &utf16_len);
if (to)
@ -4628,7 +4628,7 @@ gui_mch_add_menu(vimmenu_T *menu, int idx)
menu_after_me = hierMenu;
/* Convert the name */
#if defined(FEAT_MBYTE)
#ifdef MACOS_CONVERT
name = menu_title_removing_mnemonic(menu);
#else
name = C2Pascal_save(menu->dname);
@ -4721,7 +4721,7 @@ gui_mch_add_menu_item(vimmenu_T *menu, int idx)
for older OS call GetMenuItemData (menu, item, isCommandID?, data) */
/* Convert the name */
#if defined(FEAT_MBYTE)
#ifdef MACOS_CONVERT
name = menu_title_removing_mnemonic(menu);
#else
name = C2Pascal_save(menu->dname);
@ -5745,7 +5745,7 @@ gui_mch_settitle(char_u *title, char_u *icon)
/* TODO: Get vim to make sure maxlen (from p_titlelen) is smaller
* that 256. Even better get it to fit nicely in the titlebar.
*/
#if defined(FEAT_MBYTE)
#ifdef MACOS_CONVERT
CFStringRef windowTitle;
size_t windowTitleLen;
#else
@ -5755,7 +5755,7 @@ gui_mch_settitle(char_u *title, char_u *icon)
if (title == NULL) /* nothing to do */
return;
#if defined(FEAT_MBYTE)
#ifdef MACOS_CONVERT
windowTitleLen = STRLEN(title);
windowTitle = mac_enc_to_cfstring(title, windowTitleLen);

View File

@ -964,8 +964,10 @@ free_all_mem()
#ifdef FEAT_WINDOWS
/* close all tabs and windows */
do_cmdline_cmd((char_u *)"tabonly!");
do_cmdline_cmd((char_u *)"only!");
if (first_tabpage->tp_next != NULL)
do_cmdline_cmd((char_u *)"tabonly!");
if (firstwin != lastwin)
do_cmdline_cmd((char_u *)"only!");
#endif
# if defined(FEAT_SPELL)
@ -1077,6 +1079,10 @@ free_all_mem()
reset_last_sourcing();
#ifdef FEAT_WINDOWS
vim_free(first_tabpage);
#endif
# ifdef UNIX
/* Machine-specific free. */
mch_free_mem();

View File

@ -16,7 +16,14 @@
#define NO_X11_INCLUDES
#include "vim.h"
#ifdef FEAT_MBYTE
#if defined(MACOS_CONVERT) || defined(PROTO)
# ifdef PROTO
/* A few dummy types to be able to generate function prototypes. */
typedef int UniChar;
typedef int *TECObjectRef;
typedef int CFStringRef;
# endif
static char_u *mac_utf16_to_utf8 __ARGS((UniChar *from, size_t fromLen, size_t *actualLen));
static UniChar *mac_utf8_to_utf16 __ARGS((char_u *from, size_t fromLen, size_t *actualLen));
@ -477,7 +484,7 @@ mac_precompose_path(decompPath, decompLen, precompLen)
/*
* Converts from UTF-16 UniChars to precomposed UTF-8
*/
char_u *
static char_u *
mac_utf16_to_utf8(from, fromLen, actualLen)
UniChar *from;
size_t fromLen;
@ -517,7 +524,7 @@ mac_utf16_to_utf8(from, fromLen, actualLen)
/*
* Converts from UTF-8 to UTF-16 UniChars
*/
UniChar *
static UniChar *
mac_utf8_to_utf16(from, fromLen, actualLen)
char_u *from;
size_t fromLen;
@ -548,4 +555,4 @@ mac_utf8_to_utf16(from, fromLen, actualLen)
return result;
}
#endif /* FEAT_MBYTE */
#endif /* MACOS_CONVERT */

View File

@ -87,11 +87,13 @@ redo:
pum_height = size;
else
pum_height = PUM_DEF_HEIGHT;
if (p_ph > 0 && pum_height > p_ph)
pum_height = p_ph;
/* Put the pum below "row" if possible. If there are few lines decide on
* where there is more room. */
if (row >= cmdline_row - top_clear - pum_height
&& row > (cmdline_row - top_clear - height) / 2)
if (row >= cmdline_row - pum_height
&& row > (cmdline_row - top_clear - height) / 2)
{
/* pum above "row" */
if (row >= size)
@ -104,6 +106,11 @@ redo:
pum_row = 0;
pum_height = row;
}
if (p_ph > 0 && pum_height > p_ph)
{
pum_row += pum_height - p_ph;
pum_height = p_ph;
}
}
else
{
@ -113,6 +120,8 @@ redo:
pum_height = cmdline_row - pum_row;
else
pum_height = size;
if (p_ph > 0 && pum_height > p_ph)
pum_height = p_ph;
}
/* don't display when we only have room for one line */
@ -214,7 +223,7 @@ pum_redraw()
int i;
int idx;
char_u *s;
char_u *p;
char_u *p = NULL;
int totwidth, width, w;
int thumb_pos = 0;
int thumb_heigth = 1;
@ -330,6 +339,7 @@ pum_set_selected(n)
int n;
{
int resized = FALSE;
int context = pum_height / 2;
pum_selected = n;
@ -364,20 +374,22 @@ pum_set_selected(n)
pum_first = pum_selected - pum_height + 1;
}
if (pum_height > 6)
/* Give a few lines of context when possible. */
if (context > 3)
context = 3;
if (pum_height > 2)
{
/* Give three lines of context when possible. */
if (pum_first > pum_selected - 3)
if (pum_first > pum_selected - context)
{
/* scroll down */
pum_first = pum_selected - 3;
pum_first = pum_selected - context;
if (pum_first < 0)
pum_first = 0;
}
else if (pum_first < pum_selected + 3 - pum_height + 1)
else if (pum_first < pum_selected + context - pum_height + 1)
{
/* scroll up */
pum_first = pum_selected + 3 - pum_height + 1;
pum_first = pum_selected + context - pum_height + 1;
}
}
@ -479,6 +491,12 @@ pum_set_selected(n)
if (win_valid(curwin_save))
win_enter(curwin_save, TRUE);
/* May need to update the screen again when there are
* autocommands involved. */
pum_do_redraw = TRUE;
update_screen(0);
pum_do_redraw = FALSE;
}
}
}

View File

@ -7305,6 +7305,11 @@ screenalloc(clear)
#endif
entered = FALSE;
#ifdef FEAT_AUTOCMD
if (starting == 0)
apply_autocmds(EVENT_VIMRESIZED, NULL, NULL, FALSE, curbuf);
#endif
}
void

View File

@ -24,7 +24,8 @@ SCRIPTS = test1.out test3.out test4.out test5.out test6.out \
test38.out test39.out test40.out test41.out test42.out \
test43.out test44.out test45.out test46.out test47.out \
test48.out test51.out test53.out test54.out test55.out \
test56.out test57.out test58.out test59.out test60.out
test56.out test57.out test58.out test59.out test60.out \
test61.out
.SUFFIXES: .in .out
@ -104,3 +105,4 @@ test57.out: test57.in
test58.out: test58.in
test59.out: test59.in
test60.out: test60.in
test61.out: test61.in

View File

@ -19,7 +19,7 @@ SCRIPTS16 = test1.out test19.out test20.out test22.out \
test44.out test45.out test46.out test47.out \
test48.out test51.out test53.out test54.out \
test55.out test56.out test57.out test58.out test59.out \
test60.out
test60.out test61.out
SCRIPTS = test3.out test4.out test5.out test6.out test7.out \
test8.out test9.out test11.out test13.out test14.out \

View File

@ -295,6 +295,8 @@ u_savecommon(top, bot, newbot)
if (uhp == NULL)
goto nomem;
}
else
uhp = NULL;
/*
* If we undid more than we redid, move the entry lists before and
@ -326,7 +328,7 @@ u_savecommon(top, bot, newbot)
}
}
if (p_ul < 0) /* no undo at all */
if (uhp == NULL) /* no undo at all */
{
if (old_curhead != NULL)
u_freebranch(curbuf, old_curhead, NULL);
@ -655,6 +657,10 @@ undo_time(step, sec)
int dosec = sec;
int above = FALSE;
/* First make sure the current undoable change is synced. */
if (curbuf->b_u_synced == FALSE)
u_sync();
u_newcount = 0;
u_oldcount = 0;
if (curbuf->b_ml.ml_flags & ML_EMPTY)

View File

@ -36,5 +36,5 @@
#define VIM_VERSION_NODOT "vim70aa"
#define VIM_VERSION_SHORT "7.0aa"
#define VIM_VERSION_MEDIUM "7.0aa ALPHA"
#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2006 Mar 14)"
#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2006 Mar 14, compiled "
#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2006 Mar 15)"
#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2006 Mar 15, compiled "