Compare commits

...

13 Commits

Author SHA1 Message Date
Bjorn Winckler 07831f45b2 Snapshot 28 2008-05-25 20:22:58 +02:00
Bjorn Winckler 9a69ad0d62 Open and save dialogs track the Vim pwd
Open and save dialogs will open up at the present working directory of
the key Vim process.  This can be disabled by setting the user default
"MMDialogsTrackPwd" to 0.  If disabled, these dialogs always open up at
the last location browsed to (which is the default OS X behaviour).
2008-05-25 19:22:12 +02:00
Bjorn Winckler be6ecb5d92 Set 'backspace' in the system vimrc
Add "indent,eol,start" to the 'backspace' option in $VIM/vimrc to make
the delete key behave in a more familiar way to new users.  The help
file has been update to point out this non-standard behaviour.
2008-05-25 13:35:08 +02:00
Bjorn Winckler 138be9d567 Improve "Edit" menu support in dialogs
The Edit menu items cut/copy/paste/select all/undo/redo are wired to
send the appropriate action messages (now possible with :macmenu
command) so that they may work with dialogs.  However, to make this work
100%, menus must first autoenable (which they currently do not).  This
will be addressed in a future patch.
2008-05-20 16:12:52 +02:00
Bjorn Winckler 0430474168 Coerce MacVim to work with LCC
The LCC (Logitech Control Center) comes with an input manager which
registers its own root object with the default NSConnection.  MacVim
uses the root object of the default connection to vend the frontend
object, so LCC would cause MacVim to never open any new windows.

To work around this problem the default connection is no longer used in
MacVim, instead a new connection is created and this connection is used
to vend the frontend object instead.
2008-05-20 14:40:57 +02:00
Bjorn Winckler 0f1ee64746 Fix bug in :macmenu
Menu item not found lead to bad memory access.
2008-05-19 21:34:55 +02:00
Bjorn Winckler d08cc220fd Add "File.Save All" menu item
This patch serves the secondary purpose of showing off the new feature
of being able to specify alternate menu items using the new :macmenu
command.  When the "File" menu is revealed either the "Save All" or the
"Save" item is displayed, depending on whether Alt is held or not.
2008-05-19 20:08:52 +02:00
Bjorn Winckler 04d9ab21b0 Bind "File.Close" to ":conf q"
With the introduction of ":macmenu" it is possible to bind "File.Close"
to ":conf q" and at the same time have it send the "performClose:"
action.

This patch reverts back to using ":conf q" since there were problems
with "File.Close" in conjunction with bindings to <C-\>.
2008-05-19 19:28:20 +02:00
Bjorn Winckler 9c7523e944 Change ":macmenukey" to ":macmenu"
The new command allows better control over menus with ability to specify
key equivalent, action, and wheter menu item is an alternate.  These are
specified as "key=value" pairs to allow future expansion.  The help
files have also been rewritten to reflect this change.
2008-05-19 19:09:05 +02:00
Bjorn Winckler 030d0d07ec Update help which referred to Carbon version
In particular, state that MacVim does not source $VIMRUNTIME/macmap.vim.
2008-05-19 17:40:02 +02:00
Bjorn Winckler 0578f14843 Appcast points to fixed snapshot 27 2008-05-13 19:38:58 +02:00
Bjorn Winckler 11274e43c4 Merge upstream 2008-05-12 18:00:00 +02:00
vimboss e899e2dfc7 updated for version 7.1-298 2008-05-10 19:39:08 +00:00
33 changed files with 845 additions and 328 deletions
+1
View File
@@ -193,6 +193,7 @@ SRC_UNIX = \
src/vim_icon.xbm \
src/vim_mask.xbm \
src/vimtutor \
src/gvimtutor \
src/which.sh \
src/workshop.c \
src/workshop.h \
+74 -47
View File
@@ -1,4 +1,4 @@
*gui_mac.txt* For Vim version 7.1. Last change: 2008 Mar 16
*gui_mac.txt* For Vim version 7.1. Last change: 2008 May 25
VIM REFERENCE MANUAL by Bjorn Winckler
@@ -142,6 +142,11 @@ another in MacVim. Simply search for something in one window (using "/") then
switch to another (e.g. with <D-`>) and hit <D-g> and the search will be
repeated in the new window.
*macvim-backspace* *macvim-delete*
The 'backspace' option is set in the system vimrc to make the delete key
behave in a more familiar way to new users. If you dislike this non-default
behaviour, then add the line "set backspace&" to your "~/.vimrc" file.
==============================================================================
2. Starting MacVim *macvim-start*
@@ -222,6 +227,7 @@ Here is a list of relevant dictionary entries:
KEY VALUE ~
MMAtsuiRenderer enable ATSUI renderer [bool]
MMCellWidthMultiplier width of a normal glyph in em units [float]
MMDialogsTrackPwd open/save dialogs track the Vim pwd [bool]
MMLoginShellArgument login shell parameter [string]
MMLoginShellCommand which shell to use to launch Vim [string]
MMNoFontSubstitution disable automatic font substitution [bool]
@@ -310,50 +316,79 @@ than the default?) then post them to |vim_mac|.
==============================================================================
5. Menus *macvim-menus*
*:macm* *:macmenukey*
MacVim has a special way of binding keys to menu items that differs from other
Vim GUI ports. A menu binding is called a "key equivalent" in Mac OS X
terminology, this is displayed on the right side of a menu item. The
":macmenukey" command is used to set the key equivalent of a menu item. This
command takes two parameters, the first names the menu item to bind to, the
second gives the key combination. For example: >
:macmenukey File.New\ Tab <D-t>
This sets the key equivalent of the "New Tab" menu item under the "File" menu
to Cmd+t.
Menus in Mac OS X behave slightly different from other platforms. For that
reason two new commands have been added to Vim. To understand what these
commands do you must first understand how menus work on OS X.
Note that key equivalents:
* must contain the Cmd modifier flag (<D-...>)
* take precedence over normal mappings made with ":map"
* can only be modified during startup (e.g. in .gvimrc)
Each entry in a menu is called a "menu item". With each menu item is
associated: a title, a key equivalent and an action message. When a menu is
displayed the title is shown on the left and the key equivalent (if any) is
shown on the right. Key equivalents enable you to access a menu item using
the keyboard instead of having to use the mouse. When a menu item is clicked
it will send it's associated action message. Actions can be used to instruct
MacVim to paste some text (paste:), open a new window (newWindow:), etc.
Certain actions are standard throughout OS X which is why MacVim must be able
to set these for each menu item. (E.g. the menu item "Edit.Paste" must be
bound to the action "paste:" otherwise pasting won't work in dialogs since
that is the action that instructs them to paste something.)
It is possible to reset a key equivalent by calling :macmenukey with a menu
name but no key. This is so that the default key equivalents can be reset in
"~/.gvimrc". For example, if you would like to free up <D-s> (which is the
key equivalent of "File.Save") then add the following line to "~/.gvimrc": >
macmenukey File.Save
Now you can use :map to bind <D-s> to whatever you like.
Menus are configured using the |:macmenu| command and the |:macaction| command
can be used to send action messages.
It is not necessary to reset a key equivalent if all you want to do is to
change the key equivalent of a menu item. For example, say you want to use
<D-M-Right> as the key equivalent for "Next Tab", then add the following line
to "~/.gvimrc": >
macmenukey Window.Next\ Tab <D-M-Right>
<
*:maca* *:macaction*
It is typical for menu items in Cocoa applications to bind to Objective-C
selectors. To support this, MacVim introduces the |:macaction| command. This
command takes the name of an action message as its only parameter. (An action
message is an Objective-C message with "void" return type and a single
parameter of type "id".) For example, the "New Window" menu item on the
"File" menu is created in the following manner: >
:an 10.290 File.New\ Window :macaction newWindow:<CR>
:maca[ction] {action:} Send the message "action:" to the first responder.
The list of allowed actions can be seen by typing
:maca <C-d>
An attempt to send an action not listed here will
result in an error. This list is specified in a
property list file called |Actions.plist|.
Note 1: A menu item which is bound to |:macaction| will automatically be bound
to that action in all modes (as if ":an" was used). It is not possible to
bind to |:macaction| in one mode only.
Note 2: The action is "nil-targeted", which means it is passed down the first
responder chain.
*:macm* *:macmenu*
:mac[menu] {menu} {key}={arg} ...
Set Mac specific properties for {menu}. The
properties that can be set are:
action the action this menu sends
alt "yes" if alternate of previous menu
key the key equivalent of this menu
This command must be used in a startup file, for
example in "~/.gvimrc". It has no effect otherwise.
For convenience, a menu with "action=name:" which is
bound to <Nop> will act as if bound to
":maca name:<CR>". Thus, if "Menu.Item" is given by
:an Menu.Item <Nop>
:macm Menu.Item action=name:
then ":emenu Menu.Item" is equivalent to
":maca name:".
The key equivalent is specified with the <D-..>
syntax. Note that key equivalents must contain the
Cmd modifier flag (<D-...>), and they take precedence
over normal mappings.
Use the syntax "key=<nop>" to clear the key equivalent
of a menu. This can be used to free up a key
combination that is set in the system gvimrc so that
it may be mapped to using ":map".
Recognised values of "alt" are "0", "no", "1", and
"yes". The default is "no". An alternate menu must
have the same key equivalent as the previous menu,
except the modifier flags must differ. The alternate
menu is by default hidden and only shows up when the
modifier is held down.
Here are some examples on how to use these commands:
1. Create a menu item with title "New Window" under the "File" menu, with key
equivalent Cmd-n, which opens a new window when selected: >
:an 10.290 File.New\ Window <Nop>
:macm File.New\ Window action=newWindow: key=<D-n>
2. Change the key equivalent to cycle through tabs to Cmd-Left/Right: >
:macm Window.Previous\ Tab key=<D-Left>
:macm Window.Next\ Tab key=<D-Right>
3. Create a mapping in normal mode which closes the current tab/window: >
:map <C-w> :maca performClose:<CR>
>
*Actions.plist*
Some action messages would not be suitable to call from within Vim, so there
is a dictionary called "Actions.plist" (in the Resources folder of the
@@ -381,14 +416,6 @@ performZoom: Zoom window (same as clicking the green blob)
selectNextWindow: Select next window (similar to <D-`>)
selectPreviousWindow: Select previous window (similar to <S-D-`>)
As an example, to map <C-z> to performZoom: you could do something like this: >
:map <silent> <C-z> :macaction performZoom:<CR>
A better way to map to performZoom: would be to set the key equivalent of the
menu item "Window.Zoom" to the above action. This can be done by adding the
following line to "~/.gvimrc": >
macmenukey Window.Zoom <D-C-z>
(Note that key equivalents must contain the 'D' flag.)
==============================================================================
6. Toolbar *macvim-toolbar*
+1 -1
View File
@@ -1289,7 +1289,7 @@ The commands are sorted on the non-optional part of their name.
|:move| :m[ove] move lines
|:mark| :ma[rk] set a mark
|:macation| :maca[ction] send action message
|:macmenukey| :macm[eyequiv] set key equivalent for menu item
|:macmenu| :macm[enu] set Mac specific properties for menu item
|:make| :mak[e] execute external command 'makeprg' and parse
error messages
|:map| :map show or enter a mapping
+7 -3
View File
@@ -1,4 +1,4 @@
*os_mac.txt* For Vim version 7.1. Last change: 2006 Apr 30
*os_mac.txt* For Vim version 7.1. Last change: 2008 May 19
VIM REFERENCE MANUAL by Bram Moolenaar et al.
@@ -6,9 +6,13 @@
*mac* *Mac* *macintosh* *Macintosh*
This file documents the particularities of the Macintosh version of Vim.
This file documents the particularities of the Mac version of Vim. It was
written with the older Carbon version of Vim in mind. If you are using the
newer MacVim.app then please go to |macvim|. Some of the information here
does not apply to MacVim.app.
NOTE: This file is a bit outdated. You might find more useful info here:
NOTE: This file is a bit outdated. You might find more useful info on the old
Carbon version of Vim here:
http://macvim.org/
1. Filename Convention |mac-filename|
+2 -1
View File
@@ -766,7 +766,8 @@ accordingly. Vim proceeds in this order:
Note that this file is ALWAYS read in 'compatible' mode, since the
automatic resetting of 'compatible' is only done later. Add a ":set
nocp" command if you like.
For the Macintosh the $VIMRUNTIME/macmap.vim is read.
For the Macintosh the $VIMRUNTIME/macmap.vim is read (not on
MacVim.app, this only applies to the older Carbon version).
*VIMINIT* *.vimrc* *_vimrc* *EXINIT* *.exrc* *_exrc*
c. Four places are searched for initializations. The first that exists
+2
View File
@@ -1177,6 +1177,8 @@ goes from 2.2 to 2.3. (Gordon Prieur)
Mac: When starting up Vim will load the $VIMRUNTIME/macmap.vim script to
define default command-key mappings. (mostly by Benji Fisher)
This only applies to the older Carbon version of Vim, MacVim.app does not
source this file.
Mac: Add the selection type to the clipboard, so that Block, line and
character selections can be used between two Vims. (Eckehard Berns)
+13 -1
View File
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>addNewTab:</key>
@@ -8,6 +8,10 @@
<string></string>
<key>clearRecentDocuments:</key>
<string></string>
<key>copy:</key>
<string></string>
<key>cut:</key>
<string></string>
<key>fileOpen:</key>
<string></string>
<key>findNext:</key>
@@ -34,6 +38,8 @@
<string></string>
<key>orderFrontPreferencePanel:</key>
<string></string>
<key>paste:</key>
<string></string>
<key>performClose:</key>
<string></string>
<key>performMiniaturize:</key>
@@ -42,12 +48,18 @@
<string></string>
<key>recentFilesDummy:</key>
<string></string>
<key>redo:</key>
<string></string>
<key>selectAll:</key>
<string></string>
<key>selectNextWindow:</key>
<string></string>
<key>selectPreviousWindow:</key>
<string></string>
<key>terminate:</key>
<string></string>
<key>undo:</key>
<string></string>
<key>unhide:</key>
<string></string>
<key>unhideAllApplications:</key>
+1 -1
View File
@@ -545,7 +545,7 @@
<key>CFBundleSignature</key>
<string>VIMM</string>
<key>CFBundleVersion</key>
<string>27</string>
<string>28</string>
<key>NSMainNibFile</key>
<string>MainMenu</string>
<key>NSPrincipalClass</key>
+1
View File
@@ -16,6 +16,7 @@
@interface MMAppController : NSObject <MMAppProtocol> {
NSConnection *connection;
NSMutableArray *vimControllers;
NSString *openSelectionString;
ATSFontContainerRef fontContainerRef;
+32 -17
View File
@@ -124,6 +124,7 @@ static int executeInLoginShell(NSString *path, NSArray *args);
[NSNumber numberWithBool:NO], MMZoomBothKey,
@"", MMLoginShellCommandKey,
@"", MMLoginShellArgumentKey,
[NSNumber numberWithBool:YES], MMDialogsTrackPwdKey,
nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:dict];
@@ -140,24 +141,30 @@ static int executeInLoginShell(NSString *path, NSArray *args);
vimControllers = [NSMutableArray new];
pidArguments = [NSMutableDictionary new];
// NOTE: Do not use the default connection since the Logitech Control
// Center (LCC) input manager steals and this would cause MacVim to
// never open any windows. (This is a bug in LCC but since they are
// unlikely to fix it, we graciously give them the default connection.)
connection = [[NSConnection alloc] initWithReceivePort:[NSPort port]
sendPort:nil];
[connection setRootObject:self];
[connection setRequestTimeout:MMRequestTimeout];
[connection setReplyTimeout:MMReplyTimeout];
// NOTE: When the user is resizing the window the AppKit puts the run
// loop in event tracking mode. Unless the connection listens to
// request in this mode, live resizing won't work.
[connection addRequestMode:NSEventTrackingRunLoopMode];
// NOTE! If the name of the connection changes here it must also be
// updated in MMBackend.m.
NSConnection *connection = [NSConnection defaultConnection];
NSString *name = [NSString stringWithFormat:@"%@-connection",
[[NSBundle mainBundle] bundleIdentifier]];
//NSLog(@"Registering connection with name '%@'", name);
if ([connection registerName:name]) {
[connection setRequestTimeout:MMRequestTimeout];
[connection setReplyTimeout:MMReplyTimeout];
[connection setRootObject:self];
// NOTE: When the user is resizing the window the AppKit puts the
// run loop in event tracking mode. Unless the connection listens
// to request in this mode, live resizing won't work.
[connection addRequestMode:NSEventTrackingRunLoopMode];
} else {
NSLog(@"WARNING: Failed to register connection with name '%@'",
if (![connection registerName:name]) {
NSLog(@"FATAL ERROR: Failed to register connection with name '%@'",
name);
[connection release]; connection = nil;
}
}
@@ -168,6 +175,7 @@ static int executeInLoginShell(NSString *path, NSArray *args);
{
//NSLog(@"MMAppController dealloc");
[connection release]; connection = nil;
[pidArguments release]; pidArguments = nil;
[vimControllers release]; vimControllers = nil;
[openSelectionString release]; openSelectionString = nil;
@@ -456,9 +464,9 @@ static int executeInLoginShell(NSString *path, NSArray *args);
andEventID:'MOD '];
#endif
// This will invalidate all connections (since they were spawned from the
// default connection).
[[NSConnection defaultConnection] invalidate];
// This will invalidate all connections (since they were spawned from this
// connection).
[connection invalidate];
// Send a SIGINT to all running Vim processes, so that they are sure to
// receive the connectionDidDie: notification (a process has to be checking
@@ -547,10 +555,17 @@ static int executeInLoginShell(NSString *path, NSArray *args);
- (IBAction)fileOpen:(id)sender
{
NSString *dir = nil;
BOOL trackPwd = [[NSUserDefaults standardUserDefaults]
boolForKey:MMDialogsTrackPwdKey];
if (trackPwd) {
MMVimController *vc = [self keyVimController];
if (vc) dir = [[vc vimState] objectForKey:@"pwd"];
}
NSOpenPanel *panel = [NSOpenPanel openPanel];
[panel setAllowsMultipleSelection:YES];
int result = [panel runModalForTypes:nil];
int result = [panel runModalForDirectory:dir file:nil types:nil];
if (NSOKButton == result)
[self application:NSApp openFiles:[panel filenames]];
}
+46 -4
View File
@@ -27,6 +27,7 @@
#import "MMAtsuiTextView.h"
#import "MMVimController.h"
#import "MMWindowController.h"
#import "MacVim.h"
@@ -65,6 +66,7 @@ enum {
- (void)updateAtsuStyles;
- (void)dispatchKeyEvent:(NSEvent *)event;
- (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags;
- (MMWindowController *)windowController;
- (MMVimController *)vimController;
@end
@@ -726,6 +728,42 @@ enum {
[[self vimController] sendMessage:ScrollWheelMsgID data:data];
}
//
// NOTE: The menu items cut/copy/paste/undo/redo/select all/... must be bound
// to the same actions as in IB otherwise they will not work with dialogs. All
// we do here is forward these actions to the Vim process.
//
- (IBAction)cut:(id)sender
{
[[self windowController] vimMenuItemAction:sender];
}
- (IBAction)copy:(id)sender
{
[[self windowController] vimMenuItemAction:sender];
}
- (IBAction)paste:(id)sender
{
[[self windowController] vimMenuItemAction:sender];
}
- (IBAction)undo:(id)sender
{
[[self windowController] vimMenuItemAction:sender];
}
- (IBAction)redo:(id)sender
{
[[self windowController] vimMenuItemAction:sender];
}
- (IBAction)selectAll:(id)sender
{
[[self windowController] vimMenuItemAction:sender];
}
@end // MMAtsuiTextView
@@ -875,13 +913,17 @@ enum {
}
}
- (MMVimController *)vimController
- (MMWindowController *)windowController
{
id windowController = [[self window] windowController];
if ([windowController isKindOfClass:[MMWindowController class]])
return (MMWindowController*)windowController;
return nil;
}
// TODO: Make sure 'windowController' is a MMWindowController before type
// casting.
return [(MMWindowController*)windowController vimController];
- (MMVimController *)vimController
{
return [[self windowController] vimController];
}
@end // MMAtsuiTextView (Private)
+2 -1
View File
@@ -89,7 +89,8 @@
- (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name
tip:(char *)tip icon:(char *)icon
keyEquivalent:(int)key modifiers:(int)mods
action:(NSString *)action atIndex:(int)index;
action:(char *)action isAlternate:(int)isAlt
atIndex:(int)index;
- (void)removeMenuItemWithTag:(int)tag;
- (void)enableMenuItemWithTag:(int)tag state:(int)enabled;
- (void)showPopupMenuWithName:(char *)name atMouseLocation:(BOOL)mouse;
+27 -22
View File
@@ -77,6 +77,7 @@ static NSString *MMSymlinkWarningString =
@interface MMBackend (Private)
- (void)queueVimStateMessage;
- (void)processInputQueue;
- (void)handleInputEvent:(int)msgid data:(NSData *)data;
+ (NSDictionary *)specialKeys;
@@ -462,7 +463,12 @@ static NSString *MMSymlinkWarningString =
[drawData setLength:0];
}
if ([outputQueue count] > 0) {
if ([outputQueue count] > 0 || force) {
// When 'force' is set we always update the Vim state to ensure that
// MacVim has a copy of the latest state (since 'force' is typically
// set just before Vim takes a nap whilst waiting for input).
[self queueVimStateMessage];
@try {
[frontendProxy processCommandQueue:outputQueue];
}
@@ -755,7 +761,8 @@ static NSString *MMSymlinkWarningString =
- (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name
tip:(char *)tip icon:(char *)icon
keyEquivalent:(int)key modifiers:(int)mods
action:(NSString *)action atIndex:(int)index
action:(char *)action isAlternate:(int)isAlt
atIndex:(int)index
{
//NSLog(@"addMenuItemWithTag:%d parent:%d name:%s tip:%s atIndex:%d", tag,
// parentTag, name, tip, index);
@@ -764,7 +771,7 @@ static NSString *MMSymlinkWarningString =
int tiplen = tip ? strlen(tip) : 0;
int iconlen = icon ? strlen(icon) : 0;
int eventFlags = vimModMaskToEventModifierFlags(mods);
int actionlen = [action lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
int actionlen = action ? strlen(action) : 0;
NSMutableData *data = [NSMutableData data];
key = specialKeyToNSKey(key);
@@ -778,10 +785,11 @@ static NSString *MMSymlinkWarningString =
[data appendBytes:&iconlen length:sizeof(int)];
if (iconlen > 0) [data appendBytes:icon length:iconlen];
[data appendBytes:&actionlen length:sizeof(int)];
if (actionlen > 0) [data appendBytes:[action UTF8String] length:actionlen];
if (actionlen > 0) [data appendBytes:action length:actionlen];
[data appendBytes:&index length:sizeof(int)];
[data appendBytes:&key length:sizeof(int)];
[data appendBytes:&eventFlags length:sizeof(int)];
[data appendBytes:&isAlt length:sizeof(int)];
[self queueMessage:AddMenuItemMsgID data:data];
}
@@ -1553,6 +1561,21 @@ static NSString *MMSymlinkWarningString =
@implementation MMBackend (Private)
- (void)queueVimStateMessage
{
// NOTE: This is the place to add Vim state that needs to be accessed from
// MacVim. Do not add state that could potentially require lots of memory
// since this message gets sent each time the output queue is forcibly
// flushed (e.g. storing the currently selected text would be a bad idea).
// We take this approach of "pushing" the state to MacVim to avoid having
// to make synchronous calls from MacVim to Vim in order to get state.
NSDictionary *vimState = [NSDictionary dictionaryWithObjectsAndKeys:
[[NSFileManager defaultManager] currentDirectoryPath], @"pwd",
nil];
[self queueMessage:SetVimStateMsgID data:[vimState dictionaryAsData]];
}
- (void)processInputQueue
{
// NOTE: One of the input events may cause this method to be called
@@ -1663,24 +1686,6 @@ static NSString *MMSymlinkWarningString =
[self handleOdbEdit:data];
} else if (XcodeModMsgID == msgid) {
[self handleXcodeMod:data];
} else if (CloseMsgID == msgid) {
// If in Ex mode, then simply exit Ex mode (^U:vi<CR>). Otherwise
// try to close one (Vim-)window by going to Normal mode first
// (CTRL-\_CTRL-N) and then sending ":q<CR>", but only if the
// command-line window is not open. If the command-line window is open
// then we just go back to normal mode (since CTRL-\_CTRL-N closes the
// command-line window).
if (exmode_active) {
// Exit Ex mode
add_to_input_buf((char_u*)"\x15:vi\n", 5);
} else {
// Go to normal mode
add_to_input_buf((char_u*)"\x1c\xe", 2);
if (0 == cmdwin_type) {
// Command-line window was not open, so :q
add_to_input_buf((char_u*)":conf q\n", 8);
}
}
} else {
NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid);
}
+45 -4
View File
@@ -51,6 +51,7 @@ enum {
- (BOOL)convertRow:(int)row column:(int)column toPoint:(NSPoint *)point;
- (NSRect)trackingRect;
- (void)dispatchKeyEvent:(NSEvent *)event;
- (MMWindowController *)windowController;
- (MMVimController *)vimController;
- (void)startDragTimerWithInterval:(NSTimeInterval)t;
- (void)dragTimerFired:(NSTimer *)timer;
@@ -1119,6 +1120,42 @@ enum {
// The font panel is updated whenever the font is set.
}
//
// NOTE: The menu items cut/copy/paste/undo/redo/select all/... must be bound
// to the same actions as in IB otherwise they will not work with dialogs. All
// we do here is forward these actions to the Vim process.
//
- (IBAction)cut:(id)sender
{
[[self windowController] vimMenuItemAction:sender];
}
- (IBAction)copy:(id)sender
{
[[self windowController] vimMenuItemAction:sender];
}
- (IBAction)paste:(id)sender
{
[[self windowController] vimMenuItemAction:sender];
}
- (IBAction)undo:(id)sender
{
[[self windowController] vimMenuItemAction:sender];
}
- (IBAction)redo:(id)sender
{
[[self windowController] vimMenuItemAction:sender];
}
- (IBAction)selectAll:(id)sender
{
[[self windowController] vimMenuItemAction:sender];
}
@end // MMTextView
@@ -1259,13 +1296,17 @@ enum {
[self sendKeyDown:bytes length:len modifiers:mods];
}
- (MMVimController *)vimController
- (MMWindowController *)windowController
{
id windowController = [[self window] windowController];
if ([windowController isKindOfClass:[MMWindowController class]])
return (MMWindowController*)windowController;
return nil;
}
// TODO: Make sure 'windowController' is a MMWindowController before type
// casting.
return [(MMWindowController*)windowController vimController];
- (MMVimController *)vimController
{
return [[self windowController] vimController];
}
- (void)startDragTimerWithInterval:(NSTimeInterval)t
+2
View File
@@ -42,6 +42,7 @@
NSMenu *lastMenuSearched;
NSMenuItem *recentFilesMenuItem;
NSMenuItem *recentFilesDummy;
NSDictionary *vimState;
}
- (id)initWithBackend:(id)backend pid:(int)processIdentifier
@@ -51,6 +52,7 @@
- (void)setServerName:(NSString *)name;
- (NSString *)serverName;
- (MMWindowController *)windowController;
- (NSDictionary *)vimState;
- (void)cleanup;
- (void)dropFiles:(NSArray *)filenames forceOpen:(BOOL)force;
- (void)dropString:(NSString *)string;
+28 -3
View File
@@ -70,7 +70,8 @@ static NSTimeInterval MMResendInterval = 0.5;
- (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent
title:(NSString *)title tip:(NSString *)tip
keyEquivalent:(int)key modifiers:(int)mask
action:(NSString *)action atIndex:(int)idx;
action:(NSString *)action isAlternate:(int)isAlt
atIndex:(int)idx;
- (NSToolbarItem *)toolbarItemForTag:(int)tag index:(int *)index;
- (void)addToolbarItemToDictionaryWithTag:(int)tag label:(NSString *)title
toolTip:(NSString *)tip icon:(NSString *)icon;
@@ -151,6 +152,11 @@ static NSTimeInterval MMResendInterval = 0.5;
return windowController;
}
- (NSDictionary *)vimState
{
return vimState;
}
- (void)setServerName:(NSString *)name
{
if (name != serverName) {
@@ -390,6 +396,15 @@ static NSTimeInterval MMResendInterval = 0.5;
{
if (!isInitialized) return;
if (!dir) {
// 'dir == nil' means: set dir to the pwd of the Vim process, or let
// open dialog decide (depending on the below user default).
BOOL trackPwd = [[NSUserDefaults standardUserDefaults]
boolForKey:MMDialogsTrackPwdKey];
if (trackPwd)
dir = [vimState objectForKey:@"pwd"];
}
if (saving) {
[[NSSavePanel savePanel] beginSheetForDirectory:dir file:nil
modalForWindow:[windowController window]
@@ -705,6 +720,7 @@ static NSTimeInterval MMResendInterval = 0.5;
if (idx < 0) idx = 0;
int key = *((int*)bytes); bytes += sizeof(int);
int mask = *((int*)bytes); bytes += sizeof(int);
int isalt = *((int*)bytes); bytes += sizeof(int);
NSString *ident = [NSString stringWithFormat:@"%d.%d",
(int)self, parentTag];
@@ -715,7 +731,7 @@ static NSTimeInterval MMResendInterval = 0.5;
NSMenu *parent = [self menuForTag:parentTag];
[self addMenuItemWithTag:tag parent:parent title:title tip:tip
keyEquivalent:key modifiers:mask action:action
atIndex:idx];
isAlternate:isalt atIndex:idx];
}
[title release];
@@ -914,6 +930,12 @@ static NSTimeInterval MMResendInterval = 0.5;
[[[windowController vimView] textView] setAntialias:YES];
} else if (DisableAntialiasMsgID == msgid) {
[[[windowController vimView] textView] setAntialias:NO];
} else if (SetVimStateMsgID == msgid) {
NSDictionary *dict = [NSDictionary dictionaryWithData:data];
if (dict) {
[vimState release];
vimState = [dict retain];
}
} else {
NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid);
}
@@ -1086,7 +1108,8 @@ static NSTimeInterval MMResendInterval = 0.5;
- (void)addMenuItemWithTag:(int)tag parent:(NSMenu *)parent
title:(NSString *)title tip:(NSString *)tip
keyEquivalent:(int)key modifiers:(int)mask
action:(NSString *)action atIndex:(int)idx
action:(NSString *)action isAlternate:(int)isAlt
atIndex:(int)idx
{
if (parent) {
NSMenuItem *item = nil;
@@ -1117,6 +1140,8 @@ static NSTimeInterval MMResendInterval = 0.5;
[item setKeyEquivalent:keyString];
[item setKeyEquivalentModifierMask:mask];
}
if (isAlt) [item setAlternate:YES];
}
}
+1
View File
@@ -68,5 +68,6 @@
- (IBAction)performClose:(id)sender;
- (IBAction)findNext:(id)sender;
- (IBAction)findPrevious:(id)sender;
- (IBAction)vimMenuItemAction:(id)sender;
@end
+16 -14
View File
@@ -76,7 +76,6 @@
- (NSSize)constrainContentSizeToScreenSize:(NSSize)contentSize;
- (void)updateResizeConstraints;
- (NSTabViewItem *)addNewTabViewItem;
- (IBAction)vimMenuItemAction:(id)sender;
- (BOOL)askBackendForStarRegister:(NSPasteboard *)pb;
- (void)hideTablineSeparator:(BOOL)hide;
- (void)doFindNext:(BOOL)next;
@@ -595,9 +594,12 @@
- (IBAction)performClose:(id)sender
{
// NOTE: File->Close is bound to this action message so that File->Close
// also works for auxiliary windows such as the About dialog.
[vimController sendMessage:CloseMsgID data:nil];
// NOTE: With the introduction of :macmenu it is possible to bind
// File.Close to ":conf q" but at the same time have it send off the
// performClose: action. For this reason we no longer need the CloseMsgID
// message. However, we still need File.Close to send performClose:
// otherwise Cmd-w will not work on dialogs.
[self vimMenuItemAction:sender];
}
- (IBAction)findNext:(id)sender
@@ -610,6 +612,16 @@
[self doFindNext:NO];
}
- (IBAction)vimMenuItemAction:(id)sender
{
int tag = [sender tag];
NSMutableData *data = [NSMutableData data];
[data appendBytes:&tag length:sizeof(int)];
[vimController sendMessage:ExecuteMenuMsgID data:data];
}
// -- NSWindow delegate ------------------------------------------------------
@@ -781,16 +793,6 @@
return [vimView addNewTabViewItem];
}
- (IBAction)vimMenuItemAction:(id)sender
{
int tag = [sender tag];
NSMutableData *data = [NSMutableData data];
[data appendBytes:&tag length:sizeof(int)];
[vimController sendMessage:ExecuteMenuMsgID data:data];
}
- (BOOL)askBackendForStarRegister:(NSPasteboard *)pb
{
// TODO: Can this be done with evaluateExpression: instead?
+10 -1
View File
@@ -162,7 +162,7 @@ enum {
LiveResizeMsgID,
EnableAntialiasMsgID,
DisableAntialiasMsgID,
CloseMsgID,
SetVimStateMsgID,
};
@@ -227,6 +227,7 @@ extern NSString *MMZoomBothKey;
extern NSString *MMCurrentPreferencePaneKey;
extern NSString *MMLoginShellCommandKey;
extern NSString *MMLoginShellArgumentKey;
extern NSString *MMDialogsTrackPwdKey;
// Enum for MMUntitledWindowKey
enum {
@@ -284,6 +285,14 @@ NSString *buildSearchTextCommand(NSString *searchText);
@interface NSDictionary (MMExtras)
+ (id)dictionaryWithData:(NSData *)data;
- (NSData *)dictionaryAsData;
@end
// ODB Editor Suite Constants (taken from ODBEditorSuite.h)
#define keyFileSender 'FSnd'
#define keyFileSenderToken 'FTok'
+25 -1
View File
@@ -75,7 +75,7 @@ char *MessageStrings[] =
"LiveResizeMsgID",
"EnableAntialiasMsgID",
"DisableAntialiasMsgID",
"CloseMsgID",
"SetVimStateMsgID",
};
@@ -107,6 +107,7 @@ NSString *MMZoomBothKey = @"MMZoomBoth";
NSString *MMCurrentPreferencePaneKey = @"MMCurrentPreferencePane";
NSString *MMLoginShellCommandKey = @"MMLoginShellCommand";
NSString *MMLoginShellArgumentKey = @"MMLoginShellArgument";
NSString *MMDialogsTrackPwdKey = @"MMDialogsTrackPwd";
@@ -308,3 +309,26 @@ buildSearchTextCommand(NSString *searchText)
@end // NSDocumentController (MMExtras)
@implementation NSDictionary (MMExtras)
+ (id)dictionaryWithData:(NSData *)data
{
id plist = [NSPropertyListSerialization
propertyListFromData:data
mutabilityOption:NSPropertyListImmutable
format:NULL
errorDescription:NULL];
return [plist isKindOfClass:[NSDictionary class]] ? plist : nil;
}
- (NSData *)dictionaryAsData
{
return [NSPropertyListSerialization dataFromPropertyList:self
format:NSPropertyListBinaryFormat_v1_0 errorDescription:NULL];
}
@end
+3 -3
View File
@@ -698,7 +698,7 @@
i386,
);
COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 27;
CURRENT_PROJECT_VERSION = 28;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)",
@@ -739,7 +739,7 @@
buildSettings = {
ARCHS = "$(NATIVE_ARCH)";
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 27;
CURRENT_PROJECT_VERSION = 28;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)",
@@ -770,7 +770,7 @@
buildSettings = {
ARCHS = "$(NATIVE_ARCH)";
COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 27;
CURRENT_PROJECT_VERSION = 28;
FRAMEWORK_SEARCH_PATHS = (
"$(inherited)",
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)",
+28 -32
View File
@@ -32,7 +32,6 @@ static float MMMaxFontSize = 100.0f;
static NSFont *gui_macvim_font_with_name(char_u *name);
static BOOL gui_macvim_is_valid_action(NSString *action);
@@ -655,33 +654,16 @@ gui_mch_add_menu_item(vimmenu_T *menu, int idx)
char_u *tip = menu->strings[MENU_INDEX_TIP]
? menu->strings[MENU_INDEX_TIP] : menu->actext;
char_u *map_str = menu->strings[MENU_INDEX_NORMAL];
char_u *mac_action = menu->mac_action;
#ifdef FEAT_MBYTE
icon = CONVERT_TO_UTF8(icon);
name = CONVERT_TO_UTF8(name);
tip = CONVERT_TO_UTF8(tip);
map_str = CONVERT_TO_UTF8(map_str);
mac_action = CONVERT_TO_UTF8(mac_action);
#endif
// HACK! Check if menu is mapped to ':macaction actionName:'; if so, pass
// the action along so that MacVim can bind the menu item to this action.
// This means that if a menu item maps to an action in normal mode, then
// all other modes will also use the same action.
NSString *action = nil;
if (map_str) {
NSString *mapping = [NSString stringWithCString:(char*)map_str
encoding:NSUTF8StringEncoding];
NSArray *parts = [mapping componentsSeparatedByString:@" "];
if ([parts count] >=2
&& [[parts objectAtIndex:0] hasPrefix:@":maca"]) {
action = [parts objectAtIndex:1];
action = [action stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if (!gui_macvim_is_valid_action(action))
action = nil;
}
}
[[MMBackend sharedInstance]
addMenuItemWithTag:(int)menu
parent:(int)menu->parent
@@ -690,7 +672,8 @@ gui_mch_add_menu_item(vimmenu_T *menu, int idx)
icon:(char*)icon
keyEquivalent:menu->mac_key
modifiers:menu->mac_mods
action:action
action:(char*)mac_action
isAlternate:menu->mac_alternate
atIndex:idx];
#ifdef FEAT_MBYTE
@@ -698,6 +681,7 @@ gui_mch_add_menu_item(vimmenu_T *menu, int idx)
CONVERT_TO_UTF8_FREE(name);
CONVERT_TO_UTF8_FREE(tip);
CONVERT_TO_UTF8_FREE(map_str);
CONVERT_TO_UTF8_FREE(mac_action);
#endif
}
@@ -1203,12 +1187,12 @@ ex_macaction(eap)
arg = CONVERT_TO_UTF8(arg);
#endif
NSString *name = [NSString stringWithCString:(char*)arg
encoding:NSUTF8StringEncoding];
if (gui_macvim_is_valid_action(name)) {
NSDictionary *actionDict = [[MMBackend sharedInstance] actionDict];
NSString *name = [NSString stringWithUTF8String:(char*)arg];
if (actionDict && [actionDict objectForKey:name] != nil) {
[[MMBackend sharedInstance] executeActionWithName:name];
} else {
EMSG2(_("E???: \"%s\" is not a valid action"), eap->arg);
EMSG2(_("E???: Invalid action: %s"), eap->arg);
}
#ifdef FEAT_MBYTE
@@ -1513,13 +1497,6 @@ gui_mch_toggle_tearoffs(int enable)
}
static BOOL
gui_macvim_is_valid_action(NSString *action)
{
NSDictionary *actionDict = [[MMBackend sharedInstance] actionDict];
return actionDict && [actionDict objectForKey:action] != nil;
}
void
gui_mch_enter_fullscreen(int fuoptions_flags, guicolor_T bg)
@@ -1890,3 +1867,22 @@ get_macaction_name(expand_T *xp, int idx)
return plainStr;
}
int
is_valid_macaction(char_u *action)
{
int isValid = NO;
NSDictionary *actionDict = [[MMBackend sharedInstance] actionDict];
if (actionDict) {
#ifdef FEAT_MBYTE
action = CONVERT_TO_UTF8(action);
#endif
NSString *string = [NSString stringWithUTF8String:(char*)action];
isValid = (nil != [actionDict objectForKey:string]);
#ifdef FEAT_MBYTE
CONVERT_TO_UTF8_FREE(action);
#endif
}
return isValid;
}
+65 -60
View File
@@ -1,7 +1,7 @@
" System gvimrc file for MacVim
"
" Maintainer: Bjorn Winckler <bjorn.winckler@gmail.com>
" Last Change: Sat May 10 2008
" Last Change: Sun May 19 2008
"
" This is a work in progress. If you feel so inclined, please help me improve
" this file.
@@ -42,14 +42,15 @@ aunmenu File.-SEP4-
aunmenu File.Exit
aunmenu File.Save-Exit
an <silent> 10.290 File.New\ Window :maca newWindow:<CR>
an <silent> 10.290 File.New\ Window <Nop>
an 10.295 File.New\ Tab :tabnew<CR>
an <silent> 10.310 File.&Open\.\.\. :maca fileOpen:<CR>
an <silent> 10.325 File.Open\ Recent :maca recentFilesDummy:<CR>
an <silent> 10.310 File.Open\.\.\. <Nop>
an <silent> 10.325 File.Open\ Recent <Nop>
an 10.328 File.-SEP0- <Nop>
an <silent> 10.330 File.Close\ Window<Tab>:qa :confirm qa<CR>
an <silent> 10.331 File.Close :maca performClose:<CR>
"an 10.331 File.Close\ Tab :tabclose<CR>
an <silent> 10.330 File.Close\ Window<Tab>:qa :conf qa<CR>
an <silent> 10.332 File.Close :conf q<CR>
an <silent> 10.341 File.Save\ All :browse conf wa<CR>
an 10.350 File.Save\ As\.\.\.<Tab>:sav :browse confirm saveas<CR>
" Edit menu
@@ -58,8 +59,8 @@ aunmenu Edit.Find
aunmenu Edit.Find\ and\ Replace
an 20.410.10 Edit.Find.Find\.\.\.<Tab>/ /
an 20.410.20 Edit.Find.Find\ Next :maca findNext:<CR>
an 20.410.30 Edit.Find.Find\ Previous :maca findPrevious:<CR>
an 20.410.20 Edit.Find.Find\ Next <Nop>
an 20.410.30 Edit.Find.Find\ Previous <Nop>
vmenu 20.410.35 Edit.Find.Use\ Selection\ for\ Find y:let @/=@"<CR>n
an 20.410.40 Edit.Find.-SEP1- <Nop>
an 20.410.50 Edit.Find.Find\ and\ Replace\.\.\.<Tab>:%s :%s/
@@ -67,30 +68,30 @@ vunmenu Edit.Find.Find\ and\ Replace\.\.\.<Tab>:%s
vnoremenu Edit.Find.Find\ and\ Replace\.\.\.<Tab>:s :s/
an 20.460 Edit.-SEP4- <Nop>
an 20.465.10 Edit.Font.Show\ Fonts :maca orderFrontFontPanel:<CR>
an 20.465.10 Edit.Font.Show\ Fonts <Nop>
an 20.465.20 Edit.Font.-SEP5- <Nop>
an 20.465.30 Edit.Font.Bigger :maca fontSizeUp:<CR>
an 20.465.40 Edit.Font.Smaller :maca fontSizeDown:<CR>
an 20.470 Edit.Special\ Characters\.\.\. :maca orderFrontCharacterPalette:<CR>
an 20.465.30 Edit.Font.Bigger <Nop>
an 20.465.40 Edit.Font.Smaller <Nop>
an 20.470 Edit.Special\ Characters\.\.\. <Nop>
" Window menu (should be next to Help so give it a high priority)
aunmenu Window
an <silent> 9900.300 Window.Minimize :maca performMiniaturize:<CR>
an <silent> 9900.310 Window.Zoom :maca performZoom:<CR>
an <silent> 9900.300 Window.Minimize <Nop>
an <silent> 9900.310 Window.Zoom <Nop>
an <silent> 9900.320 Window.Toggle\ Full\ Screen\ Mode :set invfullscreen<CR>
an 9900.330 Window.-SEP1- <Nop>
" TODO! Grey out if no tabs are visible.
an <silent> 9900.340 Window.Previous\ Tab :tabprevious<CR>
an <silent> 9900.350 Window.Next\ Tab :tabnext<CR>
an 9900.360 Window.-SEP2- <Nop>
an <silent> 9900.370 Window.Bring\ All\ To\ Front :maca arrangeInFront:<CR>
an <silent> 9900.370 Window.Bring\ All\ To\ Front <Nop>
" Help menu
an 9999.1 Help.MacVim\ Help :h gui_mac<CR>
an <silent> 9999.2 Help.MacVim\ Website :maca openWebsite:<CR>
an <silent> 9999.2 Help.MacVim\ Website <Nop>
an 9999.3 Help.-sep0- <Nop>
@@ -189,55 +190,59 @@ endif " exists("macvim_hig_shift_movement")
"
" Menu key equivalents (these should always have the 'D' modifier set)
" Set up menu key equivalents (these should always have the 'D' modifier set),
" action bindings, and alternate items.
"
" Note: menu items which should execute an action are bound to <Nop>; the
" action message is specified here via the :macmenu command.
"
macmenukey File.New\ Window <D-n>
macmenukey File.New\ Tab <D-t>
macm File.New\ Window key=<D-n> action=newWindow:
macm File.New\ Tab key=<D-t>
macm File.Open\.\.\. key=<D-o> action=fileOpen:
macm File.Open\ Tab\.\.\. key=<D-T>
macm File.Open\ Recent action=recentFilesDummy:
macm File.Close\ Window key=<D-W>
macm File.Close key=<D-w> action=performClose:
macm File.Save key=<D-s>
macm File.Save\ All key=<D-M-s> alt=YES
macm File.Save\ As\.\.\. key=<D-S>
macm File.Print key=<D-p>
macmenukey File.Open\.\.\. <D-o>
macmenukey File.Open\ Tab\.\.\. <D-T>
macmenukey File.Close\ Window <D-W>
"macmenukey File.Close\ Tab <D-w>
macmenukey File.Close <D-w>
macmenukey File.Save <D-s>
macmenukey File.Save\ As\.\.\. <D-S>
macmenukey File.Print <D-p>
macm Edit.Undo key=<D-z> action=undo:
macm Edit.Redo key=<D-Z> action=redo:
macm Edit.Cut key=<D-x> action=cut:
macm Edit.Copy key=<D-c> action=copy:
macm Edit.Paste key=<D-v> action=paste:
macm Edit.Select\ All key=<D-a> action=selectAll:
macm Edit.Find.Find\.\.\. key=<D-f>
macm Edit.Find.Find\ Next key=<D-g> action=findNext:
macm Edit.Find.Find\ Previous key=<D-G> action=findPrevious:
macm Edit.Find.Use\ Selection\ for\ Find key=<D-e>
macm Edit.Special\ Characters\.\.\. key=<D-M-t>
macm Edit.Font.Show\ Fonts action=orderFrontFontPanel:
macm Edit.Font.Bigger key=<D-=> action=fontSizeUp:
macm Edit.Font.Smaller key=<D--> action=fontSizeDown:
macm Edit.Special\ Characters\.\.\. action=orderFrontCharacterPalette:
macmenukey Edit.Undo <D-z>
macmenukey Edit.Redo <D-Z>
macmenukey Edit.Cut <D-x>
macmenukey Edit.Copy <D-c>
macmenukey Edit.Paste <D-v>
macmenukey Edit.Select\ All <D-a>
macmenukey Edit.Find.Find\.\.\. <D-f>
macmenukey Edit.Find.Find\ Next <D-g>
macmenukey Edit.Find.Find\ Previous <D-G>
macmenukey Edit.Find.Use\ Selection\ for\ Find <D-e>
macmenukey Edit.Special\ Characters\.\.\. <D-M-t>
macmenukey Edit.Font.Bigger <D-=>
macmenukey Edit.Font.Smaller <D-->
macm Tools.Spelling.To\ Next\ error key=<D-;>
macm Tools.Spelling.Suggest\ Corrections key=<D-:>
macm Tools.Make key=<D-b>
macm Tools.List\ Errors key=<D-l>
macm Tools.List\ Messages key=<D-L>
macm Tools.Next\ Error key=<D-C-Right>
macm Tools.Previous\ Error key=<D-C-Left>
macm Tools.Older\ List key=<D-C-Up>
macm Tools.Newer\ List key=<D-C-Down>
macmenukey Tools.Spelling.To\ Next\ error <D-;>
macmenukey Tools.Spelling.Suggest\ Corrections <D-:>
macmenukey Tools.Make <D-b>
macmenukey Tools.List\ Errors <D-l>
macmenukey Tools.List\ Messages <D-L>
macmenukey Tools.Next\ Error <D-C-Right>
macmenukey Tools.Previous\ Error <D-C-Left>
macmenukey Tools.Older\ List <D-C-Up>
macmenukey Tools.Newer\ List <D-C-Down>
macmenukey Window.Minimize <D-m>
macmenukey Window.Zoom <D-C-z>
macmenukey Window.Toggle\ Full\ Screen\ Mode <D-F>
macmenukey Window.Previous\ Tab <D-{>
macmenukey Window.Next\ Tab <D-}>
" TODO: <D-?> seems to be reserved by the system on Leopard. Disable this key
" equivalent until I can figure out what to do about it.
"macmenukey Help.MacVim\ Help <D-?>
macm Window.Minimize key=<D-m> action=performMiniaturize:
macm Window.Zoom key=<D-C-z> action=performZoom:
macm Window.Toggle\ Full\ Screen\ Mode key=<D-F>
macm Window.Previous\ Tab key=<D-{>
macm Window.Next\ Tab key=<D-}>
macm Window.Bring\ All\ To\ Front action=arrangeInFront:
macm Help.MacVim\ Website action=openWebsite:
" Restore the previous value of 'cpoptions'.
let &cpo = s:cpo_save
+33 -3
View File
@@ -40,6 +40,36 @@
Sparkle supports updates in zip, tar, tbz, tgz, or dmg format.
-->
<item>
<title>Snapshot 28 released</title>
<description><![CDATA[
<h1>MacVim snapshot 28 released</h1>
<p><em>The ":macmenukey" command is now deprecated. Please update your .gvimrc
file to use the ":macmenu" command instead (if you use ":macmenukey").</em></p>
<p> Changes since snapshot 27:
<ul>
<li> Added the ":macmenu" commmand (see ":h macmenu") and deprecated
":macmenukey"</li>
<li> Cmd-w now works even when mappings to &lt;-\&gt; are present </li>
<li> Added "File.Save All" menu item (Cmd-Alt-s) </li>
<li> The Logitech Control Center no longer causes any problems </li>
<li> "Edit" menu items now work better with open and save dialogs </li>
<li> The 'backspace' option now includes "indent,eol,start" by default </li>
<li> Open and save dialogs track the present working directory </li>
</ul>
</p>
]]></description>
<pubDate>Sun, 25 May 2008 19:40 CET</pubDate>
<enclosure type="application/octet-stream"
url="http://macvim.googlecode.com/files/MacVim-snapshot-28.tbz"
length="8124499"
sparkle:version="28"
sparkle:shortVersionString="7.1"
/>
</item>
<item>
<title>Snapshot 27 released</title>
<description><![CDATA[
@@ -66,10 +96,10 @@
</ul>
</p>
]]></description>
<pubDate>Sun, 11 May 2008 16:36 CET</pubDate>
<pubDate>Mon, 12 May 2008 22:05 CET</pubDate>
<enclosure type="application/octet-stream"
url="http://macvim.googlecode.com/files/MacVim-snapshot-27.tbz"
length="8104821"
url="http://macvim.googlecode.com/files/MacVim-snapshot-27-fixed.tbz"
length="8102568"
sparkle:version="27"
sparkle:shortVersionString="7.1"
/>
+5 -1
View File
@@ -1,6 +1,10 @@
" System vimrc file for MacVim
"
" Maintainer: Bjorn Winckler <bjorn.winckler@gmail.com>
" Last Change: Sat Aug 11 14:26:41 CEST 2007
" Last Change: Sun May 25 2008
set nocompatible
" The default for 'backspace' is very confusing to new users, so change it to a
" more sensible value. Add "set backspace&" to your ~/.vimrc to reset it.
set backspace+=indent,eol,start
+2 -2
View File
@@ -597,8 +597,8 @@ EX(CMD_match, "match", ex_match,
RANGE|NOTADR|EXTRA|CMDWIN),
EX(CMD_macaction, "macaction", ex_macaction,
EXTRA|NOSPC|NEEDARG),
EX(CMD_macmenukey, "macmenukey", ex_macmenukey,
EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
EX(CMD_macmenu, "macmenu", ex_macmenu,
EXTRA|TRLBAR|CMDWIN),
EX(CMD_menu, "menu", ex_menu,
RANGE|NOTADR|ZEROR|BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
EX(CMD_menutranslate, "menutranslate", ex_menutranslate,
+2 -2
View File
@@ -466,7 +466,7 @@ static void ex_folddo __ARGS((exarg_T *eap));
#ifndef FEAT_GUI_MACVIM
# define ex_macaction ex_ni
# define ex_macmenukey ex_ni
# define ex_macmenu ex_ni
#endif
/*
@@ -3764,7 +3764,7 @@ set_one_cmd_context(xp, buff)
case CMD_tmenu: case CMD_tunmenu:
case CMD_popup: case CMD_tearoff: case CMD_emenu:
#ifdef FEAT_GUI_MACVIM
case CMD_macmenukey:
case CMD_macmenu:
#endif
return set_context_in_menu_cmd(xp, cmd, arg, forceit);
#endif
+8
View File
@@ -0,0 +1,8 @@
#!/bin/sh
# Start GUI Vim on a copy of the tutor file.
# Usage: gvimtutor [xx]
# See vimtutor for usage.
exec `dirname $0`/vimtutor -g "$@"
+354 -101
View File
@@ -1038,6 +1038,9 @@ free_menu(menup)
# ifdef FEAT_GUI_MOTIF
vim_free(menu->xpm_fname);
# endif
#ifdef FEAT_GUI_MACVIM
vim_free(menu->mac_action);
#endif
#endif
for (i = 0; i < MENU_MODES; i++)
free_menu_string(menu, i);
@@ -2137,6 +2140,9 @@ ex_emenu(eap)
char_u *p;
int idx;
char_u *mode;
#ifdef FEAT_GUI_MACVIM
char_u *old_arg;
#endif
saved_name = vim_strsave(eap->arg);
if (saved_name == NULL)
@@ -2243,8 +2249,10 @@ ex_emenu(eap)
idx = MENU_INDEX_NORMAL;
}
if (idx != MENU_INDEX_INVALID && menu->strings[idx] != NULL)
if (idx != MENU_INDEX_INVALID && menu->strings[idx] != NULL &&
menu->strings[idx][0] != NUL)
{
/* When executing a script or function execute the commands right now.
* Otherwise put them in the typeahead buffer. */
#ifdef FEAT_EVAL
@@ -2256,6 +2264,19 @@ ex_emenu(eap)
ins_typebuf(menu->strings[idx], menu->noremap[idx], 0,
TRUE, menu->silent[idx]);
}
#ifdef FEAT_GUI_MACVIM
else if (menu->mac_action != NULL && menu->strings[idx][0] == NUL)
{
/* This allows us to bind a menu to an action without mapping to
* anything so that pressing the menu's key equivalent and typing
* ":emenu ..." does the same thing. (HACK: We count on the fact that
* ex_macaction() only looks at eap->arg.) */
old_arg = eap->arg;
eap->arg = menu->mac_action;
ex_macaction(eap);
eap->arg = old_arg;
}
#endif /* FEAT_GUI_MACVIM */
else
EMSG2(_("E335: Menu not defined for %s mode"), mode);
}
@@ -2473,32 +2494,145 @@ menutrans_lookup(name, len)
#ifdef FEAT_GUI_MACVIM
vimmenu_T *
menu_for_path(char_u *menu_path)
{
vimmenu_T *menu;
char_u *name;
char_u *saved_name;
char_u *p;
saved_name = vim_strsave(menu_path);
if (saved_name == NULL)
return NULL;
menu = root_menu;
name = saved_name;
while (*name)
{
/* Find in the menu hierarchy */
p = menu_name_skip(name);
while (menu != NULL)
{
if (menu_name_equal(name, menu))
{
if (*p == NUL && menu->children != NULL)
{
EMSG(_("E333: Menu path must lead to a menu item"));
menu = NULL;
}
else if (*p != NUL && menu->children == NULL)
{
EMSG(_(e_notsubmenu));
menu = NULL;
}
break;
}
menu = menu->next;
}
if (menu == NULL || *p == NUL)
break;
menu = menu->children;
name = p;
}
vim_free(saved_name);
if (menu == NULL)
{
EMSG2(_("E334: Menu not found: %s"), menu_path);
return NULL;
}
return menu;
}
/*
* Handle the ":macmenu" command.
*/
void
ex_macmenukey(eap)
ex_macmenu(eap)
exarg_T *eap;
{
char_u *arg = eap->arg;
char_u *keys, *name, *p;
vimmenu_T *menu;
vimmenu_T *menu = NULL;
char_u *arg;
char_u *menu_path;
char_u *p;
char_u *keys;
int len;
#ifdef FEAT_MULTI_LANG
char_u *tofree = NULL;
char_u *new_cmd;
#endif
char_u *linep;
char_u *key_start;
char_u *key = NULL;
char_u *arg_start = NULL;
int error = FALSE;
char_u *action = NULL;
int mac_key = 0;
int mac_mods = 0;
int mac_alternate = 0;
char_u *last_dash;
int modifiers;
int bit;
int key;
int set_action = FALSE;
int set_key = FALSE;
int set_alt = FALSE;
arg = eap->arg;
#ifdef FEAT_MULTI_LANG
/*
* Translate menu names as specified with ":menutrans" commands.
*/
menu_path = arg;
while (*menu_path)
{
/* find the end of one part and check if it should be translated */
p = menu_skip_part(menu_path);
keys = menutrans_lookup(menu_path, (int)(p - menu_path));
if (keys != NULL)
{
/* found a match: replace with the translated part */
len = (int)STRLEN(keys);
new_cmd = alloc((unsigned)STRLEN(arg) + len + 1);
if (new_cmd == NULL)
break;
mch_memmove(new_cmd, arg, menu_path - arg);
mch_memmove(new_cmd + (menu_path - arg), keys, (size_t)len);
STRCPY(new_cmd + (menu_path - arg) + len, p);
p = new_cmd + (menu_path - arg) + len;
vim_free(tofree);
tofree = new_cmd;
arg = new_cmd;
}
if (*p != '.')
break;
menu_path = p + 1;
}
#endif
/*
* Isolate the menu name.
* Skip the menu name, and translate <Tab> into a real TAB.
*/
name = arg;
if (*name == '.')
menu_path = arg;
if (*menu_path == '.')
{
EMSG2(_(e_invarg2), name);
return;
EMSG2(_(e_invarg2), menu_path);
goto theend;
}
while (*arg && !vim_iswhite(*arg))
{
if ((*arg == '\\' || *arg == Ctrl_V) && arg[1] != NUL)
arg++;
else if (STRNICMP(arg, "<TAB>", 5) == 0)
{
*arg = TAB;
mch_memmove(arg + 1, arg + 5, STRLEN(arg + 4));
}
arg++;
}
if (*arg != NUL)
@@ -2506,108 +2640,227 @@ ex_macmenukey(eap)
arg = skipwhite(arg);
keys = arg;
// TODO: move to gui_find_menu_item(path_name)
menu = root_menu;
while (*name)
{
/* find the end of one dot-separated name and put a NUL at the dot */
p = menu_name_skip(name);
menu = menu_for_path(menu_path);
if (!menu) goto theend;
while (menu != NULL)
/*
* Parse all key=value arguments.
*/
arg = NULL;
linep = keys;
while (!ends_excmd(*linep))
{
key_start = linep;
if (*linep == '=')
{
if (STRCMP(name, menu->name) == 0 || STRCMP(name, menu->dname) == 0)
{
if (*p == NUL)
{
if (menu->children != NULL)
menu = NULL;
goto search_end;
}
break;
}
menu = menu->next;
}
if (menu == NULL) /* didn't find it */
EMSG2(_("E415: unexpected equal sign: %s"), key_start);
error = TRUE;
break;
}
/* Found a match, search the sub-menu. */
menu = menu->children;
name = p;
/*
* Isolate the key ("action", "alt", or "key").
*/
while (*linep && !vim_iswhite(*linep) && *linep != '=')
++linep;
vim_free(key);
key = vim_strnsave_up(key_start, (int)(linep - key_start));
if (key == NULL)
{
error = TRUE;
break;
}
linep = skipwhite(linep);
/*
* Check for the equal sign.
*/
if (*linep != '=')
{
EMSG2(_("E416: missing equal sign: %s"), key_start);
error = TRUE;
break;
}
++linep;
/*
* Isolate the argument.
*/
linep = skipwhite(linep);
arg_start = linep;
linep = skiptowhite(linep);
if (linep == arg_start)
{
EMSG2(_("E417: missing argument: %s"), key_start);
error = TRUE;
break;
}
vim_free(arg);
arg = vim_strnsave(arg_start, (int)(linep - arg_start));
if (arg == NULL)
{
error = TRUE;
break;
}
/*
* Store the argument.
*/
if (STRCMP(key, "ACTION") == 0)
{
action = vim_strsave(arg);
if (action == NULL)
{
error = TRUE;
break;
}
if (!is_valid_macaction(action))
{
EMSG2(_("E???: Invalid action: %s"), arg);
error = TRUE;
break;
}
set_action = TRUE;
}
else if (STRCMP(key, "ALT") == 0)
{
len = (int)STRLEN(arg);
if ( (len == 1 && (*arg == '0' || *arg == '1')) ||
(STRICMP("no", arg) == 0 || STRICMP("yes", arg) == 0) )
{
mac_alternate = (*arg == '1' || STRICMP("yes", arg) == 0);
set_alt = TRUE;
}
else
{
EMSG2(_(e_invarg2), arg);
error = TRUE;
break;
}
}
else if (STRCMP(key, "KEY") == 0)
{
if (arg[0] != '<')
{
EMSG2(_(e_invarg2), arg);
error = TRUE;
break;
}
if (STRICMP("<nop>", arg) == 0)
{
/* This is to let the user unset a key equivalent, thereby
* freeing up that key combination to be used for a :map
* command (which would otherwise not be possible since key
* equivalents take precedence over :map). */
mac_key = 0;
mac_mods = 0;
set_key = TRUE;
continue;
}
/* Find end of modifier list */
last_dash = arg;
for (p = arg + 1; *p == '-' || vim_isIDc(*p); p++)
{
if (*p == '-')
{
last_dash = p;
if (p[1] != NUL && p[2] == '>')
++p; /* anything accepted, like <C-?> */
}
if (p[0] == 't' && p[1] == '_' && p[2] && p[3])
p += 3; /* skip t_xx, xx may be '-' or '>' */
}
if (*p == '>') /* found matching '>' */
{
/* Which modifiers are given? */
mac_mods = 0x0;
for (p = arg + 1; p < last_dash; p++)
{
if (*p != '-')
{
bit = name_to_mod_mask(*p);
if (bit == 0x0)
break; /* Illegal modifier name */
mac_mods |= bit;
}
}
/*
* Legal modifier name.
*/
if (p >= last_dash)
{
/*
* Modifier with single letter, or special key name.
*/
if (mac_mods != 0 && last_dash[2] == '>')
mac_key = last_dash[1];
else
{
mac_key = get_special_key_code(last_dash + 1);
mac_key = handle_x_keys(mac_key);
}
}
}
set_key = (mac_key != 0);
if (mac_key == 0)
{
EMSG2(_(e_invarg2), arg);
error = TRUE;
break;
}
}
else
{
EMSG2(_(e_invarg2), key_start);
error = TRUE;
break;
}
/*
* Continue with next argument.
*/
linep = skipwhite(linep);
}
search_end:
if (!menu) {
EMSG(_("E337: Menu not found - check menu names"));
return;
}
vim_free(key);
vim_free(arg);
if (keys[0] == '<')
/*
* Store all the keys that were set in the menu item.
*/
if (!error)
{
key = 0;
/* Find end of modifier list */
last_dash = keys;
for (p = keys + 1; *p == '-' || vim_isIDc(*p); p++)
{
if (*p == '-')
{
last_dash = p;
if (p[1] != NUL && p[2] == '>')
++p; /* anything accepted, like <C-?> */
}
if (p[0] == 't' && p[1] == '_' && p[2] && p[3])
p += 3; /* skip t_xx, xx may be '-' or '>' */
}
if (*p == '>') /* found matching '>' */
{
/* Which modifiers are given? */
modifiers = 0x0;
for (p = keys + 1; p < last_dash; p++)
{
if (*p != '-')
{
bit = name_to_mod_mask(*p);
if (bit == 0x0)
break; /* Illegal modifier name */
modifiers |= bit;
}
}
/*
* Legal modifier name.
*/
if (p >= last_dash)
{
/*
* Modifier with single letter, or special key name.
*/
if (modifiers != 0 && last_dash[2] == '>')
key = last_dash[1];
else
{
key = get_special_key_code(last_dash + 1);
key = handle_x_keys(key);
}
}
}
if (key != 0)
{
menu->mac_key = key;
menu->mac_mods = modifiers;
}
}
else if (keys[0] == NUL)
{
/* Clear the key equivalent */
menu->mac_key = 0;
menu->mac_mods = 0;
if (set_action)
menu->mac_action = action;
if (set_key)
{
menu->mac_key = mac_key;
menu->mac_mods = mac_mods;
}
if (set_alt)
menu->mac_alternate = mac_alternate;
}
else
{
EMSG(_(e_invarg));
vim_free(action);
}
theend:
#ifdef FEAT_MULTI_LANG
vim_free(tofree);
#else
;
#endif
}
#endif /* FEAT_GUI_MACVIM */
+1
View File
@@ -202,3 +202,4 @@ OSErr odb_post_buffer_write(buf_T *buf);
void odb_end(void);
char_u *get_macaction_name(expand_T *xp, int idx);
int is_valid_macaction(char_u *action);
+1
View File
@@ -20,6 +20,7 @@ void ex_emenu __ARGS((exarg_T *eap));
vimmenu_T *gui_find_menu __ARGS((char_u *path_name));
void ex_menutranslate __ARGS((exarg_T *eap));
#ifdef FEAT_GUI_MACVIM
void ex_macmenu __ARGS((exarg_T *eap));
void ex_macmenukey __ARGS((exarg_T *eap));
#endif
/* vim: set ft=c : */
+5 -3
View File
@@ -2254,9 +2254,11 @@ struct VimMenu
PtWidget_t *submenu_id;
#endif
#ifdef FEAT_GUI_MACVIM
int mac_key; /* Key equivalent */
int mac_mods; /* Modifier flags for the above */
int was_grey; /* Remember last 'grey' state */
char_u *mac_action; /* Action this menu sends */
int mac_key; /* Key equivalent */
int mac_mods; /* Modifier flags for the above */
int mac_alternate; /* Item is alternate of previous item */
int was_grey; /* Remember last 'grey' state */
#endif
};
#else
+2
View File
@@ -681,6 +681,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
298,
/**/
297,
/**/