mirror of
https://github.com/macvim-dev/macvim.git
synced 2026-06-02 11:19:22 +02:00
Compare commits
45 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ab9df03d0d | |||
| e7b9c11089 | |||
| d98996d31c | |||
| 40056b05c3 | |||
| a4e3a7370b | |||
| 7ad0084f3f | |||
| d165ccb4bc | |||
| b53ee76b5e | |||
| 6255f52fc5 | |||
| f63e3834b4 | |||
| 9338c9c55c | |||
| 11a1c2cb92 | |||
| 59ad683558 | |||
| 95fb95ebcc | |||
| bc9688ffdc | |||
| bafdc2c3e1 | |||
| 279b3f843c | |||
| 603f746178 | |||
| 255571d05e | |||
| 82038bc905 | |||
| bca5b2086e | |||
| 67d03b985b | |||
| 2d36c33fd5 | |||
| ee9959e56c | |||
| 9ca5f6bcdb | |||
| 626995c3e8 | |||
| 634ef3b803 | |||
| aed4648a3d | |||
| cd2f7e9eb1 | |||
| 3b966f9e01 | |||
| 8009a9912d | |||
| cdf043f0f9 | |||
| 757e8b4359 | |||
| 7b68b0b56d | |||
| 21b029712f | |||
| 80b4c97a2c | |||
| 404077032e | |||
| 04cd1420c1 | |||
| 46ae2ec9cb | |||
| 85cc2265e8 | |||
| 4c3907a8ff | |||
| f4fef46de2 | |||
| 28c76af675 | |||
| 9716d0b66f | |||
| 428d1b4412 |
@@ -3515,6 +3515,10 @@ line({expr}) The result is a Number, which is the line number of the file
|
||||
returned)
|
||||
w0 first line visible in current window
|
||||
w$ last line visible in current window
|
||||
v In Visual mode: the start of the Visual area (the
|
||||
cursor is the end). When not in Visual mode
|
||||
returns the cursor position. Differs from |'<| in
|
||||
that it's updated right away.
|
||||
Note that a mark in another file can be used. The line number
|
||||
then applies to another buffer.
|
||||
To get the column number use |col()|. To get both use
|
||||
|
||||
+10
-2
@@ -36,7 +36,7 @@ The currently preferred method is using the free Visual C++ Toolkit 2003.
|
||||
Visual Studio
|
||||
-------------
|
||||
|
||||
Building with Visual Studio (VS 98, VS .NET, VS .NET 2003, and VS .NET 2005)
|
||||
Building with Visual Studio (VS 98, VS .NET, VS .NET 2003, VS 2005, and VS 2008)
|
||||
is straightforward. (These instructions should also work for VS 4 and VS 5.)
|
||||
|
||||
To build Vim from the command line with MSVC, use Make_mvc.mak.
|
||||
@@ -139,7 +139,7 @@ to debug Vim itself. An earlier version of the Debugging Tools
|
||||
is also available through the Platform SDK, |ms-platform-sdk|.
|
||||
|
||||
|
||||
Visual C++ 2005 Express Edition
|
||||
Visual C++ 2005 Express Edition *msvc-2005-express*
|
||||
-------------------------------
|
||||
|
||||
Visual C++ 2005 Express Edition can be downloaded for free from:
|
||||
@@ -159,6 +159,14 @@ Visual C++ 2008 Express Edition can be downloaded for free from:
|
||||
This includes the IDE and the debugger. You can build Vim with Make_mvc.mak.
|
||||
|
||||
|
||||
Visual C++ 2008 Express Edition *msvc-2008-express*
|
||||
-------------------------------
|
||||
|
||||
Visual C++ 2008 Express Edition can be downloaded for free from:
|
||||
http://msdn2.microsoft.com/en-us/express/default.aspx
|
||||
This includes the IDE and the debugger. You can build Vim with Make_mvc.mak.
|
||||
|
||||
|
||||
2. MinGW
|
||||
========
|
||||
|
||||
|
||||
+1
-3
@@ -9,9 +9,7 @@
|
||||
<key>IBOldestOS</key>
|
||||
<integer>5</integer>
|
||||
<key>IBOpenObjects</key>
|
||||
<array>
|
||||
<integer>310</integer>
|
||||
</array>
|
||||
<array/>
|
||||
<key>IBSystem Version</key>
|
||||
<string>9D34</string>
|
||||
<key>targetFramework</key>
|
||||
|
||||
Binary file not shown.
@@ -574,7 +574,7 @@
|
||||
<key>CFBundleSignature</key>
|
||||
<string>VIMM</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>29</string>
|
||||
<string>32</string>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MainMenu</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
|
||||
@@ -570,6 +570,7 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
{
|
||||
//NSLog(@"%s%@", _cmd, controller);
|
||||
|
||||
[controller cleanup];
|
||||
[[controller windowController] close];
|
||||
|
||||
[vimControllers removeObject:controller];
|
||||
|
||||
@@ -96,6 +96,8 @@ enum {
|
||||
- (void)clearAll;
|
||||
- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape
|
||||
fraction:(int)percent color:(NSColor *)color;
|
||||
- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nrows
|
||||
numColumns:(int)ncols;
|
||||
@end
|
||||
|
||||
|
||||
@@ -406,20 +408,18 @@ enum {
|
||||
&& !(116 == [event keyCode] || 121 == [event keyCode]))
|
||||
return NO;
|
||||
|
||||
// HACK! KeyCode 50 represent the key which switches between windows
|
||||
// within an application (like Cmd+Tab is used to switch between
|
||||
// applications). Return NO here, else the window switching does not work.
|
||||
if ([event keyCode] == 50)
|
||||
return NO;
|
||||
|
||||
// HACK! Let the main menu try to handle any key down event, before
|
||||
// passing it on to vim, otherwise key equivalents for menus will
|
||||
// effectively be disabled.
|
||||
if ([[NSApp mainMenu] performKeyEquivalent:event])
|
||||
return YES;
|
||||
|
||||
// HACK! Give the default main menu a chance to handle the key down event.
|
||||
// This is to ensure that the standard mappings (which are in the default
|
||||
// main menu) are always available, also when the default Vim menus are
|
||||
// used (these do not set any key equivalents!).
|
||||
if ([[[MMAppController sharedInstance] defaultMainMenu]
|
||||
performKeyEquivalent:event])
|
||||
return YES;
|
||||
|
||||
// HACK! On Leopard Ctrl-key events end up here instead of keyDown:.
|
||||
if (flags & NSControlKeyMask) {
|
||||
[self keyDown:event];
|
||||
@@ -601,6 +601,19 @@ enum {
|
||||
[self drawInsertionPointAtRow:row column:col shape:shape
|
||||
fraction:percent
|
||||
color:[NSColor colorWithRgbInt:color]];
|
||||
} else if (DrawInvertedRectDrawType == type) {
|
||||
int row = *((int*)bytes); bytes += sizeof(int);
|
||||
int col = *((int*)bytes); bytes += sizeof(int);
|
||||
int nr = *((int*)bytes); bytes += sizeof(int);
|
||||
int nc = *((int*)bytes); bytes += sizeof(int);
|
||||
/*int invert = *((int*)bytes);*/ bytes += sizeof(int);
|
||||
|
||||
#if MM_DEBUG_DRAWING
|
||||
NSLog(@" Draw inverted rect: row=%d col=%d nrows=%d ncols=%d",
|
||||
row, col, nr, nc);
|
||||
#endif
|
||||
[self drawInvertedRectAtRow:row column:col numRows:nr
|
||||
numColumns:nc];
|
||||
} else if (SetCursorPosDrawType == type) {
|
||||
// TODO: This is used for Voice Over support in MMTextView,
|
||||
// MMAtsuiTextView currently does not support Voice Over.
|
||||
@@ -1135,4 +1148,20 @@ enum {
|
||||
}
|
||||
}
|
||||
|
||||
- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nrows
|
||||
numColumns:(int)ncols
|
||||
{
|
||||
// TODO: THIS CODE HAS NOT BEEN TESTED!
|
||||
CGContextRef cgctx = [[NSGraphicsContext currentContext] graphicsPort];
|
||||
CGContextSaveGState(cgctx);
|
||||
CGContextSetBlendMode(cgctx, kCGBlendModeDifference);
|
||||
CGContextSetRGBFillColor(cgctx, 1.0, 1.0, 1.0, 1.0);
|
||||
|
||||
CGRect rect = { col * cellSize.width, row * cellSize.height,
|
||||
ncols * cellSize.width, nrows * cellSize.height };
|
||||
CGContextFillRect(cgctx, rect);
|
||||
|
||||
CGContextRestoreGState(cgctx);
|
||||
}
|
||||
|
||||
@end // MMAtsuiTextView (Drawing)
|
||||
|
||||
@@ -71,6 +71,8 @@
|
||||
scrollBottom:(int)bottom left:(int)left right:(int)right;
|
||||
- (void)drawCursorAtRow:(int)row column:(int)col shape:(int)shape
|
||||
fraction:(int)percent color:(int)color;
|
||||
- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nr
|
||||
numColumns:(int)nc invert:(int)invert;
|
||||
- (void)update;
|
||||
- (void)flushQueue:(BOOL)force;
|
||||
- (BOOL)waitForInput:(int)milliseconds;
|
||||
|
||||
+73
-11
@@ -80,6 +80,7 @@ static NSString *MMSymlinkWarningString =
|
||||
|
||||
|
||||
@interface MMBackend (Private)
|
||||
- (void)waitForDialogReturn;
|
||||
- (void)queueVimStateMessage;
|
||||
- (void)processInputQueue;
|
||||
- (void)handleInputEvent:(int)msgid data:(NSData *)data;
|
||||
@@ -428,6 +429,19 @@ static NSString *MMSymlinkWarningString =
|
||||
[drawData appendBytes:&percent length:sizeof(int)];
|
||||
}
|
||||
|
||||
- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nr
|
||||
numColumns:(int)nc invert:(int)invert
|
||||
{
|
||||
int type = DrawInvertedRectDrawType;
|
||||
[drawData appendBytes:&type length:sizeof(int)];
|
||||
|
||||
[drawData appendBytes:&row length:sizeof(int)];
|
||||
[drawData appendBytes:&col length:sizeof(int)];
|
||||
[drawData appendBytes:&nr length:sizeof(int)];
|
||||
[drawData appendBytes:&nc length:sizeof(int)];
|
||||
[drawData appendBytes:&invert length:sizeof(int)];
|
||||
}
|
||||
|
||||
- (void)update
|
||||
{
|
||||
// Tend to the run loop, returning immediately if there are no events
|
||||
@@ -448,10 +462,9 @@ static NSString *MMSymlinkWarningString =
|
||||
// NOTE! This method gets called a lot; if we were to flush every time it
|
||||
// got called MacVim would feel unresponsive. So there is a time out which
|
||||
// ensures that the queue isn't flushed too often.
|
||||
if (exiting ||
|
||||
(!force && lastFlushDate &&
|
||||
-[lastFlushDate timeIntervalSinceNow] < MMFlushTimeoutInterval &&
|
||||
[drawData length] < MMFlushQueueLenHint))
|
||||
if (!force && lastFlushDate
|
||||
&& -[lastFlushDate timeIntervalSinceNow] < MMFlushTimeoutInterval
|
||||
&& [drawData length] < MMFlushQueueLenHint)
|
||||
return;
|
||||
|
||||
if ([drawData length] > 0) {
|
||||
@@ -640,9 +653,7 @@ static NSString *MMSymlinkWarningString =
|
||||
@try {
|
||||
[frontendProxy showSavePanelForDirectory:ds title:ts saving:saving];
|
||||
|
||||
// Wait until a reply is sent from MMVimController.
|
||||
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
|
||||
beforeDate:[NSDate distantFuture]];
|
||||
[self waitForDialogReturn];
|
||||
|
||||
if (dialogReturn && [dialogReturn isKindOfClass:[NSString class]]) {
|
||||
char_u *ret = (char_u*)[dialogReturn UTF8String];
|
||||
@@ -664,13 +675,18 @@ static NSString *MMSymlinkWarningString =
|
||||
return (char *)s;
|
||||
}
|
||||
|
||||
- (oneway void)setDialogReturn:(in bycopy id)obj
|
||||
- (void)setDialogReturn:(in bycopy id)obj
|
||||
{
|
||||
// NOTE: This is called by
|
||||
// - [MMVimController panelDidEnd:::], and
|
||||
// - [MMVimController alertDidEnd:::],
|
||||
// to indicate that a save/open panel or alert has finished.
|
||||
|
||||
// We want to distinguish between "no dialog return yet" and "dialog
|
||||
// returned nothing". The former can be tested with dialogReturn == nil,
|
||||
// the latter with dialogReturn == [NSNull null].
|
||||
if (!obj) obj = [NSNull null];
|
||||
|
||||
if (obj != dialogReturn) {
|
||||
[dialogReturn release];
|
||||
dialogReturn = [obj retain];
|
||||
@@ -719,9 +735,7 @@ static NSString *MMSymlinkWarningString =
|
||||
informativeText:text buttonTitles:buttons
|
||||
textFieldString:textFieldString];
|
||||
|
||||
// Wait until a reply is sent from MMVimController.
|
||||
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
|
||||
beforeDate:[NSDate distantFuture]];
|
||||
[self waitForDialogReturn];
|
||||
|
||||
if (dialogReturn && [dialogReturn isKindOfClass:[NSArray class]]
|
||||
&& [dialogReturn count]) {
|
||||
@@ -1475,6 +1489,49 @@ static NSString *MMSymlinkWarningString =
|
||||
|
||||
@implementation MMBackend (Private)
|
||||
|
||||
- (void)waitForDialogReturn
|
||||
{
|
||||
// Keep processing the run loop until a dialog returns. To avoid getting
|
||||
// stuck in an endless loop (could happen if the setDialogReturn: message
|
||||
// was lost) we also do some paranoia checks.
|
||||
//
|
||||
// Note that in Cocoa the user can still resize windows and select menu
|
||||
// items while a sheet is being displayed, so we can't just wait for the
|
||||
// first message to arrive and assume that is the setDialogReturn: call.
|
||||
|
||||
while (nil == dialogReturn && !got_int && [connection isValid]
|
||||
&& !isTerminating)
|
||||
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
|
||||
beforeDate:[NSDate distantFuture]];
|
||||
|
||||
// Search for any resize messages on the input queue. All other messages
|
||||
// on the input queue are dropped. The reason why we single out resize
|
||||
// messages is because the user may have resized the window while a sheet
|
||||
// was open.
|
||||
int i, count = [inputQueue count];
|
||||
if (count > 0) {
|
||||
id textDimData = nil;
|
||||
if (count%2 == 0) {
|
||||
for (i = count-2; i >= 0; i -= 2) {
|
||||
int msgid = [[inputQueue objectAtIndex:i] intValue];
|
||||
if (SetTextDimensionsMsgID == msgid) {
|
||||
textDimData = [[inputQueue objectAtIndex:i+1] retain];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
[inputQueue removeAllObjects];
|
||||
|
||||
if (textDimData) {
|
||||
[inputQueue addObject:
|
||||
[NSNumber numberWithInt:SetTextDimensionsMsgID]];
|
||||
[inputQueue addObject:textDimData];
|
||||
[textDimData release];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)queueVimStateMessage
|
||||
{
|
||||
// NOTE: This is the place to add Vim state that needs to be accessed from
|
||||
@@ -1494,6 +1551,8 @@ static NSString *MMSymlinkWarningString =
|
||||
|
||||
- (void)processInputQueue
|
||||
{
|
||||
if ([inputQueue count] == 0) return;
|
||||
|
||||
// NOTE: One of the input events may cause this method to be called
|
||||
// recursively, so copy the input queue to a local variable and clear it
|
||||
// before starting to process input events (otherwise we could get stuck in
|
||||
@@ -1787,6 +1846,9 @@ static NSString *MMSymlinkWarningString =
|
||||
|
||||
- (void)queueMessage:(int)msgid data:(NSData *)data
|
||||
{
|
||||
//if (msgid != EnableMenuItemMsgID)
|
||||
// NSLog(@"queueMessage:%s", MessageStrings[msgid]);
|
||||
|
||||
[outputQueue addObject:[NSData dataWithBytes:&msgid length:sizeof(int)]];
|
||||
if (data)
|
||||
[outputQueue addObject:data];
|
||||
|
||||
@@ -29,14 +29,14 @@
|
||||
int preEditColumn;
|
||||
int mouseShape;
|
||||
BOOL antialias;
|
||||
NSRect *invertRects;
|
||||
int numInvertRects;
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(NSRect)frame;
|
||||
|
||||
- (void)setShouldDrawInsertionPoint:(BOOL)on;
|
||||
- (void)setPreEditRow:(int)row column:(int)col;
|
||||
- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape
|
||||
fraction:(int)percent color:(NSColor *)color;
|
||||
- (void)hideMarkedTextField;
|
||||
- (void)performBatchDrawWithData:(NSData *)data;
|
||||
- (void)setMouseShape:(int)shape;
|
||||
|
||||
+119
-33
@@ -50,6 +50,8 @@ enum {
|
||||
- (void)setCursor;
|
||||
- (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column;
|
||||
- (BOOL)convertRow:(int)row column:(int)column toPoint:(NSPoint *)point;
|
||||
- (BOOL)convertRow:(int)row column:(int)column numRows:(int)nr
|
||||
numColumns:(int)nc toRect:(NSRect *)rect;
|
||||
- (NSRect)trackingRect;
|
||||
- (void)dispatchKeyEvent:(NSEvent *)event;
|
||||
- (MMWindowController *)windowController;
|
||||
@@ -58,6 +60,10 @@ enum {
|
||||
- (void)dragTimerFired:(NSTimer *)timer;
|
||||
- (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags;
|
||||
- (void)hideMouseCursor;
|
||||
- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape
|
||||
fraction:(int)percent color:(NSColor *)color;
|
||||
- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nrows
|
||||
numColumns:(int)ncols invert:(int)invert;
|
||||
@end
|
||||
|
||||
|
||||
@@ -130,6 +136,12 @@ enum {
|
||||
markedTextField = nil;
|
||||
}
|
||||
|
||||
if (invertRects) {
|
||||
free(invertRects);
|
||||
invertRects = NULL;
|
||||
numInvertRects = 0;
|
||||
}
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
@@ -153,23 +165,6 @@ enum {
|
||||
preEditColumn = col;
|
||||
}
|
||||
|
||||
- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape
|
||||
fraction:(int)percent color:(NSColor *)color
|
||||
{
|
||||
//NSLog(@"drawInsertionPointAtRow:%d column:%d shape:%d color:%@",
|
||||
// row, col, shape, color);
|
||||
|
||||
// This only stores where to draw the insertion point, the actual drawing
|
||||
// is done in drawRect:.
|
||||
shouldDrawInsertionPoint = YES;
|
||||
insertionPointRow = row;
|
||||
insertionPointColumn = col;
|
||||
insertionPointShape = shape;
|
||||
insertionPointFraction = percent;
|
||||
|
||||
[self setInsertionPointColor:color];
|
||||
}
|
||||
|
||||
- (void)hideMarkedTextField
|
||||
{
|
||||
if (markedTextField) {
|
||||
@@ -300,6 +295,19 @@ enum {
|
||||
[self drawInsertionPointAtRow:row column:col shape:shape
|
||||
fraction:percent
|
||||
color:[NSColor colorWithRgbInt:color]];
|
||||
} else if (DrawInvertedRectDrawType == type) {
|
||||
int row = *((int*)bytes); bytes += sizeof(int);
|
||||
int col = *((int*)bytes); bytes += sizeof(int);
|
||||
int nr = *((int*)bytes); bytes += sizeof(int);
|
||||
int nc = *((int*)bytes); bytes += sizeof(int);
|
||||
int invert = *((int*)bytes); bytes += sizeof(int);
|
||||
|
||||
#if MM_DEBUG_DRAWING
|
||||
NSLog(@" Draw inverted rect: row=%d col=%d nrows=%d ncols=%d",
|
||||
row, col, nr, nc);
|
||||
#endif
|
||||
[self drawInvertedRectAtRow:row column:col numRows:nr numColumns:nc
|
||||
invert:invert];
|
||||
} else if (SetCursorPosDrawType == type) {
|
||||
cursorRow = *((int*)bytes); bytes += sizeof(int);
|
||||
cursorCol = *((int*)bytes); bytes += sizeof(int);
|
||||
@@ -452,6 +460,24 @@ enum {
|
||||
|
||||
[super drawRect:rect];
|
||||
|
||||
if (invertRects) {
|
||||
CGContextRef cgctx = (CGContextRef)[context graphicsPort];
|
||||
CGContextSaveGState(cgctx);
|
||||
CGContextSetBlendMode(cgctx, kCGBlendModeDifference);
|
||||
CGContextSetRGBFillColor(cgctx, 1.0, 1.0, 1.0, 1.0);
|
||||
|
||||
int i;
|
||||
CGRect *rect = (CGRect*)invertRects;
|
||||
for (i = 0; i < numInvertRects; ++i)
|
||||
CGContextFillRect(cgctx, rect[i]);
|
||||
|
||||
CGContextRestoreGState(cgctx);
|
||||
|
||||
free(invertRects);
|
||||
invertRects = NULL;
|
||||
numInvertRects = 0;
|
||||
}
|
||||
|
||||
if (shouldDrawInsertionPoint) {
|
||||
MMTextStorage *ts = (MMTextStorage*)[self textStorage];
|
||||
|
||||
@@ -640,20 +666,18 @@ enum {
|
||||
&& !(116 == [event keyCode] || 121 == [event keyCode]))
|
||||
return NO;
|
||||
|
||||
// HACK! KeyCode 50 represent the key which switches between windows
|
||||
// within an application (like Cmd+Tab is used to switch between
|
||||
// applications). Return NO here, else the window switching does not work.
|
||||
if ([event keyCode] == 50)
|
||||
return NO;
|
||||
|
||||
// HACK! Let the main menu try to handle any key down event, before
|
||||
// passing it on to vim, otherwise key equivalents for menus will
|
||||
// effectively be disabled.
|
||||
if ([[NSApp mainMenu] performKeyEquivalent:event])
|
||||
return YES;
|
||||
|
||||
// HACK! Give the default main menu a chance to handle the key down event.
|
||||
// This is to ensure that the standard mappings (which are in the default
|
||||
// main menu) are always available, also when the default Vim menus are
|
||||
// used (these do not set any key equivalents!).
|
||||
if ([[[MMAppController sharedInstance] defaultMainMenu]
|
||||
performKeyEquivalent:event])
|
||||
return YES;
|
||||
|
||||
// HACK! On Leopard Ctrl-key events end up here instead of keyDown:.
|
||||
if (flags & NSControlKeyMask) {
|
||||
[self keyDown:event];
|
||||
@@ -829,9 +853,12 @@ enum {
|
||||
NSMutableData *data = [NSMutableData data];
|
||||
|
||||
// If desired, intepret Ctrl-Click as a right mouse click.
|
||||
if ([[NSUserDefaults standardUserDefaults]
|
||||
boolForKey:MMTranslateCtrlClickKey]
|
||||
&& button == 0 && flags & NSControlKeyMask) {
|
||||
BOOL translateCtrlClick = [[NSUserDefaults standardUserDefaults]
|
||||
boolForKey:MMTranslateCtrlClickKey];
|
||||
flags = flags & NSDeviceIndependentModifierFlagsMask;
|
||||
if (translateCtrlClick && button == 0 &&
|
||||
(flags == NSControlKeyMask ||
|
||||
flags == (NSControlKeyMask|NSAlphaShiftKeyMask))) {
|
||||
button = 1;
|
||||
flags &= ~NSControlKeyMask;
|
||||
}
|
||||
@@ -926,6 +953,11 @@ enum {
|
||||
MMTextStorage *ts = (MMTextStorage*)[self textStorage];
|
||||
if (!ts) return;
|
||||
|
||||
// HACK! NSTextView has a nasty habit of resetting the cursor to the
|
||||
// default I-beam cursor at random moments. The only reliable way we know
|
||||
// of to work around this is to set the cursor each time the mouse moves.
|
||||
[self setCursor];
|
||||
|
||||
NSPoint pt = [self convertPoint:[event locationInWindow] fromView:nil];
|
||||
int row, col;
|
||||
if (![self convertPoint:pt toRow:&row column:&col])
|
||||
@@ -958,11 +990,6 @@ enum {
|
||||
// key.
|
||||
if ([[self window] isKeyWindow]) {
|
||||
[[self window] setAcceptsMouseMovedEvents:YES];
|
||||
|
||||
// Ensure Vim gets to choose the mouse cursor when it enters over the
|
||||
// text view, otherwise NSTextView will automatically set its I-Beam
|
||||
// cursor.
|
||||
[self setCursor];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1244,6 +1271,23 @@ enum {
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (BOOL)convertRow:(int)row column:(int)column numRows:(int)nr
|
||||
numColumns:(int)nc toRect:(NSRect *)rect
|
||||
{
|
||||
MMTextStorage *ts = (MMTextStorage*)[self textStorage];
|
||||
NSSize cellSize = [ts cellSize];
|
||||
if (!(rect && cellSize.width > 0 && cellSize.height > 0))
|
||||
return NO;
|
||||
|
||||
rect->origin = [self textContainerOrigin];
|
||||
rect->origin.x += column * cellSize.width;
|
||||
rect->origin.y += row * cellSize.height;
|
||||
rect->size.width = cellSize.width * nc;
|
||||
rect->size.height = cellSize.height * nr;
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
- (NSRect)trackingRect
|
||||
{
|
||||
NSRect rect = [self frame];
|
||||
@@ -1394,4 +1438,46 @@ enum {
|
||||
[NSCursor setHiddenUntilMouseMoves:YES];
|
||||
}
|
||||
|
||||
- (void)drawInsertionPointAtRow:(int)row column:(int)col shape:(int)shape
|
||||
fraction:(int)percent color:(NSColor *)color
|
||||
{
|
||||
//NSLog(@"drawInsertionPointAtRow:%d column:%d shape:%d color:%@",
|
||||
// row, col, shape, color);
|
||||
|
||||
// This only stores where to draw the insertion point, the actual drawing
|
||||
// is done in drawRect:.
|
||||
shouldDrawInsertionPoint = YES;
|
||||
insertionPointRow = row;
|
||||
insertionPointColumn = col;
|
||||
insertionPointShape = shape;
|
||||
insertionPointFraction = percent;
|
||||
|
||||
[self setInsertionPointColor:color];
|
||||
}
|
||||
|
||||
- (void)drawInvertedRectAtRow:(int)row column:(int)col numRows:(int)nrows
|
||||
numColumns:(int)ncols invert:(int)invert
|
||||
{
|
||||
if (invert) {
|
||||
// The result should be inverted.
|
||||
int n = numInvertRects++;
|
||||
invertRects = reallocf(invertRects,
|
||||
numInvertRects*sizeof(NSRect));
|
||||
if (NULL != invertRects) {
|
||||
[self convertRow:row column:col numRows:nrows numColumns:ncols
|
||||
toRect:&invertRects[n]];
|
||||
[self setNeedsDisplayInRect:invertRects[n]];
|
||||
} else {
|
||||
n = numInvertRects = 0;
|
||||
}
|
||||
} else {
|
||||
// The result should look normal; all we need to do is to mark
|
||||
// the rect for redrawing and Cocoa will redraw the text.
|
||||
NSRect rect;
|
||||
[self convertRow:row column:col numRows:nrows numColumns:ncols
|
||||
toRect:&rect];
|
||||
[self setNeedsDisplayInRect:rect];
|
||||
}
|
||||
}
|
||||
|
||||
@end // MMTextView (Private)
|
||||
|
||||
@@ -12,10 +12,6 @@
|
||||
#import "MacVim.h"
|
||||
|
||||
|
||||
// If sendMessage: fails, store the message and resend after a delay.
|
||||
#define MM_RESEND_LAST_FAILURE 0
|
||||
|
||||
|
||||
@class MMWindowController;
|
||||
|
||||
|
||||
@@ -27,17 +23,13 @@
|
||||
id backendProxy;
|
||||
BOOL inProcessCommandQueue;
|
||||
NSMutableArray *sendQueue;
|
||||
NSMutableArray *receiveQueue;
|
||||
NSMenu *mainMenu;
|
||||
NSMutableArray *popupMenuItems;
|
||||
NSToolbar *toolbar;
|
||||
NSMutableDictionary *toolbarItemDict;
|
||||
int pid;
|
||||
NSString *serverName;
|
||||
#ifdef MM_RESEND_LAST_FAILURE
|
||||
NSTimer *resendTimer;
|
||||
int resendMsgid;
|
||||
NSData *resendData;
|
||||
#endif
|
||||
NSDictionary *vimState;
|
||||
}
|
||||
|
||||
|
||||
+201
-103
@@ -41,11 +41,14 @@ static int MMAlertTextFieldHeight = 22;
|
||||
// sendMessage: to actually reach Vim.
|
||||
static NSTimeInterval MMBackendProxyRequestTimeout = 0;
|
||||
|
||||
#if MM_RESEND_LAST_FAILURE
|
||||
// If a message send fails, the message will be resent after this many seconds
|
||||
// have passed. (No queue is kept, only the very last message is resent.)
|
||||
static NSTimeInterval MMResendInterval = 0.5;
|
||||
#endif
|
||||
// Timeout used for setDialogReturn:.
|
||||
static NSTimeInterval MMSetDialogReturnTimeout = 1.0;
|
||||
|
||||
// Maximum number of items in the receiveQueue. (It is hard to predict what
|
||||
// consequences changing this number will have.)
|
||||
static int MMReceiveQueueCap = 100;
|
||||
|
||||
static BOOL isUnsafeMessage(int msgid);
|
||||
|
||||
|
||||
@interface MMAlert : NSAlert {
|
||||
@@ -57,6 +60,7 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
|
||||
|
||||
@interface MMVimController (Private)
|
||||
- (void)doProcessCommandQueue:(NSArray *)queue;
|
||||
- (void)handleMessage:(int)msgid data:(NSData *)data;
|
||||
- (void)savePanelDidEnd:(NSSavePanel *)panel code:(int)code
|
||||
context:(void *)context;
|
||||
@@ -83,10 +87,8 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
- (void)popupMenuWithDescriptor:(NSArray *)desc
|
||||
atRow:(NSNumber *)row
|
||||
column:(NSNumber *)col;
|
||||
- (void)popupMenuWithAttributes:(NSDictionary *)attrs;
|
||||
- (void)connectionDidDie:(NSNotification *)notification;
|
||||
#if MM_RESEND_LAST_FAILURE
|
||||
- (void)resendTimerFired:(NSTimer *)timer;
|
||||
#endif
|
||||
@end
|
||||
|
||||
|
||||
@@ -108,6 +110,7 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
[[MMWindowController alloc] initWithVimController:self];
|
||||
backendProxy = [backend retain];
|
||||
sendQueue = [NSMutableArray new];
|
||||
receiveQueue = [NSMutableArray new];
|
||||
popupMenuItems = [[NSMutableArray alloc] init];
|
||||
toolbarItemDict = [[NSMutableDictionary alloc] init];
|
||||
pid = processIdentifier;
|
||||
@@ -152,13 +155,10 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
//NSLog(@"%@ %s", [self className], _cmd);
|
||||
isInitialized = NO;
|
||||
|
||||
#if MM_RESEND_LAST_FAILURE
|
||||
[resendData release]; resendData = nil;
|
||||
#endif
|
||||
|
||||
[serverName release]; serverName = nil;
|
||||
[backendProxy release]; backendProxy = nil;
|
||||
[sendQueue release]; sendQueue = nil;
|
||||
[receiveQueue release]; receiveQueue = nil;
|
||||
|
||||
[toolbarItemDict release]; toolbarItemDict = nil;
|
||||
[toolbar release]; toolbar = nil;
|
||||
@@ -309,42 +309,12 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
return;
|
||||
}
|
||||
|
||||
#if MM_RESEND_LAST_FAILURE
|
||||
if (resendTimer) {
|
||||
//NSLog(@"cancelling scheduled resend of %s",
|
||||
// MessageStrings[resendMsgid]);
|
||||
|
||||
[resendTimer invalidate];
|
||||
[resendTimer release];
|
||||
resendTimer = nil;
|
||||
}
|
||||
|
||||
if (resendData) {
|
||||
[resendData release];
|
||||
resendData = nil;
|
||||
}
|
||||
#endif
|
||||
|
||||
@try {
|
||||
[backendProxy processInput:msgid data:data];
|
||||
}
|
||||
@catch (NSException *e) {
|
||||
//NSLog(@"%@ %s Exception caught during DO call: %@",
|
||||
// [self className], _cmd, e);
|
||||
#if MM_RESEND_LAST_FAILURE
|
||||
//NSLog(@"%s failed, scheduling message %s for resend", _cmd,
|
||||
// MessageStrings[msgid]);
|
||||
|
||||
resendMsgid = msgid;
|
||||
resendData = [data retain];
|
||||
resendTimer = [NSTimer
|
||||
scheduledTimerWithTimeInterval:MMResendInterval
|
||||
target:self
|
||||
selector:@selector(resendTimerFired:)
|
||||
userInfo:nil
|
||||
repeats:NO];
|
||||
[resendTimer retain];
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -423,6 +393,7 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
title:(in bycopy NSString *)title
|
||||
saving:(int)saving
|
||||
{
|
||||
// TODO: Delay call until run loop is in default mode.
|
||||
if (!isInitialized) return;
|
||||
|
||||
if (!dir) {
|
||||
@@ -457,6 +428,7 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
buttonTitles:(in bycopy NSArray *)buttonTitles
|
||||
textFieldString:(in bycopy NSString *)textFieldString
|
||||
{
|
||||
// TODO: Delay call until run loop is in default mode.
|
||||
if (!(windowController && buttonTitles && [buttonTitles count])) return;
|
||||
|
||||
MMAlert *alert = [[MMAlert alloc] init];
|
||||
@@ -526,34 +498,43 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
{
|
||||
if (!isInitialized) return;
|
||||
|
||||
@try {
|
||||
unsigned i, count = [queue count];
|
||||
if (count % 2) {
|
||||
NSLog(@"WARNING: Uneven number of components (%d) in flush queue "
|
||||
"message; ignoring this message.", count);
|
||||
return;
|
||||
}
|
||||
if (inProcessCommandQueue) {
|
||||
// NOTE! If a synchronous DO call is made during
|
||||
// doProcessCommandQueue: below it may happen that this method is
|
||||
// called a second time while the synchronous message is waiting for a
|
||||
// reply (could also happen if doProcessCommandQueue: enters a modal
|
||||
// loop, see comment below). Since this method cannot be considered
|
||||
// reentrant, we queue the input and return immediately.
|
||||
//
|
||||
// If doProcessCommandQueue: enters a modal loop (happens e.g. on
|
||||
// ShowPopupMenuMsgID) then the receiveQueue could grow to become
|
||||
// arbitrarily large because DO calls still get processed. To avoid
|
||||
// this we set a cap on the size of the queue and simply clear it if it
|
||||
// becomes too large. (That is messages will be dropped and hence Vim
|
||||
// and MacVim will at least temporarily be out of sync.)
|
||||
if ([receiveQueue count] >= MMReceiveQueueCap)
|
||||
[receiveQueue removeAllObjects];
|
||||
|
||||
inProcessCommandQueue = YES;
|
||||
|
||||
//NSLog(@"======== %s BEGIN ========", _cmd);
|
||||
for (i = 0; i < count; i += 2) {
|
||||
NSData *value = [queue objectAtIndex:i];
|
||||
NSData *data = [queue objectAtIndex:i+1];
|
||||
|
||||
int msgid = *((int*)[value bytes]);
|
||||
//NSLog(@"%s%s", _cmd, MessageStrings[msgid]);
|
||||
|
||||
[self handleMessage:msgid data:data];
|
||||
}
|
||||
//NSLog(@"======== %s END ========", _cmd);
|
||||
}
|
||||
@catch (NSException *e) {
|
||||
NSLog(@"Exception caught whilst processing command queue: %@", e);
|
||||
[receiveQueue addObject:queue];
|
||||
return;
|
||||
}
|
||||
|
||||
[windowController processCommandQueueDidFinish];
|
||||
inProcessCommandQueue = NO;
|
||||
inProcessCommandQueue = YES;
|
||||
[self doProcessCommandQueue:queue];
|
||||
|
||||
int i;
|
||||
for (i = 0; i < [receiveQueue count]; ++i) {
|
||||
// Note that doProcessCommandQueue: may cause the receiveQueue to grow
|
||||
// or get cleared (due to cap being hit). Make sure to retain the item
|
||||
// to process or it may get released from under us.
|
||||
NSArray *q = [[receiveQueue objectAtIndex:i] retain];
|
||||
[self doProcessCommandQueue:q];
|
||||
[q release];
|
||||
}
|
||||
|
||||
// We assume that the remaining calls make no synchronous DO calls. If
|
||||
// that did happen anyway, the command queue could get processed out of
|
||||
// order.
|
||||
|
||||
if ([sendQueue count] > 0) {
|
||||
@try {
|
||||
@@ -566,6 +547,10 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
|
||||
[sendQueue removeAllObjects];
|
||||
}
|
||||
|
||||
[windowController processCommandQueueDidFinish];
|
||||
[receiveQueue removeAllObjects];
|
||||
inProcessCommandQueue = NO;
|
||||
}
|
||||
|
||||
- (NSToolbarItem *)toolbar:(NSToolbar *)theToolbar
|
||||
@@ -596,9 +581,74 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
|
||||
@implementation MMVimController (Private)
|
||||
|
||||
- (void)doProcessCommandQueue:(NSArray *)queue
|
||||
{
|
||||
NSMutableArray *delayQueue = nil;
|
||||
|
||||
@try {
|
||||
unsigned i, count = [queue count];
|
||||
if (count % 2) {
|
||||
NSLog(@"WARNING: Uneven number of components (%d) in command "
|
||||
"queue. Skipping...", count);
|
||||
return;
|
||||
}
|
||||
|
||||
//NSLog(@"======== %s BEGIN ========", _cmd);
|
||||
for (i = 0; i < count; i += 2) {
|
||||
NSData *value = [queue objectAtIndex:i];
|
||||
NSData *data = [queue objectAtIndex:i+1];
|
||||
|
||||
int msgid = *((int*)[value bytes]);
|
||||
//NSLog(@"%s%s", _cmd, MessageStrings[msgid]);
|
||||
|
||||
BOOL inDefaultMode = [[[NSRunLoop currentRunLoop] currentMode]
|
||||
isEqual:NSDefaultRunLoopMode];
|
||||
if (!inDefaultMode && isUnsafeMessage(msgid)) {
|
||||
// NOTE: Because we listen to DO messages in 'event tracking'
|
||||
// mode we have to take extra care when doing things like
|
||||
// releasing view items (and other Cocoa objects). Messages
|
||||
// that may be potentially "unsafe" are delayed until the run
|
||||
// loop is back to default mode at which time they are safe to
|
||||
// call again.
|
||||
// A problem with this approach is that it is hard to
|
||||
// classify which messages are unsafe. As a rule of thumb, if
|
||||
// a message may release an object used by the Cocoa framework
|
||||
// (e.g. views) then the message should be considered unsafe.
|
||||
// Delaying messages may have undesired side-effects since it
|
||||
// means that messages may not be processed in the order Vim
|
||||
// sent them, so beware.
|
||||
if (!delayQueue)
|
||||
delayQueue = [NSMutableArray array];
|
||||
|
||||
//NSLog(@"Adding unsafe message '%s' to delay queue (mode=%@)",
|
||||
// MessageStrings[msgid],
|
||||
// [[NSRunLoop currentRunLoop] currentMode]);
|
||||
[delayQueue addObject:value];
|
||||
[delayQueue addObject:data];
|
||||
} else {
|
||||
[self handleMessage:msgid data:data];
|
||||
}
|
||||
}
|
||||
//NSLog(@"======== %s END ========", _cmd);
|
||||
}
|
||||
@catch (NSException *e) {
|
||||
NSLog(@"Exception caught whilst processing command queue: %@", e);
|
||||
}
|
||||
|
||||
if (delayQueue) {
|
||||
//NSLog(@" Flushing delay queue (%d items)", [delayQueue count]/2);
|
||||
[self performSelectorOnMainThread:@selector(processCommandQueue:)
|
||||
withObject:delayQueue
|
||||
waitUntilDone:NO
|
||||
modes:[NSArray arrayWithObject:
|
||||
NSDefaultRunLoopMode]];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)handleMessage:(int)msgid data:(NSData *)data
|
||||
{
|
||||
//if (msgid != AddMenuMsgID && msgid != AddMenuItemMsgID)
|
||||
//if (msgid != AddMenuMsgID && msgid != AddMenuItemMsgID &&
|
||||
// msgid != EnableMenuItemMsgID)
|
||||
// NSLog(@"%@ %s%s", [self className], _cmd, MessageStrings[msgid]);
|
||||
|
||||
if (OpenVimWindowMsgID == msgid) {
|
||||
@@ -755,9 +805,14 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
[actionName release];
|
||||
} else if (ShowPopupMenuMsgID == msgid) {
|
||||
NSDictionary *attrs = [NSDictionary dictionaryWithData:data];
|
||||
[self popupMenuWithDescriptor:[attrs objectForKey:@"descriptor"]
|
||||
atRow:[attrs objectForKey:@"row"]
|
||||
column:[attrs objectForKey:@"column"]];
|
||||
|
||||
// The popup menu enters a modal loop so delay this call so that we
|
||||
// don't block inside processCommandQueue:.
|
||||
[self performSelectorOnMainThread:@selector(popupMenuWithAttributes:)
|
||||
withObject:attrs
|
||||
waitUntilDone:NO
|
||||
modes:[NSArray arrayWithObject:
|
||||
NSDefaultRunLoopMode]];
|
||||
} else if (SetMouseShapeMsgID == msgid) {
|
||||
const void *bytes = [data bytes];
|
||||
int shape = *((int*)bytes); bytes += sizeof(int);
|
||||
@@ -804,6 +859,8 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
[vimState release];
|
||||
vimState = [dict retain];
|
||||
}
|
||||
// IMPORTANT: When adding a new message, make sure to update
|
||||
// isUnsafeMessage() if necessary!
|
||||
} else {
|
||||
NSLog(@"WARNING: Unknown message received (msgid=%d)", msgid);
|
||||
}
|
||||
@@ -813,6 +870,15 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
context:(void *)context
|
||||
{
|
||||
NSString *path = (code == NSOKButton) ? [panel filename] : nil;
|
||||
|
||||
// NOTE! setDialogReturn: is a synchronous call so set a proper timeout to
|
||||
// avoid waiting forever for it to finish. We make this a synchronous call
|
||||
// so that we can be fairly certain that Vim doesn't think the dialog box
|
||||
// is still showing when MacVim has in fact already dismissed it.
|
||||
NSConnection *conn = [backendProxy connectionForProxy];
|
||||
NSTimeInterval oldTimeout = [conn requestTimeout];
|
||||
[conn setRequestTimeout:MMSetDialogReturnTimeout];
|
||||
|
||||
@try {
|
||||
[backendProxy setDialogReturn:path];
|
||||
|
||||
@@ -825,6 +891,9 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
@catch (NSException *e) {
|
||||
NSLog(@"Exception caught in %s %@", _cmd, e);
|
||||
}
|
||||
@finally {
|
||||
[conn setRequestTimeout:oldTimeout];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)alertDidEnd:(MMAlert *)alert code:(int)code context:(void *)context
|
||||
@@ -1054,10 +1123,9 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
NSString *rootName = [desc objectAtIndex:0];
|
||||
if ([rootName isEqual:@"ToolBar"]) {
|
||||
if (toolbar) {
|
||||
if ([desc count] == 1) {
|
||||
[windowController setToolbar:nil];
|
||||
[toolbar release]; toolbar = nil;
|
||||
} else if ([desc count] == 2) {
|
||||
// Only remove toolbar items, never actually remove the toolbar
|
||||
// itself or strange things may happen.
|
||||
if ([desc count] == 2) {
|
||||
int idx = [toolbar indexOfItemWithItemIdentifier:title];
|
||||
if (idx != NSNotFound)
|
||||
[toolbar removeItemAtIndex:idx];
|
||||
@@ -1111,7 +1179,8 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
}
|
||||
|
||||
- (void)addToolbarItemToDictionaryWithLabel:(NSString *)title
|
||||
toolTip:(NSString *)tip icon:(NSString *)icon
|
||||
toolTip:(NSString *)tip
|
||||
icon:(NSString *)icon
|
||||
{
|
||||
// If the item corresponds to a separator then do nothing, since it is
|
||||
// already defined by Cocoa.
|
||||
@@ -1123,10 +1192,12 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
NSToolbarItem *item = [[NSToolbarItem alloc] initWithItemIdentifier:title];
|
||||
[item setLabel:title];
|
||||
[item setToolTip:tip];
|
||||
[item setAction:@selector(vimMenuItemAction:)];
|
||||
[item setAction:@selector(vimToolbarItemAction:)];
|
||||
[item setAutovalidates:NO];
|
||||
|
||||
NSImage *img = [NSImage imageNamed:icon];
|
||||
if (!img)
|
||||
img = [[[NSImage alloc] initByReferencingFile:icon] autorelease];
|
||||
if (!img) {
|
||||
NSLog(@"WARNING: Could not find image with name '%@' to use as toolbar"
|
||||
" image for identifier '%@';"
|
||||
@@ -1143,8 +1214,10 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
[item release];
|
||||
}
|
||||
|
||||
- (void)addToolbarItemWithLabel:(NSString *)label tip:(NSString
|
||||
*)tip icon:(NSString *)icon atIndex:(int)idx
|
||||
- (void)addToolbarItemWithLabel:(NSString *)label
|
||||
tip:(NSString *)tip
|
||||
icon:(NSString *)icon
|
||||
atIndex:(int)idx
|
||||
{
|
||||
if (!toolbar) return;
|
||||
|
||||
@@ -1205,16 +1278,32 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
[NSMenu popUpContextMenu:menu withEvent:event forView:textView];
|
||||
}
|
||||
|
||||
- (void)popupMenuWithAttributes:(NSDictionary *)attrs
|
||||
{
|
||||
if (!attrs) return;
|
||||
|
||||
[self popupMenuWithDescriptor:[attrs objectForKey:@"descriptor"]
|
||||
atRow:[attrs objectForKey:@"row"]
|
||||
column:[attrs objectForKey:@"column"]];
|
||||
}
|
||||
|
||||
- (void)connectionDidDie:(NSNotification *)notification
|
||||
{
|
||||
//NSLog(@"%@ %s%@", [self className], _cmd, notification);
|
||||
|
||||
[self cleanup];
|
||||
|
||||
// NOTE! This causes the call to removeVimController: to be delayed.
|
||||
// NOTE! This notification can arrive at pretty much anytime, e.g. while
|
||||
// the run loop is the 'event tracking' mode. This means that Cocoa may
|
||||
// well be in the middle of processing some message while this message is
|
||||
// received. If we were to remove the vim controller straight away we may
|
||||
// free objects that Cocoa is currently using (e.g. view objects). The
|
||||
// following call ensures that the vim controller is not released until the
|
||||
// run loop is back in the 'default' mode.
|
||||
[[MMAppController sharedInstance]
|
||||
performSelectorOnMainThread:@selector(removeVimController:)
|
||||
withObject:self waitUntilDone:NO];
|
||||
withObject:self
|
||||
waitUntilDone:NO
|
||||
modes:[NSArray arrayWithObject:
|
||||
NSDefaultRunLoopMode]];
|
||||
}
|
||||
|
||||
- (NSString *)description
|
||||
@@ -1222,26 +1311,6 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
return [NSString stringWithFormat:@"%@ : isInitialized=%d inProcessCommandQueue=%d mainMenu=%@ popupMenuItems=%@ toolbar=%@", [self className], isInitialized, inProcessCommandQueue, mainMenu, popupMenuItems, toolbar];
|
||||
}
|
||||
|
||||
#if MM_RESEND_LAST_FAILURE
|
||||
- (void)resendTimerFired:(NSTimer *)timer
|
||||
{
|
||||
int msgid = resendMsgid;
|
||||
NSData *data = nil;
|
||||
|
||||
[resendTimer release];
|
||||
resendTimer = nil;
|
||||
|
||||
if (!isInitialized)
|
||||
return;
|
||||
|
||||
if (resendData)
|
||||
data = [resendData copy];
|
||||
|
||||
//NSLog(@"Resending message: %s", MessageStrings[msgid]);
|
||||
[self sendMessage:msgid data:data];
|
||||
}
|
||||
#endif
|
||||
|
||||
@end // MMVimController (Private)
|
||||
|
||||
|
||||
@@ -1346,3 +1415,32 @@ static NSTimeInterval MMResendInterval = 0.5;
|
||||
}
|
||||
|
||||
@end // MMAlert
|
||||
|
||||
|
||||
|
||||
|
||||
static BOOL
|
||||
isUnsafeMessage(int msgid)
|
||||
{
|
||||
// Messages that may release Cocoa objects must be added to this list. For
|
||||
// example, UpdateTabBarMsgID may delete NSTabViewItem objects so it goes
|
||||
// on this list.
|
||||
static int unsafeMessages[] = { // REASON MESSAGE IS ON THIS LIST:
|
||||
OpenVimWindowMsgID, // Changes lots of state
|
||||
UpdateTabBarMsgID, // May delete NSTabViewItem
|
||||
RemoveMenuItemMsgID, // Deletes NSMenuItem
|
||||
DestroyScrollbarMsgID, // Deletes NSScroller
|
||||
ExecuteActionMsgID, // Impossible to predict
|
||||
ShowPopupMenuMsgID, // Enters modal loop
|
||||
ActivateMsgID, // ?
|
||||
EnterFullscreenMsgID, // Modifies delegate of window controller
|
||||
LeaveFullscreenMsgID, // Modifies delegate of window controller
|
||||
};
|
||||
|
||||
int i, count = sizeof(unsafeMessages)/sizeof(unsafeMessages[0]);
|
||||
for (i = 0; i < count; ++i)
|
||||
if (msgid == unsafeMessages[i])
|
||||
return YES;
|
||||
|
||||
return NO;
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@
|
||||
- (MMVimView *)initWithFrame:(NSRect)frame vimController:(MMVimController *)c;
|
||||
|
||||
- (MMTextView *)textView;
|
||||
- (NSMutableArray *)scrollbars;
|
||||
- (void)cleanup;
|
||||
|
||||
- (NSSize)desiredSize;
|
||||
|
||||
@@ -208,11 +208,6 @@ enum {
|
||||
return textView;
|
||||
}
|
||||
|
||||
- (NSMutableArray *)scrollbars
|
||||
{
|
||||
return scrollbars;
|
||||
}
|
||||
|
||||
- (PSMTabBarControl *)tabBarControl
|
||||
{
|
||||
return tabBarControl;
|
||||
@@ -374,7 +369,7 @@ enum {
|
||||
[scroller setAction:@selector(scroll:)];
|
||||
|
||||
[self addSubview:scroller];
|
||||
[[self scrollbars] addObject:scroller];
|
||||
[scrollbars addObject:scroller];
|
||||
[scroller release];
|
||||
}
|
||||
|
||||
@@ -387,7 +382,7 @@ enum {
|
||||
if (!scroller) return NO;
|
||||
|
||||
[scroller removeFromSuperview];
|
||||
[[self scrollbars] removeObjectAtIndex:idx];
|
||||
[scrollbars removeObjectAtIndex:idx];
|
||||
|
||||
// If a visible scroller was removed then the vim view must resize. This
|
||||
// is handled by the window controller (the vim view never resizes itself).
|
||||
@@ -719,9 +714,9 @@ enum {
|
||||
|
||||
- (MMScroller *)scrollbarForIdentifier:(long)ident index:(unsigned *)idx
|
||||
{
|
||||
unsigned i, count = [[self scrollbars] count];
|
||||
unsigned i, count = [scrollbars count];
|
||||
for (i = 0; i < count; ++i) {
|
||||
MMScroller *scroller = [[self scrollbars] objectAtIndex:i];
|
||||
MMScroller *scroller = [scrollbars objectAtIndex:i];
|
||||
if ([scroller identifier] == ident) {
|
||||
if (idx) *idx = i;
|
||||
return scroller;
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
- (IBAction)findNext:(id)sender;
|
||||
- (IBAction)findPrevious:(id)sender;
|
||||
- (IBAction)vimMenuItemAction:(id)sender;
|
||||
- (IBAction)vimToolbarItemAction:(id)sender;
|
||||
- (IBAction)fontSizeUp:(id)sender;
|
||||
- (IBAction)fontSizeDown:(id)sender;
|
||||
|
||||
|
||||
@@ -289,9 +289,10 @@
|
||||
//NSLog(@"setTextDimensionsWithRows:%d columns:%d live:%s", rows, cols,
|
||||
// live ? "YES" : "NO");
|
||||
|
||||
// NOTE: This is the only place where the (rows,columns) of the vim view
|
||||
// are modified. Setting these values have no immediate effect, the actual
|
||||
// resizing of the view is done in processCommandQueueDidFinish.
|
||||
// NOTE: The only place where the (rows,columns) of the vim view are
|
||||
// modified is here and when entering/leaving full-screen. Setting these
|
||||
// values have no immediate effect, the actual resizing of the view is done
|
||||
// in processCommandQueueDidFinish.
|
||||
//
|
||||
// The 'live' flag indicates that this resize originated from a live
|
||||
// resize; it may very well happen that the view is no longer in live
|
||||
@@ -387,6 +388,9 @@
|
||||
|
||||
- (void)processCommandQueueDidFinish
|
||||
{
|
||||
// IMPORTANT! No synchronous DO calls are allowed in this method. They
|
||||
// may cause the command queue to get processed out of order.
|
||||
|
||||
// NOTE: Resizing is delayed until after all commands have been processed
|
||||
// since it often happens that more than one command will cause a resize.
|
||||
// If we were to immediately resize then the vim view size would jitter
|
||||
@@ -609,6 +613,14 @@
|
||||
[vimController sendMessage:ExecuteMenuMsgID data:[attrs dictionaryAsData]];
|
||||
}
|
||||
|
||||
- (IBAction)vimToolbarItemAction:(id)sender
|
||||
{
|
||||
NSArray *desc = [NSArray arrayWithObjects:@"ToolBar", [sender label], nil];
|
||||
NSDictionary *attrs = [NSDictionary dictionaryWithObject:desc
|
||||
forKey:@"descriptor"];
|
||||
[vimController sendMessage:ExecuteMenuMsgID data:[attrs dictionaryAsData]];
|
||||
}
|
||||
|
||||
- (IBAction)fontSizeUp:(id)sender
|
||||
{
|
||||
[[NSFontManager sharedFontManager] modifyFont:
|
||||
|
||||
+7
-1
@@ -29,7 +29,7 @@
|
||||
@protocol MMBackendProtocol
|
||||
- (oneway void)processInput:(int)msgid data:(in bycopy NSData *)data;
|
||||
- (oneway void)processInputAndData:(in bycopy NSArray *)messages;
|
||||
- (oneway void)setDialogReturn:(in bycopy id)obj;
|
||||
- (void)setDialogReturn:(in bycopy id)obj;
|
||||
- (NSString *)evaluateExpression:(in bycopy NSString *)expr;
|
||||
- (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard;
|
||||
@end
|
||||
@@ -38,6 +38,11 @@
|
||||
//
|
||||
// This is the protocol MMVimController implements.
|
||||
//
|
||||
// Be very careful if you want to add methods to this protocol. Since DO
|
||||
// messages may arrive while Cocoa is in the middle of processing some other
|
||||
// message be sure to consider reentrancy issues. Look at processCommandQueue:
|
||||
// to see an example of how to deal with this.
|
||||
//
|
||||
@protocol MMFrontendProtocol
|
||||
- (oneway void)processCommandQueue:(in bycopy NSArray *)queue;
|
||||
- (oneway void)showSavePanelForDirectory:(in bycopy NSString *)dir
|
||||
@@ -176,6 +181,7 @@ enum {
|
||||
InsertLinesDrawType,
|
||||
DrawCursorDrawType,
|
||||
SetCursorPosDrawType,
|
||||
DrawInvertedRectDrawType,
|
||||
};
|
||||
|
||||
enum {
|
||||
|
||||
@@ -193,10 +193,10 @@
|
||||
1D1474B40C56796D0038FA2B /* MMVimController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMVimController.m; sourceTree = "<group>"; };
|
||||
1D1474B90C567A910038FA2B /* MMWindowController.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = MMWindowController.h; sourceTree = "<group>"; };
|
||||
1D1474BA0C567A910038FA2B /* MMWindowController.m */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.objc; path = MMWindowController.m; sourceTree = "<group>"; };
|
||||
1D3D190D0CA690FF0004A0A5 /* DejaVuSansMono-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-Bold.ttf"; path = "dejavu-ttf-2.20/DejaVuSansMono-Bold.ttf"; sourceTree = "<group>"; };
|
||||
1D3D190E0CA690FF0004A0A5 /* DejaVuSansMono-BoldOblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-BoldOblique.ttf"; path = "dejavu-ttf-2.20/DejaVuSansMono-BoldOblique.ttf"; sourceTree = "<group>"; };
|
||||
1D3D190F0CA690FF0004A0A5 /* DejaVuSansMono-Oblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-Oblique.ttf"; path = "dejavu-ttf-2.20/DejaVuSansMono-Oblique.ttf"; sourceTree = "<group>"; };
|
||||
1D3D19100CA690FF0004A0A5 /* DejaVuSansMono.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = DejaVuSansMono.ttf; path = "dejavu-ttf-2.20/DejaVuSansMono.ttf"; sourceTree = "<group>"; };
|
||||
1D3D190D0CA690FF0004A0A5 /* DejaVuSansMono-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-Bold.ttf"; path = "dejavu-ttf/DejaVuSansMono-Bold.ttf"; sourceTree = "<group>"; };
|
||||
1D3D190E0CA690FF0004A0A5 /* DejaVuSansMono-BoldOblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-BoldOblique.ttf"; path = "dejavu-ttf/DejaVuSansMono-BoldOblique.ttf"; sourceTree = "<group>"; };
|
||||
1D3D190F0CA690FF0004A0A5 /* DejaVuSansMono-Oblique.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = "DejaVuSansMono-Oblique.ttf"; path = "dejavu-ttf/DejaVuSansMono-Oblique.ttf"; sourceTree = "<group>"; };
|
||||
1D3D19100CA690FF0004A0A5 /* DejaVuSansMono.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; name = DejaVuSansMono.ttf; path = "dejavu-ttf/DejaVuSansMono.ttf"; sourceTree = "<group>"; };
|
||||
1D493D570C5247BF00AB718C /* Vim */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.executable"; name = Vim; path = ../Vim; sourceTree = SOURCE_ROOT; };
|
||||
1D493DB30C52533B00AB718C /* PSMTabBarControl.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = PSMTabBarControl.xcodeproj; path = PSMTabBarControl/PSMTabBarControl.xcodeproj; sourceTree = "<group>"; };
|
||||
1D71ACA90BC702AB002F2B60 /* doc-bm-c.icns */ = {isa = PBXFileReference; lastKnownFileType = image.icns; path = "doc-bm-c.icns"; sourceTree = "<group>"; };
|
||||
@@ -698,7 +698,7 @@
|
||||
i386,
|
||||
);
|
||||
COPY_PHASE_STRIP = YES;
|
||||
CURRENT_PROJECT_VERSION = 29;
|
||||
CURRENT_PROJECT_VERSION = 32;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)",
|
||||
@@ -739,7 +739,7 @@
|
||||
buildSettings = {
|
||||
ARCHS = "$(NATIVE_ARCH)";
|
||||
COPY_PHASE_STRIP = NO;
|
||||
CURRENT_PROJECT_VERSION = 29;
|
||||
CURRENT_PROJECT_VERSION = 32;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)",
|
||||
@@ -770,7 +770,7 @@
|
||||
buildSettings = {
|
||||
ARCHS = "$(NATIVE_ARCH)";
|
||||
COPY_PHASE_STRIP = YES;
|
||||
CURRENT_PROJECT_VERSION = 29;
|
||||
CURRENT_PROJECT_VERSION = 32;
|
||||
FRAMEWORK_SEARCH_PATHS = (
|
||||
"$(inherited)",
|
||||
"$(FRAMEWORK_SEARCH_PATHS_QUOTED_1)",
|
||||
|
||||
@@ -20,21 +20,25 @@ John Karp
|
||||
Keenan Pepper
|
||||
Lars Naesbye Christensen
|
||||
Mashrab Kuvatov
|
||||
Max Berger
|
||||
Mederic Boquien
|
||||
Michael Everson
|
||||
Misu Moldovan
|
||||
Nguyen Thai Ngoc Duy
|
||||
Nicolas Mailhot
|
||||
Ognyan Kulev
|
||||
Ondrej Koala Vacha
|
||||
Peter Cernak
|
||||
Remy Oudompheng
|
||||
Roozbeh Pournader
|
||||
Sahak Petrosyan
|
||||
Sander Vesik
|
||||
Stepan Roh
|
||||
Stephen Hartke
|
||||
Tavmjong Bah
|
||||
Tim May
|
||||
Valentin Stoykov
|
||||
Vasek Stodulka
|
||||
Wesley Transue
|
||||
|
||||
$Id: AUTHORS 1910 2007-06-25 19:10:14Z ben_laenen $
|
||||
$Id: AUTHORS 2162 2007-12-27 12:39:07Z ben_laenen $
|
||||
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -1,4 +1,5 @@
|
||||
Fonts are (c) Bitstream (see below). DejaVu changes are in public domain. Glyphs imported from Arev fonts are (c) Tavmjung Bah (see below)
|
||||
Fonts are (c) Bitstream (see below). DejaVu changes are in public domain.
|
||||
Glyphs imported from Arev fonts are (c) Tavmjong Bah (see below)
|
||||
|
||||
Bitstream Vera Fonts Copyright
|
||||
------------------------------
|
||||
@@ -95,4 +96,4 @@ dealings in this Font Software without prior written authorization
|
||||
from Tavmjong Bah. For further information, contact: tavmjong @ free
|
||||
. fr.
|
||||
|
||||
$Id: LICENSE 778 2006-04-20 18:14:24Z moyogo $
|
||||
$Id: LICENSE 2133 2007-11-28 02:46:28Z lechimp $
|
||||
@@ -1,3 +1,124 @@
|
||||
Changes from 2.24 to 2.25
|
||||
- moved/added U+2E18 (by Gee Fung Sit)
|
||||
- added empty glyph for U+2064 in Sans and Serif (by Gee Fung Sit)
|
||||
- added U+22CE-U+22CF to Sans (by Gee Fung Sit)
|
||||
- Sans Oblique and Bold Oblique, Serif: reverted digits hinting instructions back to before revision 1590, which fixed mistaken debian bug #471024. This fixes Debian bug #411308. The original bug was in freetype not in the fonts (by Denis Jacquerye)
|
||||
- added U+A726-U+A729, U+A730-U+A733, U+A738-U+A73F, U+A746-U+A74B, U+A74E-U+A74F, U+A780-U+A781, U+A7FB-U+A7FF to Sans (by Gee Fung Sit)
|
||||
- added Macedonian italic glyph shape for U+0453 in Serif (by Ben Laenen)
|
||||
- changed descenders in U+0446, U+0449, U+0497, U+04A3, U+04AD (by Andrey V. Panov)
|
||||
- updated main SFD files to SplineFontDB 3.0 (Denis Jacquerye and Gee Fung Sit)
|
||||
- moved U+0561 2 up since it wasn't aligned with the baseline well (by Ben Laenen)
|
||||
- added U+2E2E to Sans (by Gee Fung Sit)
|
||||
- replaced U+2699 with simpler version in Sans (by Gee Fung Sit)
|
||||
- added a lot of hinting instructions to Latin Extended B, Greek and Coptic glyphs Sans Book (by Wesley Transue)
|
||||
- differentiated U+2219 from U+22C5 and adjusted affected references in Sans and Mono (by Gee Fung Sit)
|
||||
- made Hebrew narrower in Sans Bold and Sans Bold Oblique (by Denis Jacquerye)
|
||||
- added Kurdish and Chuvash letters from Unicode 5.1 Cyrillic Extended block (by Wesley Transue)
|
||||
- added U+1E9F, U+A644-U+A647, U+A64C-U+A64D, U+A650-U+A651, U+A654-U+A655, U+A712U+A716 to Sans (by Gee Fung Sit)
|
||||
- added several glyphs to Sans ExtraLight (by Gee Fung Sit)
|
||||
- added hinting instructions to U+046A-U+046B, U+0508-U+0509, U+050B, U+0512-U+0513 in Sans Book (by Wesley Transue)
|
||||
- corrected width of U+027E in Sans Book (by Gee Fung Sit)
|
||||
- added U+2C79, U+2C7B-U+2C7D to Sans (by Gee Fung Sit)
|
||||
- added a bunch of glyphs+small corrections to Sans Light (by Gee Fung Sit)
|
||||
- added U+0496, U+0497, U+04B0, U+04B1 (by Andrey V. Panov)
|
||||
- updated U+0493, U+049B, U+04B3, U+04B7, U+04F7 (by Andrey V. Panov)
|
||||
- further improvements in extended Cyrillic (by Andrey V. Panov)
|
||||
|
||||
Changes from 2.23 to 2.24
|
||||
- instructions for U+05C0 ׀, U+05C3 ׃, U+05F3 ׳, and U+05F4 ״ in DejaVu
|
||||
Sans. (by Wesley Transue)
|
||||
- instructions for U+2116 in Sans (by Andrey V. Panov)
|
||||
- Unicode 5.1 update: moved U+F208 to U+2C6D, U+F25F to U+2C71, added
|
||||
U+2C6E-U+2C6F, U+2C72-U+2C73, updated outline of U+2C71 in Sans. (by
|
||||
Denis Jacquerye)
|
||||
- updated and instructed U+0401 in Sans (by Andrey V. Panov)
|
||||
- fixed the bug in Sans faces where U+02EC ˬ faced the wrong direction.
|
||||
Also, added a few more glyph instructions. (by Wesley Transue)
|
||||
- removed OS2Sub and OS2Strike that weren't intentional in Sans
|
||||
ExtraLight. (by Denis Jacquerye)
|
||||
- updated instructions for U+401, U+44F in Serif Book. (by Andrey V.
|
||||
Panov)
|
||||
- instructions for U+02C4 ˄, U+02C5 ˅, U+03D8 Ϙ, U+03D9 ϙ, U+0494 Ҕ, and
|
||||
U+0495 ҕ in Sans Book. (by Wesley Transue)
|
||||
- instructions for U+01A6 Ʀ, U+0238 ȸ, U+0239 ȹ, U+02EC ˬ, and U+05C6 ׆
|
||||
in Sans Book. (by Wesley Transue)
|
||||
- DejaVuSans.sfd DejaVuSerif.sfd: updated instructions for U+447 and
|
||||
U+451 using code generated with xgridfit (by Andrey V. Panov)
|
||||
- instructions for a few glyphs in the Latin Extended-B Block, Greek
|
||||
Block, Cyrillic Block, and N'Ko block. (by Wesley Transue)
|
||||
- updated sfdnormalize.pl, and SFD files to new SFD format with empty
|
||||
lines. (by Denis Jacquerye)
|
||||
|
||||
Changes from 2.22 to 2.23
|
||||
|
||||
- fixed bug which made Condensed fonts appear instead of normal width ones
|
||||
- added U+20DB, U+20DC, and U+20E1 to Sans (by Roozbeh Pournader)
|
||||
- added hinting instructions to U+01A7, U+01AA-U+01AC, U+01AE-U+01AF,
|
||||
U+01BC-U+01BD, U+01BF, U+01F7, U+0277, U+027F, U+0285-U+0286, U+0297, U+02AF,
|
||||
U+02B4-U+02B5, U+02BD, U+030D, U+0311, U+0329, U+04A0-U+04A1 in Sans Book (by
|
||||
Wesley Transue)
|
||||
- modified hinting instructions of U+04A2 in Sans Book (by Wesley Transue)
|
||||
- added hinting instructions to U+237D, U+2423 in Mono Book and Mono Bold (by
|
||||
Wesley Transue)
|
||||
- added mathematical alphanumeric symbols to all styles (by Max Berger)
|
||||
- added Unicode 5.1 U+2E18 as U+2E18.u51 (not yet usable) to Sans (by Roozbeh
|
||||
Pournader)
|
||||
- dereferenced all glyphs with mixed references and outlines (by Denis
|
||||
Jacquerye)
|
||||
- removed non-zero width from U+0344 in Sans (by Denis Jacquerye)
|
||||
|
||||
Changes from 2.21 to 2.22
|
||||
|
||||
- directory structure has changed, we now use the Makefile
|
||||
- modified Armenian U+0565 in Sans (by Սահակ Պետրոսյան)
|
||||
- added double struck letters and numbers U+2102, U+210D, U+2115,
|
||||
U+2119-U+211A, U+211D, U+2124, U+213C-U+2140, U+2145-U+2149, U+1D538-U+1D539,
|
||||
U+1D53B-U+1D53E, U+1D540-U+1D544, U+1D546, U+1D54A-U+1D550, U+1D552-U+1D56B,
|
||||
U+1D7D8-U+1D7E1 to Serif (by Stephen Hartke)
|
||||
- added letterlike symbols U+2103, U+2109, U+2127, U+214B, U+2141-U+2144 to
|
||||
Serif (by Ben Laenen)
|
||||
- fixed outline direction of U+2143 in Sans Bold/Bold Oblique (by Ben Laenen)
|
||||
- added arrow set in Serif: arrows: U+2194-U+21FF; dingbats: U+27A1;
|
||||
supplemental arrows A: U+27F0-U+27FF; supplemental arrows B: U+2900-U+2975,
|
||||
U+297A; miscellaneous symbols and arrows: U+2B00-U+2B11 (by Ben Laenen)
|
||||
- added U+0180, U+01DE, U+01E0-01E1, U+022A, U+022C, U+0230, U+1E08-U+1E09,
|
||||
U+1E10-U+1E11, U+1EB0-U+1EB1 to Mono (by Denis Jacquerye)
|
||||
- adjusted U+01D5, U+01D7, U+01D9, U+1DB in Mono (by Denis Jacquerye)
|
||||
- added Ogham in Sans (by Wesley Transue)
|
||||
- added Yijing Hexagram Symbols in Sans (by Wesley Transue)
|
||||
- hinting instructions added to Cyrillic U+0460, U+04A6-U+04A7, U+04AC-U+04AD,
|
||||
U+04C7-U+04C8, U+04F6-U+04F7, U+04FA-U+04FB, U+050C-U+050D in Sans Book (by
|
||||
Wesley Transue)
|
||||
- adjusted Cyrillic letters U+042A, U+044A, U+044C, U+0459-U+045B, U+0462,
|
||||
U+048C-U+048D in Serif (by Andrey V. Panov)
|
||||
- hinting instructions added to Lao U+0EB7 in Sans (by Wesley Transue)
|
||||
- added Roman numerals and Claudian letter U+2160-U+2184 in Serif (by Ben
|
||||
Laenen)
|
||||
- added U+FFF9-U+FFFD to Sans, Serif and Mono (by Lars Næsbye Christensen)
|
||||
- added mathematical symbols to Serif: U+2200, U+2203-U+2204, U+2213-U+2214,
|
||||
U+2217-U+2218, U+2223-U+2226, U+2250-U+2255, U+2295-U+22AF, U+22C5 (by Ben
|
||||
Laenen)
|
||||
- modified bullet symbol U+2219 in Serif (by Ben Laenen)
|
||||
|
||||
Changes from 2.20 to 2.21
|
||||
|
||||
- added U+FE20-U+FE23 (half diacritics) to Sans (by Denis Jacquerye)
|
||||
- added anchor "half" to position right half of double marks, U+FE21 or U+FE23
|
||||
to Sans (by Denis Jacquerye)
|
||||
- shifted U+0360 up to avoid collision with some outlines in Sans (by Denis
|
||||
Jacquerye)
|
||||
- added anchor above-mark anchor to U+035D, U+035E, U+0360, U+0361 in Sans (by
|
||||
Denis Jacquerye)
|
||||
- added instructions for ff, ffi, ffl ligatures in Serif Bold (by Eugeniy
|
||||
Meshcheryakov)
|
||||
- added instructions to some N'Ko glyphs (by Wesley Transue)
|
||||
- added instructions to some Lao glyphs (by Wesley Transue)
|
||||
- cleaning up 'liga' Standard Ligature in Latin, in Sans and Sans Mono (by
|
||||
Denis Jacquerye)
|
||||
- added U+046A, U+046B (big yus) in Serif (by Andrey V. Panov)
|
||||
- added box drawing symbols to Sans and Serif (by Lars Næsbye Christensen)
|
||||
- added Makefile to improve font and packages generating (by Nicolas Mailhot)
|
||||
|
||||
Changes from 2.19 to 2.20
|
||||
|
||||
- removed TeX and TeXData tags from all sfd files (by Eugeniy Meshcheryakov)
|
||||
@@ -931,4 +1052,4 @@ Changes from 0.9 to 0.9.1:
|
||||
- proper caron shape for dcaron and tcaron
|
||||
- minor visual changes
|
||||
|
||||
$Id: NEWS 1998 2007-09-16 14:23:46Z ben_laenen $
|
||||
$Id: NEWS 2227 2008-05-19 06:41:46Z moyogo $
|
||||
@@ -1,4 +1,4 @@
|
||||
DejaVu fonts 2.20 (c)2004-2007 DejaVu fonts team
|
||||
DejaVu fonts 2.24 (c)2004-2008 DejaVu fonts team
|
||||
------------------------------------------------
|
||||
|
||||
The DejaVu fonts are a font family based on the Bitstream Vera Fonts
|
||||
@@ -46,14 +46,14 @@ For more information go to http://dejavu.sourceforge.net/.
|
||||
|
||||
Characters from Arev fonts, Copyright (c) 2006 by Tavmjong Bah:
|
||||
---------------------------
|
||||
U+01ba, U+01bf, U+01f7, U+021c, U+021d, U+0220, U+0222, U+0223,
|
||||
U+02b9, U+02ba, U+02bd, U+02c2, U+02c3, U+02c4, U+02c5, U+02d4,
|
||||
U+02d5, U+02d7, U+02ec, U+02ed, U+02ee, U+0346-034e, U+0360, U+0362,
|
||||
U+03e2-03ef, U+0460-0463, U+0466-0486, U+0488-0489, U+04a8-04a9,
|
||||
U+0500-050f, U+2055-205e, U+20B0, U+20B2-20B3, U+2102, U+210D, U+210f,
|
||||
U+2111, U+2113, U+2115, U+2118-U+211A, U+211c-211d, U+2124,U+2135,
|
||||
U+213C-U+2140, U+2295-2298, U+2308-230b, U+26A2-U+26B1, U+2701-2704,
|
||||
U+2706-2709, U+270c-274b, U+2758-275a, U+2761-2775, U+2780-2794,
|
||||
U+2798-27af, U+27b1-27be, U+fb05-fb06
|
||||
U+01BA, U+01BF, U+01F7, U+021C-U+021D, U+0220, U+0222-U+0223,
|
||||
U+02B9, U+02BA, U+02BD, U+02C2-U+02C5, U+02d4-U+02D5,
|
||||
U+02D7, U+02EC-U+02EE, U+0346-U+034E, U+0360, U+0362,
|
||||
U+03E2-03EF, U+0460-0463, U+0466-U+0486, U+0488-U+0489, U+04A8-U+04A9,
|
||||
U+0500-U+050F, U+2055-205E, U+20B0, U+20B2-U+20B3, U+2102, U+210D, U+210F,
|
||||
U+2111, U+2113, U+2115, U+2118-U+211A, U+211C-U+211D, U+2124, U+2135,
|
||||
U+213C-U+2140, U+2295-U+2298, U+2308-U+230B, U+26A2-U+26B1, U+2701-U+2704,
|
||||
U+2706-U+2709, U+270C-U+274B, U+2758-U+275A, U+2761-U+2775, U+2780-U+2794,
|
||||
U+2798-U+27AF, U+27B1-U+27BE, U+FB05-U+FB06
|
||||
|
||||
$Id: README 1998 2007-09-16 14:23:46Z ben_laenen $
|
||||
$Id: README 2192 2008-03-09 21:25:29Z moyogo $
|
||||
@@ -7,6 +7,7 @@ ab Abkhazia 100% (90/90) 93% (84/90)
|
||||
af Afrikaans 100% (69/69) 100% (69/69) 100% (69/69)
|
||||
am Amharic (0/264) (0/264) (0/264)
|
||||
ar Arabic 100% (125/125) (0/125) 100% (125/125)
|
||||
as (0/89) (0/89) (0/89)
|
||||
ast Asturian 100% (72/72) 100% (72/72) 100% (72/72)
|
||||
ava Avaric 100% (67/67) 100% (67/67) 100% (67/67)
|
||||
ay Aymara 100% (60/60) 100% (60/60) 100% (60/60)
|
||||
@@ -30,25 +31,25 @@ ce Chechen 100% (67/67) 100% (67/67)
|
||||
ch Chamorro 100% (58/58) 100% (58/58) 100% (58/58)
|
||||
chm Mari (Lower Cheremis / Upper Cheremis) 100% (76/76) 100% (76/76) 97% (74/76)
|
||||
chr Cherokee (0/85) (0/85) (0/85)
|
||||
co Corsican 100% (84/84) 100% (84/84) 100% (84/84)
|
||||
co Corsican 100% (85/85) 100% (85/85) 100% (85/85)
|
||||
cs Czech 100% (82/82) 100% (82/82) 100% (82/82)
|
||||
cu Old Church Slavonic 100% (103/103) 82% (85/103) 74% (77/103)
|
||||
cu Old Church Slavonic 100% (103/103) 84% (87/103) 74% (77/103)
|
||||
cv Chuvash 100% (74/74) 100% (74/74) 100% (74/74)
|
||||
cy Welsh 100% (78/78) 100% (78/78) 100% (78/78)
|
||||
da Danish 100% (70/70) 100% (70/70) 100% (70/70)
|
||||
de German 100% (59/59) 100% (59/59) 100% (59/59)
|
||||
de German 100% (60/60) 100% (60/60) 100% (60/60)
|
||||
dz Dzongkha (0/95) (0/95) (0/95)
|
||||
el Greek 100% (69/69) 100% (69/69) 100% (69/69)
|
||||
en English 100% (72/72) 100% (72/72) 100% (72/72)
|
||||
el Greek 100% (70/70) 100% (70/70) 100% (70/70)
|
||||
en English 100% (73/73) 100% (73/73) 100% (73/73)
|
||||
eo Esperanto 100% (64/64) 100% (64/64) 100% (64/64)
|
||||
es Spanish 100% (66/66) 100% (66/66) 100% (66/66)
|
||||
es Spanish 100% (67/67) 100% (67/67) 100% (67/67)
|
||||
et Estonian 100% (64/64) 100% (64/64) 100% (64/64)
|
||||
eu Basque 100% (56/56) 100% (56/56) 100% (56/56)
|
||||
fa Persian 100% (129/129) (0/129) 100% (129/129)
|
||||
fi Finnish 100% (62/62) 100% (62/62) 100% (62/62)
|
||||
fi Finnish 100% (63/63) 100% (63/63) 100% (63/63)
|
||||
fj Fijian 100% (52/52) 100% (52/52) 100% (52/52)
|
||||
fo Faroese 100% (68/68) 100% (68/68) 100% (68/68)
|
||||
fr French 100% (84/84) 100% (84/84) 100% (84/84)
|
||||
fr French 100% (85/85) 100% (85/85) 100% (85/85)
|
||||
ful Fulah (Fula) 100% (62/62) 100% (62/62) 100% (62/62)
|
||||
fur Friulian 100% (66/66) 100% (66/66) 100% (66/66)
|
||||
fy Frisian 100% (75/75) 100% (75/75) 100% (75/75)
|
||||
@@ -74,10 +75,10 @@ ie Interlingue 100% (52/52) 100% (52/52)
|
||||
ik Inupiaq (Inupiak, Eskimo) 100% (68/68) 100% (68/68) 100% (68/68)
|
||||
io Ido 100% (52/52) 100% (52/52) 100% (52/52)
|
||||
is Icelandic 100% (70/70) 100% (70/70) 100% (70/70)
|
||||
it Italian 100% (72/72) 100% (72/72) 100% (72/72)
|
||||
it Italian 100% (73/73) 100% (73/73) 100% (73/73)
|
||||
iu Inuktitut 100% (161/161) (0/161) (0/161)
|
||||
ja Japanese (0/6538) (0/6538) (0/6538)
|
||||
ka Georgian 100% (34/34) 100% (34/34) 100% (34/34)
|
||||
ka Georgian 100% (33/33) 100% (33/33) 100% (33/33)
|
||||
kaa Kara-Kalpak (Karakalpak) 100% (78/78) 100% (78/78) 100% (78/78)
|
||||
ki Kikuyu 100% (56/56) 100% (56/56) 100% (56/56)
|
||||
kk Kazakh 100% (77/77) 100% (77/77) 100% (77/77)
|
||||
@@ -96,6 +97,7 @@ ky Kirgiz 100% (70/70) 100% (70/70)
|
||||
la Latin 100% (68/68) 100% (68/68) 100% (68/68)
|
||||
lb Luxembourgish (Letzeburgesch) 100% (75/75) 100% (75/75) 100% (75/75)
|
||||
lez Lezghian (Lezgian) 100% (67/67) 100% (67/67) 100% (67/67)
|
||||
ln Lingala 100% (81/81) 100% (81/81) 100% (81/81)
|
||||
lo Lao 100% (65/65) (0/65) 70% (46/65)
|
||||
lt Lithuanian 100% (70/70) 100% (70/70) 100% (70/70)
|
||||
lv Latvian 100% (78/78) 100% (78/78) 100% (78/78)
|
||||
@@ -112,9 +114,11 @@ my Burmese (Myanmar) (0/48) (0/48)
|
||||
nb Norwegian Bokmal 100% (70/70) 100% (70/70) 100% (70/70)
|
||||
nds Low Saxon 100% (59/59) 100% (59/59) 100% (59/59)
|
||||
ne Nepali (Devanagari script) (0/68) (0/68) (0/68)
|
||||
nl Dutch 100% (82/82) 100% (82/82) 100% (82/82)
|
||||
nl Dutch 100% (83/83) 100% (83/83) 100% (83/83)
|
||||
nn Norwegian Nynorsk 100% (76/76) 100% (76/76) 100% (76/76)
|
||||
no Norwegian (Bokmal) 100% (70/70) 100% (70/70) 100% (70/70)
|
||||
nr Ndebele, South 100% (52/52) 100% (52/52) 100% (52/52)
|
||||
nso Northern Sotho 100% (58/58) 100% (58/58) 100% (58/58)
|
||||
ny Chichewa 100% (54/54) 100% (54/54) 100% (54/54)
|
||||
oc Occitan 100% (70/70) 100% (70/70) 100% (70/70)
|
||||
om Oromo or Galla 100% (52/52) 100% (52/52) 100% (52/52)
|
||||
@@ -124,7 +128,7 @@ pa Punjabi (Gurumukhi script) (0/63) (0/63)
|
||||
pl Polish 100% (70/70) 100% (70/70) 100% (70/70)
|
||||
ps-af Pashto in Afghanistan 83% (41/49) (0/49) 83% (41/49)
|
||||
ps-pk Pashto in Pakistan 81% (40/49) (0/49) 81% (40/49)
|
||||
pt Portuguese 100% (82/82) 100% (82/82) 100% (82/82)
|
||||
pt Portuguese 100% (83/83) 100% (83/83) 100% (83/83)
|
||||
rm Rhaeto-Romance (Romansch) 100% (66/66) 100% (66/66) 100% (66/66)
|
||||
ro Romanian 100% (62/62) 100% (62/62) 100% (62/62)
|
||||
ru Russian 100% (66/66) 100% (66/66) 100% (66/66)
|
||||
@@ -145,6 +149,8 @@ sms Skolt Sami 100% (80/80) 100% (80/80)
|
||||
so Somali 100% (52/52) 100% (52/52) 100% (52/52)
|
||||
sq Albanian 100% (56/56) 100% (56/56) 100% (56/56)
|
||||
sr Serbian 100% (76/76) 100% (76/76) 100% (76/76)
|
||||
ss Swati 100% (52/52) 100% (52/52) 100% (52/52)
|
||||
st Sotho, Southern 100% (52/52) 100% (52/52) 100% (52/52)
|
||||
sv Swedish 100% (68/68) 100% (68/68) 100% (68/68)
|
||||
sw Swahili 100% (52/52) 100% (52/52) 100% (52/52)
|
||||
syr Syriac (0/45) (0/45) (0/45)
|
||||
@@ -152,16 +158,16 @@ ta Tamil (0/48) (0/48)
|
||||
te Telugu (0/80) (0/80) (0/80)
|
||||
tg Tajik 100% (78/78) 100% (78/78) 97% (76/78)
|
||||
th Thai 1% (1/87) (0/87) (0/87)
|
||||
ti-er Eritrean Tigrinya (0/256) (0/256) (0/256)
|
||||
ti-et Ethiopian Tigrinya (0/282) (0/282) (0/282)
|
||||
ti-er Eritrean Tigrinya (0/255) (0/255) (0/255)
|
||||
ti-et Ethiopian Tigrinya (0/281) (0/281) (0/281)
|
||||
tig Tigre (0/221) (0/221) (0/221)
|
||||
tk Turkmen 100% (74/74) 100% (74/74) 97% (72/74)
|
||||
tk Turkmen 100% (74/74) 100% (74/74) 100% (74/74)
|
||||
tl Tagalog (0/19) (0/19) (0/19)
|
||||
tn Tswana 100% (56/56) 100% (56/56) 100% (56/56)
|
||||
tn Tswana 100% (58/58) 100% (58/58) 100% (58/58)
|
||||
to Tonga 100% (53/53) 100% (53/53) 100% (53/53)
|
||||
tr Turkish 100% (70/70) 100% (70/70) 100% (70/70)
|
||||
ts Tsonga 100% (52/52) 100% (52/52) 100% (52/52)
|
||||
tt Tatar 100% (76/76) 100% (76/76) 97% (74/76)
|
||||
tt Tatar 100% (76/76) 100% (76/76) 100% (76/76)
|
||||
tw Twi 100% (73/73) 100% (73/73) 100% (73/73)
|
||||
tyv Tuvinian 100% (70/70) 100% (70/70) 100% (70/70)
|
||||
ug Uighur 100% (125/125) (0/125) 100% (125/125)
|
||||
@@ -169,7 +175,7 @@ uk Ukrainian 100% (72/72) 100% (72/72)
|
||||
ur Urdu 94% (137/145) (0/145) 97% (141/145)
|
||||
uz Uzbek 100% (68/68) 100% (68/68) 100% (68/68)
|
||||
ven Venda 100% (62/62) 100% (62/62) 100% (62/62)
|
||||
vi Vietnamese 100% (194/194) 77% (150/194) 62% (122/194)
|
||||
vi Vietnamese 100% (194/194) 77% (150/194) 63% (124/194)
|
||||
vo Volapuk 100% (54/54) 100% (54/54) 100% (54/54)
|
||||
vot Votic 100% (62/62) 100% (62/62) 100% (62/62)
|
||||
wa Walloon 100% (70/70) 100% (70/70) 100% (70/70)
|
||||
@@ -181,7 +187,7 @@ yi Yiddish 100% (27/27) (0/27)
|
||||
yo Yoruba 100% (119/119) 100% (119/119) 100% (119/119)
|
||||
zh-cn Chinese (simplified) 0% (2/6765) 0% (2/6765) 0% (2/6765)
|
||||
zh-hk Chinese Hong Kong Supplementary Character Set (0/2213) (0/2213) (0/2213)
|
||||
zh-mo Chinese in Macau (0/13063) (0/13063) (0/13063)
|
||||
zh-mo Chinese in Macau (0/2213) (0/2213) (0/2213)
|
||||
zh-sg Chinese in Singapore 0% (2/6765) 0% (2/6765) 0% (2/6765)
|
||||
zh-tw Chinese (traditional) (0/13063) (0/13063) (0/13063)
|
||||
zu Zulu 100% (52/52) 100% (52/52) 100% (52/52)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,5 @@
|
||||
This is the Unicode coverage file for DejaVu fonts
|
||||
($Id: unicover.txt 2000 2007-09-16 14:34:23Z ben_laenen $)
|
||||
($Id$)
|
||||
|
||||
Control and similar characters are discounted from totals.
|
||||
|
||||
@@ -7,12 +7,12 @@ Control and similar characters are discounted from totals.
|
||||
U+0000 Basic Latin 100% (95/95) 100% (95/95) 100% (95/95)
|
||||
U+0080 Latin-1 Supplement 100% (96/96) 100% (96/96) 100% (96/96)
|
||||
U+0100 Latin Extended-A 100% (128/128) 100% (128/128) 100% (128/128)
|
||||
U+0180 Latin Extended-B 100% (208/208) 90% (189/208) 78% (164/208)
|
||||
U+0180 Latin Extended-B 100% (208/208) 90% (189/208) 82% (172/208)
|
||||
U+0250 IPA Extensions 100% (96/96) 100% (96/96) 100% (96/96)
|
||||
U+02b0 Spacing Modifier Letters 78% (63/80) 56% (45/80) 57% (46/80)
|
||||
U+0300 Combining Diacritical Marks 82% (92/112) 60% (68/112) 59% (67/112)
|
||||
U+0370 Greek and Coptic 100% (127/127) 86% (110/127) 86% (110/127)
|
||||
U+0400 Cyrillic 100% (255/255) 76% (194/255) 66% (170/255)
|
||||
U+0400 Cyrillic 100% (255/255) 77% (198/255) 68% (174/255)
|
||||
U+0500 Cyrillic Supplement 100% (20/20) (0/20) (0/20)
|
||||
U+0530 Armenian 100% (86/86) (0/86) (0/86)
|
||||
U+0590 Hebrew 62% (54/87) (0/87) (0/87)
|
||||
@@ -41,7 +41,7 @@ U+1200 Ethiopic (0/356) (0/356)
|
||||
U+1380 Ethiopic Supplement (0/26) (0/26) (0/26)
|
||||
U+13a0 Cherokee (0/85) (0/85) (0/85)
|
||||
U+1400 Unified Canadian Aboriginal Syllabics 64% (404/630) (0/630) (0/630)
|
||||
U+1680 Ogham (0/29) (0/29) (0/29)
|
||||
U+1680 Ogham 100% (29/29) (0/29) (0/29)
|
||||
U+16a0 Runic (0/81) (0/81) (0/81)
|
||||
U+1700 Tagalog (0/20) (0/20) (0/20)
|
||||
U+1720 Hanunoo (0/23) (0/23) (0/23)
|
||||
@@ -58,32 +58,32 @@ U+1b00 Balinese (0/121) (0/121)
|
||||
U+1d00 Phonetic Extensions 82% (105/128) 48% (62/128) 48% (62/128)
|
||||
U+1d80 Phonetic Extensions Supplement 59% (38/64) 57% (37/64) 57% (37/64)
|
||||
U+1dc0 Combining Diacritical Marks Supplement 46% (6/13) (0/13) (0/13)
|
||||
U+1e00 Latin Extended Additional 100% (246/246) 78% (192/246) 54% (134/246)
|
||||
U+1e00 Latin Extended Additional 100% (246/246) 78% (192/246) 56% (140/246)
|
||||
U+1f00 Greek Extended 100% (233/233) 100% (233/233) 100% (233/233)
|
||||
U+2000 General Punctuation 98% (104/106) 61% (65/106) 42% (45/106)
|
||||
U+2070 Superscripts and Subscripts 100% (34/34) 100% (34/34) 100% (34/34)
|
||||
U+20a0 Currency Symbols 100% (22/22) 27% (6/22) 22% (5/22)
|
||||
U+20d0 Combining Diacritical Marks for Symbols 12% (4/32) (0/32) (0/32)
|
||||
U+2100 Letterlike Symbols 94% (75/79) 7% (6/79) 8% (7/79)
|
||||
U+2150 Number Forms 100% (50/50) 26% (13/50) 26% (13/50)
|
||||
U+2190 Arrows 100% (112/112) 3% (4/112) 100% (112/112)
|
||||
U+2200 Mathematical Operators 95% (245/256) 11% (30/256) 56% (145/256)
|
||||
U+20d0 Combining Diacritical Marks for Symbols 21% (7/32) (0/32) (0/32)
|
||||
U+2100 Letterlike Symbols 94% (75/79) 39% (31/79) 8% (7/79)
|
||||
U+2150 Number Forms 100% (50/50) 100% (50/50) 26% (13/50)
|
||||
U+2190 Arrows 100% (112/112) 100% (112/112) 100% (112/112)
|
||||
U+2200 Mathematical Operators 96% (247/256) 39% (100/256) 56% (145/256)
|
||||
U+2300 Miscellaneous Technical 27% (64/232) 6% (16/232) 50% (117/232)
|
||||
U+2400 Control Pictures 5% (2/39) 2% (1/39) 2% (1/39)
|
||||
U+2440 Optical Character Recognition (0/11) (0/11) (0/11)
|
||||
U+2460 Enclosed Alphanumerics 6% (10/160) (0/160) (0/160)
|
||||
U+2500 Box Drawing (0/128) (0/128) 100% (128/128)
|
||||
U+2500 Box Drawing 100% (128/128) 100% (128/128) 100% (128/128)
|
||||
U+2580 Block Elements 100% (32/32) 100% (32/32) 100% (32/32)
|
||||
U+25a0 Geometric Shapes 100% (96/96) 100% (96/96) 100% (96/96)
|
||||
U+2600 Miscellaneous Symbols 100% (176/176) 17% (30/176) 84% (149/176)
|
||||
U+2700 Dingbats 100% (174/174) (0/174) 82% (144/174)
|
||||
U+2700 Dingbats 100% (174/174) 0% (1/174) 82% (144/174)
|
||||
U+27c0 Miscellaneous Mathematical Symbols-A 17% (7/39) 7% (3/39) 7% (3/39)
|
||||
U+27f0 Supplemental Arrows-A 100% (16/16) (0/16) (0/16)
|
||||
U+27f0 Supplemental Arrows-A 100% (16/16) 100% (16/16) (0/16)
|
||||
U+2800 Braille Patterns 100% (256/256) 100% (256/256) (0/256)
|
||||
U+2900 Supplemental Arrows-B 4% (6/128) (0/128) (0/128)
|
||||
U+2900 Supplemental Arrows-B 4% (6/128) 100% (128/128) (0/128)
|
||||
U+2980 Miscellaneous Mathematical Symbols-B 10% (13/128) 0% (1/128) 2% (3/128)
|
||||
U+2a00 Supplemental Mathematical Operators 28% (72/256) 1% (4/256) 0% (1/256)
|
||||
U+2b00 Miscellaneous Symbols and Arrows 100% (31/31) 29% (9/31) 29% (9/31)
|
||||
U+2b00 Miscellaneous Symbols and Arrows 100% (31/31) 87% (27/31) 29% (9/31)
|
||||
U+2c00 Glagolitic (0/94) (0/94) (0/94)
|
||||
U+2c60 Latin Extended-C 100% (17/17) 52% (9/17) 17% (3/17)
|
||||
U+2c80 Coptic (0/114) (0/114) (0/114)
|
||||
@@ -106,11 +106,11 @@ U+31f0 Katakana Phonetic Extensions (0/16) (0/16)
|
||||
U+3200 Enclosed CJK Letters and Months (0/242) (0/242) (0/242)
|
||||
U+3300 CJK Compatibility (0/256) (0/256) (0/256)
|
||||
U+3400 CJK Unified Ideographs Extension A (0/0) (0/0) (0/0)
|
||||
U+4dc0 Yijing Hexagram Symbols (0/64) (0/64) (0/64)
|
||||
U+4dc0 Yijing Hexagram Symbols 100% (64/64) (0/64) (0/64)
|
||||
U+4e00 CJK Unified Ideographs (0/0) (0/0) (0/0)
|
||||
U+a000 Yi Syllables (0/1165) (0/1165) (0/1165)
|
||||
U+a490 Yi Radicals (0/55) (0/55) (0/55)
|
||||
U+a700 Modifier Tone Letters (0/27) (0/27) (0/27)
|
||||
U+a700 Modifier Tone Letters 18% (5/27) (0/27) (0/27)
|
||||
U+a720 Latin Extended-D (0/2) (0/2) (0/2)
|
||||
U+a800 Syloti Nagri (0/44) (0/44) (0/44)
|
||||
U+a840 Phags-pa (0/56) (0/56) (0/56)
|
||||
@@ -124,12 +124,12 @@ U+fb00 Alphabetic Presentation Forms 100% (58/58) 12% (7/58)
|
||||
U+fb50 Arabic Presentation Forms-A 11% (70/595) (0/595) 12% (72/595)
|
||||
U+fe00 Variation Selectors 100% (16/16) 100% (16/16) (0/16)
|
||||
U+fe10 Vertical Forms (0/10) (0/10) (0/10)
|
||||
U+fe20 Combining Half Marks (0/4) (0/4) (0/4)
|
||||
U+fe20 Combining Half Marks 100% (4/4) (0/4) (0/4)
|
||||
U+fe30 CJK Compatibility Forms (0/32) (0/32) (0/32)
|
||||
U+fe50 Small Form Variants (0/26) (0/26) (0/26)
|
||||
U+fe70 Arabic Presentation Forms-B 100% (141/141) (0/141) 100% (141/141)
|
||||
U+ff00 Halfwidth and Fullwidth Forms (0/225) (0/225) (0/225)
|
||||
U+fff0 Specials 20% (1/5) 20% (1/5) 20% (1/5)
|
||||
U+fff0 Specials 100% (5/5) 100% (5/5) 100% (5/5)
|
||||
U+10000 Linear B Syllabary (0/88) (0/88) (0/88)
|
||||
U+10080 Linear B Ideograms (0/123) (0/123) (0/123)
|
||||
U+10100 Aegean Numbers (0/57) (0/57) (0/57)
|
||||
@@ -151,7 +151,7 @@ U+1d100 Musical Symbols (0/219) (0/219)
|
||||
U+1d200 Ancient Greek Musical Notation (0/70) (0/70) (0/70)
|
||||
U+1d300 Tai Xuan Jing Symbols 100% (87/87) (0/87) (0/87)
|
||||
U+1d360 Counting Rod Numerals (0/18) (0/18) (0/18)
|
||||
U+1d400 Mathematical Alphanumeric Symbols 4% (45/996) (0/996) (0/996)
|
||||
U+1d400 Mathematical Alphanumeric Symbols 10% (107/996) 5% (55/996) 6% (62/996)
|
||||
U+20000 CJK Unified Ideographs Extension B (0/0) (0/0) (0/0)
|
||||
U+2f800 CJK Compatibility Ideographs Supplement (0/542) (0/542) (0/542)
|
||||
U+e0000 Tags (0/98) (0/98) (0/98)
|
||||
+41
-17
@@ -426,6 +426,17 @@ gui_mch_new_colors(void)
|
||||
foreground:gui.def_norm_pixel];
|
||||
}
|
||||
|
||||
/*
|
||||
* Invert a rectangle from row r, column c, for nr rows and nc columns.
|
||||
*/
|
||||
void
|
||||
gui_mch_invert_rectangle(int r, int c, int nr, int nc, int invert)
|
||||
{
|
||||
[[MMBackend sharedInstance] drawInvertedRectAtRow:r column:c numRows:nr
|
||||
numColumns:nc invert:invert];
|
||||
}
|
||||
|
||||
|
||||
|
||||
// -- Tabline ---------------------------------------------------------------
|
||||
|
||||
@@ -680,11 +691,6 @@ gui_mch_add_menu(vimmenu_T *menu, int idx)
|
||||
void
|
||||
gui_mch_add_menu_item(vimmenu_T *menu, int idx)
|
||||
{
|
||||
// NOTE! If 'iconfile' is not set but 'iconidx' is, use the name of the
|
||||
// menu item. (Should correspond to a stock item.)
|
||||
char_u *icon = menu->iconfile ? menu->iconfile :
|
||||
menu->iconidx >= 0 ? menu->dname :
|
||||
NULL;
|
||||
char_u *tip = menu->strings[MENU_INDEX_TIP]
|
||||
? menu->strings[MENU_INDEX_TIP] : menu->actext;
|
||||
NSArray *desc = descriptor_for_menu(menu);
|
||||
@@ -692,6 +698,18 @@ gui_mch_add_menu_item(vimmenu_T *menu, int idx)
|
||||
? [NSString stringWithFormat:@"%C", specialKeyToNSKey(menu->mac_key)]
|
||||
: [NSString string];
|
||||
int modifierMask = vimModMaskToEventModifierFlags(menu->mac_mods);
|
||||
char_u *icon = NULL;
|
||||
|
||||
if (menu_is_toolbar(menu->parent->name)) {
|
||||
char_u fname[MAXPATHL];
|
||||
|
||||
// TODO: Ensure menu->iconfile exists (if != NULL)
|
||||
icon = menu->iconfile;
|
||||
if (!icon && gui_find_bitmap(menu->name, fname, "bmp") == OK)
|
||||
icon = fname;
|
||||
if (!icon && menu->iconidx >= 0)
|
||||
icon = menu->dname;
|
||||
}
|
||||
|
||||
[[MMBackend sharedInstance] queueMessage:AddMenuItemMsgID properties:
|
||||
[NSDictionary dictionaryWithObjectsAndKeys:
|
||||
@@ -1286,6 +1304,9 @@ gui_mch_browse(
|
||||
//NSLog(@"gui_mch_browse(saving=%d, title=%s, dflt=%s, ext=%s, initdir=%s,"
|
||||
// " filter=%s", saving, title, dflt, ext, initdir, filter);
|
||||
|
||||
// Ensure no data is on the output queue before presenting the dialog.
|
||||
gui_macvim_force_flush();
|
||||
|
||||
#ifdef FEAT_MBYTE
|
||||
title = CONVERT_TO_UTF8(title);
|
||||
initdir = CONVERT_TO_UTF8(initdir);
|
||||
@@ -1319,6 +1340,9 @@ gui_mch_dialog(
|
||||
// "dfltbutton=%d textfield=%s)", type, title, message, buttons,
|
||||
// dfltbutton, textfield);
|
||||
|
||||
// Ensure no data is on the output queue before presenting the dialog.
|
||||
gui_macvim_force_flush();
|
||||
|
||||
#ifdef FEAT_MBYTE
|
||||
title = CONVERT_TO_UTF8(title);
|
||||
message = CONVERT_TO_UTF8(message);
|
||||
@@ -1448,15 +1472,6 @@ gui_mch_iconify(void)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Invert a rectangle from row r, column c, for nr rows and nc columns.
|
||||
*/
|
||||
void
|
||||
gui_mch_invert_rectangle(int r, int c, int nr, int nc)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
#if defined(FEAT_EVAL) || defined(PROTO)
|
||||
/*
|
||||
* Bring the Vim window to the foreground.
|
||||
@@ -2009,17 +2024,26 @@ static int vimModMaskToEventModifierFlags(int mods)
|
||||
@implementation NSString (VimStrings)
|
||||
+ (id)stringWithVimString:(char_u *)s
|
||||
{
|
||||
// This method ensures a non-nil string is returned. If 's' cannot be
|
||||
// converted to a utf-8 string it is assumed to be latin-1. If conversion
|
||||
// still fails an empty NSString is returned.
|
||||
NSString *string = nil;
|
||||
if (s) {
|
||||
#ifdef FEAT_MBYTE
|
||||
s = CONVERT_TO_UTF8(s);
|
||||
#endif
|
||||
NSString *string = [NSString stringWithUTF8String:(char*)s];
|
||||
string = [NSString stringWithUTF8String:(char*)s];
|
||||
if (!string) {
|
||||
// HACK! Apparently 's' is not a valid utf-8 string, maybe it is
|
||||
// latin-1?
|
||||
string = [NSString stringWithCString:(char*)s
|
||||
encoding:NSISOLatin1StringEncoding];
|
||||
}
|
||||
#ifdef FEAT_MBYTE
|
||||
CONVERT_TO_UTF8_FREE(s);
|
||||
#endif
|
||||
return string;
|
||||
}
|
||||
|
||||
return [NSString string];
|
||||
return string != nil ? string : [NSString string];
|
||||
}
|
||||
@end
|
||||
|
||||
@@ -83,8 +83,6 @@ an <silent> 9900.301 Window.Minimize\ All <Nop>
|
||||
an <silent> 9900.310 Window.Zoom <Nop>
|
||||
an <silent> 9900.311 Window.Zoom\ All <Nop>
|
||||
an <silent> 9900.320 Window.Toggle\ Full\ Screen\ Mode :set invfullscreen<CR>
|
||||
an <silent> 9900.325 Window.Cycle\ Through\ Windows <Nop>
|
||||
an <silent> 9900.326 Window.Cycle\ Backwards\ Through\ Windows <Nop>
|
||||
an 9900.330 Window.-SEP1- <Nop>
|
||||
" TODO! Grey out if no tabs are visible.
|
||||
an <silent> 9900.340 Window.Previous\ Tab :tabprevious<CR>
|
||||
@@ -244,8 +242,6 @@ macm Window.Minimize\ All key=<D-M-m> action=miniaturizeAll: alt=YES
|
||||
macm Window.Zoom key=<D-C-z> action=performZoom:
|
||||
macm Window.Zoom\ All key=<D-M-C-z> action=zoomAll: alt=YES
|
||||
macm Window.Toggle\ Full\ Screen\ Mode key=<D-F>
|
||||
macm Window.Cycle\ Through\ Windows key=<D-`> action=_cycleWindows:
|
||||
macm Window.Cycle\ Backwards\ Through\ Windows key=<D-S-`> action=_cycleWindowsBackwards: alt=YES
|
||||
macm Window.Previous\ Tab key=<D-{>
|
||||
macm Window.Next\ Tab key=<D-}>
|
||||
macm Window.Bring\ All\ To\ Front action=arrangeInFront:
|
||||
|
||||
@@ -41,17 +41,84 @@
|
||||
-->
|
||||
|
||||
<item>
|
||||
<title>Snapshot 29 released</title>
|
||||
<title>Snapshot 32 released</title>
|
||||
<description><![CDATA[
|
||||
<h1>MacVim snapshot 29 released</h1>
|
||||
<h1>MacVim snapshot 32 released</h1>
|
||||
|
||||
<p><em> This snapshot contains fixes for several severe bugs; I strongly suggest
|
||||
that you update now! </em></p>
|
||||
|
||||
<p> Changes since snapshot 31:
|
||||
<ul>
|
||||
<li> Fix several bugs that caused MacVim to crash </li>
|
||||
<li> Console dialogs work once again (set go+=c) </li>
|
||||
<li> Background processes work (:sh ... &) </li>
|
||||
<li> Ctrl-Shift can be used for modeless selection </li>
|
||||
<li> No crashes with HTML plugin </li>
|
||||
<li> Toolbar is a bit better at finding icons (this still needs some work)
|
||||
</li>
|
||||
<li> Latest Vim source code and runtime files merged </li>
|
||||
</ul>
|
||||
</p>
|
||||
]]></description>
|
||||
<pubDate>Fri, 22 Jun 2008 13:13 CET</pubDate>
|
||||
<enclosure type="application/octet-stream"
|
||||
url="http://macvim.googlecode.com/files/MacVim-snapshot-32.tbz"
|
||||
length="8194915"
|
||||
sparkle:version="32"
|
||||
sparkle:shortVersionString="7.1"
|
||||
/>
|
||||
</item>
|
||||
|
||||
|
||||
<item>
|
||||
<title>Snapshot 31 released</title>
|
||||
<description><![CDATA[
|
||||
<h1>MacVim snapshot 31 released</h1>
|
||||
<p> Changes since snapshot 30:
|
||||
<ul>
|
||||
<li> Fixed problems with menus on OS X 10.4 and a related crash. </li>
|
||||
<li> Dialog box handling has been updated. This fixes a problem where the
|
||||
"swap file warning" dialog would pop up before the informational text in
|
||||
the editor window updated. Hopefully this will also cure various other
|
||||
problems with dialogs (e.g. nothing happening when opening files from a
|
||||
dialog box). </li>
|
||||
<li> Added dock menu with "New Window" item. This is useful with "Spaces" on
|
||||
OS X 10.5 since you can use this menu to open a new MacVim window on any
|
||||
"space" when another editor window is already open. (Also, now there is
|
||||
always a way to open a new window, even if the menus are customized,
|
||||
or if "-u NONE" is used.) </li>
|
||||
<li> I have started trying to fix "modeless selection" and it sort of works
|
||||
on my machine, but I've had one report stating that its not quite
|
||||
working so you mileage may vary. Make sure to let me know what works
|
||||
and doesn't so that I can fix this properly. (Try selecting text from
|
||||
the command line.) </li>
|
||||
<li> The default font (DejaVu Sans Mono) has been updated to version 2.25.
|
||||
</li>
|
||||
<li> Latest Vim source code merged </li>
|
||||
</ul>
|
||||
</p>
|
||||
]]></description>
|
||||
<pubDate>Fri, 13 Jun 2008 16:00 CET</pubDate>
|
||||
<enclosure type="application/octet-stream"
|
||||
url="http://macvim.googlecode.com/files/MacVim-snapshot-31.tbz"
|
||||
length="8182620"
|
||||
sparkle:version="31"
|
||||
sparkle:shortVersionString="7.1"
|
||||
/>
|
||||
</item>
|
||||
|
||||
|
||||
<item>
|
||||
<title>Snapshot 30 released</title>
|
||||
<description><![CDATA[
|
||||
<h1>MacVim snapshot 30 released</h1>
|
||||
<p> Changes since snapshot 28:
|
||||
<ul>
|
||||
<li> copy&paste and other "Edit" menu items now work as expected with dialogs
|
||||
(such as open/save). </li>
|
||||
<li> some menus (such as the "Window" menu) has got some new items </li>
|
||||
<li> general menu improvements when no editor window is open </li>
|
||||
<li> window-cycling key Cmd-` is no longer hard-coded and can be changed with
|
||||
:macmenu command </li>
|
||||
<li> ability to access some OS X default Cmd-keys even if menus are
|
||||
completely altered (e.g. when starting with "-u NONE") </li>
|
||||
<li> QuickLook works with .vim files (patch by Nico Weber) </li>
|
||||
@@ -65,12 +132,14 @@
|
||||
<li> latest vim patches and runtime files </li>
|
||||
</ul>
|
||||
</p>
|
||||
<p> The only difference between snapshot 29 and 30 is that the former did not
|
||||
handle window cycling very well with international keyboard layouts. </p>
|
||||
]]></description>
|
||||
<pubDate>Sun, 7 Jun 2008 12:57 CET</pubDate>
|
||||
<pubDate>Sun, 8 Jun 2008 16:43 CET</pubDate>
|
||||
<enclosure type="application/octet-stream"
|
||||
url="http://macvim.googlecode.com/files/MacVim-snapshot-29.tbz"
|
||||
length="8137324"
|
||||
sparkle:version="29"
|
||||
url="http://macvim.googlecode.com/files/MacVim-snapshot-30.tbz"
|
||||
length="8137308"
|
||||
sparkle:version="30"
|
||||
sparkle:shortVersionString="7.1"
|
||||
/>
|
||||
</item>
|
||||
|
||||
+17
-13
@@ -1113,7 +1113,7 @@ GTK_IPATH = $(GUI_INC_LOC)
|
||||
GTK_LIBS_DIR = $(GUI_LIB_LOC)
|
||||
GTK_LIBS1 =
|
||||
GTK_LIBS2 = $(GTK_LIBNAME)
|
||||
GTK_INSTALL = install_normal
|
||||
GTK_INSTALL = install_normal install_gui_extra
|
||||
GTK_TARGETS = installglinks
|
||||
GTK_MAN_TARGETS = yes
|
||||
GTK_TESTTARGET = gui
|
||||
@@ -1130,7 +1130,7 @@ MOTIF_IPATH = $(GUI_INC_LOC)
|
||||
MOTIF_LIBS_DIR = $(GUI_LIB_LOC)
|
||||
MOTIF_LIBS1 =
|
||||
MOTIF_LIBS2 = $(MOTIF_LIBNAME) -lXt
|
||||
MOTIF_INSTALL = install_normal
|
||||
MOTIF_INSTALL = install_normal install_gui_extra
|
||||
MOTIF_TARGETS = installglinks
|
||||
MOTIF_MAN_TARGETS = yes
|
||||
MOTIF_TESTTARGET = gui
|
||||
@@ -1160,7 +1160,7 @@ ATHENA_IPATH = $(GUI_INC_LOC)
|
||||
ATHENA_LIBS_DIR = $(GUI_LIB_LOC)
|
||||
ATHENA_LIBS1 = $(XAW_LIB)
|
||||
ATHENA_LIBS2 = -lXt
|
||||
ATHENA_INSTALL = install_normal
|
||||
ATHENA_INSTALL = install_normal install_gui_extra
|
||||
ATHENA_TARGETS = installglinks
|
||||
ATHENA_MAN_TARGETS = yes
|
||||
ATHENA_TESTTARGET = gui
|
||||
@@ -1178,7 +1178,7 @@ NEXTAW_IPATH = $(GUI_INC_LOC)
|
||||
NEXTAW_LIBS_DIR = $(GUI_LIB_LOC)
|
||||
NEXTAW_LIBS1 = $(NEXTAW_LIB)
|
||||
NEXTAW_LIBS2 = -lXt
|
||||
NEXTAW_INSTALL = install_normal
|
||||
NEXTAW_INSTALL = install_normal install_gui_extra
|
||||
NEXTAW_TARGETS = installglinks
|
||||
NEXTAW_MAN_TARGETS = yes
|
||||
NEXTAW_TESTTARGET = gui
|
||||
@@ -1203,7 +1203,7 @@ PHOTONGUI_IPATH =
|
||||
PHOTONGUI_LIBS_DIR =
|
||||
PHOTONGUI_LIBS1 = -lph -lphexlib
|
||||
PHOTONGUI_LIBS2 =
|
||||
PHOTONGUI_INSTALL = install_normal
|
||||
PHOTONGUI_INSTALL = install_normal install_gui_extra
|
||||
PHOTONGUI_TARGETS = installglinks
|
||||
PHOTONGUI_MAN_TARGETS = yes
|
||||
PHOTONGUI_TESTTARGET = gui
|
||||
@@ -1219,7 +1219,7 @@ CARBONGUI_IPATH = -I. -Iproto
|
||||
CARBONGUI_LIBS_DIR =
|
||||
CARBONGUI_LIBS1 = -framework Carbon
|
||||
CARBONGUI_LIBS2 =
|
||||
CARBONGUI_INSTALL = install_macosx
|
||||
CARBONGUI_INSTALL = install_macosx install_gui_extra
|
||||
CARBONGUI_TARGETS =
|
||||
CARBONGUI_MAN_TARGETS =
|
||||
CARBONGUI_TESTTARGET = gui
|
||||
@@ -1757,6 +1757,15 @@ testclean:
|
||||
cd $(PODIR); $(MAKE) checkclean; \
|
||||
fi
|
||||
|
||||
install: $(GUI_INSTALL)
|
||||
|
||||
install_normal: installvim installtools $(INSTALL_LANGS) install-icons
|
||||
|
||||
install_gui_extra: installgtutorbin
|
||||
|
||||
installvim: installvimbin installtutorbin \
|
||||
installruntime installlinks installmanlinks
|
||||
|
||||
#
|
||||
# Avoid overwriting an existing executable, somebody might be running it and
|
||||
# overwriting it could cause it to crash. Deleting it is OK, it won't be
|
||||
@@ -1766,13 +1775,6 @@ testclean:
|
||||
# If you want to keep an older version, rename it before running "make
|
||||
# install".
|
||||
#
|
||||
install: $(GUI_INSTALL)
|
||||
|
||||
install_normal: installvim installtools $(INSTALL_LANGS) install-icons
|
||||
|
||||
installvim: installvimbin installtutorbin \
|
||||
installruntime installlinks installmanlinks
|
||||
|
||||
installvimbin: $(VIMTARGET) $(DESTDIR)$(exec_prefix) $(DEST_BIN)
|
||||
-if test -f $(DEST_BIN)/$(VIMTARGET); then \
|
||||
mv -f $(DEST_BIN)/$(VIMTARGET) $(DEST_BIN)/$(VIMNAME).rm; \
|
||||
@@ -1888,6 +1890,8 @@ installmacros: $(DEST_VIM) $(DEST_RT) $(DEST_MACRO)
|
||||
installtutorbin: $(DEST_VIM)
|
||||
$(INSTALL_DATA) vimtutor $(DEST_BIN)/$(VIMNAME)tutor
|
||||
chmod $(SCRIPTMOD) $(DEST_BIN)/$(VIMNAME)tutor
|
||||
|
||||
installgtutorbin: $(DEST_VIM)
|
||||
$(INSTALL_DATA) gvimtutor $(DEST_BIN)/$(GVIMNAME)tutor
|
||||
chmod $(SCRIPTMOD) $(DEST_BIN)/$(GVIMNAME)tutor
|
||||
|
||||
|
||||
+10
-2
@@ -16927,9 +16927,17 @@ var2fpos(varp, dollar_lnum, fnum)
|
||||
name = get_tv_string_chk(varp);
|
||||
if (name == NULL)
|
||||
return NULL;
|
||||
if (name[0] == '.') /* cursor */
|
||||
if (name[0] == '.') /* cursor */
|
||||
return &curwin->w_cursor;
|
||||
if (name[0] == '\'') /* mark */
|
||||
#ifdef FEAT_VISUAL
|
||||
if (name[0] == 'v' && name[1] == NUL) /* Visual start */
|
||||
{
|
||||
if (VIsual_active)
|
||||
return &VIsual;
|
||||
return &curwin->w_cursor;
|
||||
}
|
||||
#endif
|
||||
if (name[0] == '\'') /* mark */
|
||||
{
|
||||
pp = getmark_fnum(name[1], FALSE, fnum);
|
||||
if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0)
|
||||
|
||||
+4
-2
@@ -2148,7 +2148,9 @@ do_one_cmd(cmdlinep, sourcing,
|
||||
|
||||
#endif
|
||||
|
||||
if (*p == '!' && ea.cmdidx != CMD_substitute) /* forced commands */
|
||||
/* forced commands */
|
||||
if (*p == '!' && ea.cmdidx != CMD_substitute
|
||||
&& ea.cmdidx != CMD_smagic && ea.cmdidx != CMD_snomagic)
|
||||
{
|
||||
++p;
|
||||
ea.forceit = TRUE;
|
||||
@@ -9319,7 +9321,7 @@ ex_tag_cmd(eap, name)
|
||||
break;
|
||||
default: /* ":tag" */
|
||||
#ifdef FEAT_CSCOPE
|
||||
if (p_cst)
|
||||
if (p_cst && *eap->arg != NUL)
|
||||
{
|
||||
do_cstag(eap);
|
||||
return;
|
||||
|
||||
+10
-12
@@ -2053,10 +2053,10 @@ set_cmdspos_cursor()
|
||||
if (has_mbyte)
|
||||
correct_cmdspos(i, c);
|
||||
#endif
|
||||
/* If the cmdline doesn't fit, put cursor on last visible char. */
|
||||
/* If the cmdline doesn't fit, show cursor on last visible char.
|
||||
* Don't move the cursor itself, so we can still append. */
|
||||
if ((ccline.cmdspos += c) >= m)
|
||||
{
|
||||
ccline.cmdpos = i - 1;
|
||||
ccline.cmdspos -= c;
|
||||
break;
|
||||
}
|
||||
@@ -2829,10 +2829,11 @@ put_on_cmdline(str, len, redraw)
|
||||
if (has_mbyte)
|
||||
correct_cmdspos(ccline.cmdpos, c);
|
||||
#endif
|
||||
/* Stop cursor at the end of the screen */
|
||||
if (ccline.cmdspos + c >= m)
|
||||
break;
|
||||
ccline.cmdspos += c;
|
||||
/* Stop cursor at the end of the screen, but do increment the
|
||||
* insert position, so that entering a very long command
|
||||
* works, even though you can't see it. */
|
||||
if (ccline.cmdspos + c < m)
|
||||
ccline.cmdspos += c;
|
||||
#ifdef FEAT_MBYTE
|
||||
if (has_mbyte)
|
||||
{
|
||||
@@ -3032,10 +3033,7 @@ cmdline_paste_str(s, literally)
|
||||
++s;
|
||||
#ifdef FEAT_MBYTE
|
||||
if (has_mbyte)
|
||||
{
|
||||
c = mb_ptr2char(s);
|
||||
s += mb_char2len(c);
|
||||
}
|
||||
c = mb_cptr2char_adv(&s);
|
||||
else
|
||||
#endif
|
||||
c = *s++;
|
||||
@@ -3335,7 +3333,7 @@ nextwild(xp, type, options)
|
||||
/*
|
||||
* Do wildcard expansion on the string 'str'.
|
||||
* Chars that should not be expanded must be preceded with a backslash.
|
||||
* Return a pointer to alloced memory containing the new string.
|
||||
* Return a pointer to allocated memory containing the new string.
|
||||
* Return NULL for failure.
|
||||
*
|
||||
* "orig" is the originally expanded string, copied to allocated memory. It
|
||||
@@ -6117,7 +6115,7 @@ ex_window()
|
||||
|
||||
exmode_active = save_exmode;
|
||||
|
||||
/* Safety check: The old window or buffer was deleted: It's a a bug when
|
||||
/* Safety check: The old window or buffer was deleted: It's a bug when
|
||||
* this happens! */
|
||||
if (!win_valid(old_curwin) || !buf_valid(old_curbuf))
|
||||
{
|
||||
|
||||
@@ -4836,7 +4836,8 @@ ex_gui(eap)
|
||||
}
|
||||
|
||||
#if ((defined(FEAT_GUI_X11) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_W32) \
|
||||
|| defined(FEAT_GUI_PHOTON)) && defined(FEAT_TOOLBAR)) || defined(PROTO)
|
||||
|| defined(FEAT_GUI_PHOTON)) && defined(FEAT_TOOLBAR) \
|
||||
|| defined(FEAT_GUI_MACVIM)) || defined(PROTO)
|
||||
/*
|
||||
* This is shared between Athena, Motif and GTK.
|
||||
*/
|
||||
|
||||
+10
-10
@@ -686,8 +686,8 @@ manage_centered(dialog_child)
|
||||
|
||||
/* Temporarily set value of XmNmappedWhenManaged
|
||||
to stop the dialog from popping up right away */
|
||||
XtVaGetValues(shell, XmNmappedWhenManaged, &mappedWhenManaged, 0);
|
||||
XtVaSetValues(shell, XmNmappedWhenManaged, False, 0);
|
||||
XtVaGetValues(shell, XmNmappedWhenManaged, &mappedWhenManaged, NULL);
|
||||
XtVaSetValues(shell, XmNmappedWhenManaged, False, NULL);
|
||||
|
||||
XtManageChild(dialog_child);
|
||||
|
||||
@@ -723,7 +723,7 @@ manage_centered(dialog_child)
|
||||
XtMapWidget(shell);
|
||||
|
||||
/* Restore the value of XmNmappedWhenManaged */
|
||||
XtVaSetValues(shell, XmNmappedWhenManaged, mappedWhenManaged, 0);
|
||||
XtVaSetValues(shell, XmNmappedWhenManaged, mappedWhenManaged, NULL);
|
||||
}
|
||||
|
||||
#if defined(FEAT_MENU) || defined(FEAT_SUN_WORKSHOP) \
|
||||
@@ -1993,7 +1993,7 @@ do_mnemonic(Widget w, unsigned int keycode)
|
||||
{
|
||||
if (XtClass(w) == xmRowColumnWidgetClass)
|
||||
{
|
||||
XtVaGetValues(w, XmNrowColumnType, &rowColType, 0);
|
||||
XtVaGetValues(w, XmNrowColumnType, &rowColType, NULL);
|
||||
isMenu = (rowColType != (unsigned char)XmWORK_AREA);
|
||||
}
|
||||
else
|
||||
@@ -2001,14 +2001,14 @@ do_mnemonic(Widget w, unsigned int keycode)
|
||||
if (!isMenu)
|
||||
{
|
||||
XtVaGetValues(w, XmNchildren, &children, XmNnumChildren,
|
||||
&numChildren, 0);
|
||||
&numChildren, NULL);
|
||||
for (i = 0; i < numChildren; i++)
|
||||
do_mnemonic(children[i], keycode);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
XtVaGetValues(w, XmNmnemonic, &mnemonic, 0);
|
||||
XtVaGetValues(w, XmNmnemonic, &mnemonic, NULL);
|
||||
if (mnemonic != '\0')
|
||||
{
|
||||
mneString[0] = mnemonic;
|
||||
@@ -2019,7 +2019,7 @@ do_mnemonic(Widget w, unsigned int keycode)
|
||||
if (XtClass(w) == xmLabelWidgetClass
|
||||
|| XtClass(w) == xmLabelGadgetClass)
|
||||
{
|
||||
XtVaGetValues(w, XmNuserData, &userData, 0);
|
||||
XtVaGetValues(w, XmNuserData, &userData, NULL);
|
||||
if (userData != NULL && XtIsWidget(userData))
|
||||
XmProcessTraversal(userData, XmTRAVERSE_CURRENT);
|
||||
}
|
||||
@@ -2073,7 +2073,7 @@ add_mnemonic_grabs(Widget dialog, Widget w)
|
||||
{
|
||||
if (XtClass(w) == xmRowColumnWidgetClass)
|
||||
{
|
||||
XtVaGetValues(w, XmNrowColumnType, &rowColType, 0);
|
||||
XtVaGetValues(w, XmNrowColumnType, &rowColType, NULL);
|
||||
isMenu = (rowColType != (unsigned char)XmWORK_AREA);
|
||||
}
|
||||
else
|
||||
@@ -2081,14 +2081,14 @@ add_mnemonic_grabs(Widget dialog, Widget w)
|
||||
if (!isMenu)
|
||||
{
|
||||
XtVaGetValues(w, XmNchildren, &children, XmNnumChildren,
|
||||
&numChildren, 0);
|
||||
&numChildren, NULL);
|
||||
for (i = 0; i < numChildren; i++)
|
||||
add_mnemonic_grabs(dialog, children[i]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
XtVaGetValues(w, XmNmnemonic, &mnemonic, 0);
|
||||
XtVaGetValues(w, XmNmnemonic, &mnemonic, NULL);
|
||||
if (mnemonic != '\0')
|
||||
{
|
||||
mneString[0] = mnemonic;
|
||||
|
||||
@@ -1538,8 +1538,11 @@ gui_mch_init()
|
||||
attr.depth = DefaultDepthOfScreen(scr);
|
||||
|
||||
if (!icon)
|
||||
{
|
||||
XpmCreatePixmapFromData(dsp, root_window, magick, &icon,
|
||||
&icon_mask, &attr);
|
||||
XpmFreeAttributes(&attr);
|
||||
}
|
||||
|
||||
# ifdef FEAT_GUI_ATHENA
|
||||
XtVaSetValues(vimShell, XtNiconPixmap, icon, XtNiconMask, icon_mask, NULL);
|
||||
|
||||
+93
-81
@@ -50,11 +50,11 @@
|
||||
|
||||
#if !defined(FEAT_PYTHON) && defined(PROTO)
|
||||
/* Use this to be able to generate prototypes without python being used. */
|
||||
# define PyObject int
|
||||
# define PyThreadState int
|
||||
# define PyTypeObject int
|
||||
struct PyMethodDef { int a; };
|
||||
# define PySequenceMethods int
|
||||
# define PyObject Py_ssize_t
|
||||
# define PyThreadState Py_ssize_t
|
||||
# define PyTypeObject Py_ssize_t
|
||||
struct PyMethodDef { Py_ssize_t a; };
|
||||
# define PySequenceMethods Py_ssize_t
|
||||
#endif
|
||||
|
||||
#if defined(PY_VERSION_HEX) && PY_VERSION_HEX >= 0x02050000
|
||||
@@ -64,6 +64,7 @@ struct PyMethodDef { int a; };
|
||||
# define PyIntIntArgFunc ssizessizeargfunc
|
||||
# define PyIntObjArgProc ssizeobjargproc
|
||||
# define PyIntIntObjArgProc ssizessizeobjargproc
|
||||
# define Py_ssize_t_fmt "n"
|
||||
#else
|
||||
# define PyInt int
|
||||
# define PyInquiry inquiry
|
||||
@@ -71,6 +72,7 @@ struct PyMethodDef { int a; };
|
||||
# define PyIntIntArgFunc intintargfunc
|
||||
# define PyIntObjArgProc intobjargproc
|
||||
# define PyIntIntObjArgProc intintobjargproc
|
||||
# define Py_ssize_t_fmt "i"
|
||||
#endif
|
||||
|
||||
/* Parser flags */
|
||||
@@ -85,9 +87,18 @@ struct PyMethodDef { int a; };
|
||||
|
||||
#if defined(DYNAMIC_PYTHON) || defined(PROTO)
|
||||
# ifndef DYNAMIC_PYTHON
|
||||
# define HINSTANCE int /* for generating prototypes */
|
||||
# define HINSTANCE long_u /* for generating prototypes */
|
||||
# endif
|
||||
|
||||
/* This makes if_python.c compile without warnings against Python 2.5
|
||||
* on Win32 and Win64. */
|
||||
#undef PyRun_SimpleString
|
||||
#undef PyArg_Parse
|
||||
#undef PyArg_ParseTuple
|
||||
#undef Py_BuildValue
|
||||
#undef Py_InitModule4
|
||||
#undef Py_InitModule4_64
|
||||
|
||||
/*
|
||||
* Wrapper defines
|
||||
*/
|
||||
@@ -269,7 +280,11 @@ static struct
|
||||
{"PyType_Type", (PYTHON_PROC*)&dll_PyType_Type},
|
||||
{"Py_BuildValue", (PYTHON_PROC*)&dll_Py_BuildValue},
|
||||
{"Py_FindMethod", (PYTHON_PROC*)&dll_Py_FindMethod},
|
||||
# if (PY_VERSION_HEX >= 0x02050000) && SIZEOF_SIZE_T != SIZEOF_INT
|
||||
{"Py_InitModule4_64", (PYTHON_PROC*)&dll_Py_InitModule4},
|
||||
# else
|
||||
{"Py_InitModule4", (PYTHON_PROC*)&dll_Py_InitModule4},
|
||||
# endif
|
||||
{"Py_Initialize", (PYTHON_PROC*)&dll_Py_Initialize},
|
||||
{"Py_Finalize", (PYTHON_PROC*)&dll_Py_Finalize},
|
||||
{"Py_IsInitialized", (PYTHON_PROC*)&dll_Py_IsInitialized},
|
||||
@@ -339,8 +354,7 @@ python_runtime_link_init(char *libname, int verbose)
|
||||
* TRUE, else FALSE.
|
||||
*/
|
||||
int
|
||||
python_enabled(verbose)
|
||||
int verbose;
|
||||
python_enabled(int verbose)
|
||||
{
|
||||
return python_runtime_link_init(DYNAMIC_PYTHON_DLL, verbose) == OK;
|
||||
}
|
||||
@@ -374,8 +388,8 @@ get_exceptions()
|
||||
*/
|
||||
|
||||
static void DoPythonCommand(exarg_T *, const char *);
|
||||
static int RangeStart;
|
||||
static int RangeEnd;
|
||||
static PyInt RangeStart;
|
||||
static PyInt RangeEnd;
|
||||
|
||||
static void PythonIO_Flush(void);
|
||||
static int PythonIO_Init(void);
|
||||
@@ -384,12 +398,12 @@ static int PythonMod_Init(void);
|
||||
/* Utility functions for the vim/python interface
|
||||
* ----------------------------------------------
|
||||
*/
|
||||
static PyObject *GetBufferLine(buf_T *, int);
|
||||
static PyObject *GetBufferLine(buf_T *, PyInt);
|
||||
static PyObject *GetBufferLineList(buf_T *, PyInt, PyInt);
|
||||
|
||||
static int SetBufferLine(buf_T *, int, PyObject *, int *);
|
||||
static int SetBufferLineList(buf_T *, PyInt, PyInt, PyObject *, int *);
|
||||
static int InsertBufferLines(buf_T *, int, PyObject *, int *);
|
||||
static int SetBufferLine(buf_T *, PyInt, PyObject *, PyInt *);
|
||||
static int SetBufferLineList(buf_T *, PyInt, PyInt, PyObject *, PyInt *);
|
||||
static int InsertBufferLines(buf_T *, PyInt, PyObject *, PyInt *);
|
||||
|
||||
static PyObject *LineToString(const char *);
|
||||
static char *StringToLine(PyObject *);
|
||||
@@ -690,7 +704,7 @@ static PyObject *OutputWrite(PyObject *, PyObject *);
|
||||
static PyObject *OutputWritelines(PyObject *, PyObject *);
|
||||
|
||||
typedef void (*writefn)(char_u *);
|
||||
static void writer(writefn fn, char_u *str, int n);
|
||||
static void writer(writefn fn, char_u *str, PyInt n);
|
||||
|
||||
/* Output object definition
|
||||
*/
|
||||
@@ -812,7 +826,7 @@ OutputWritelines(PyObject *self, PyObject *args)
|
||||
{
|
||||
PyObject *line = PyList_GetItem(list, i);
|
||||
char *str;
|
||||
int len;
|
||||
PyInt len;
|
||||
|
||||
if (!PyArg_Parse(line, "s#", &str, &len)) {
|
||||
PyErr_SetString(PyExc_TypeError, _("writelines() requires list of strings"));
|
||||
@@ -836,15 +850,15 @@ OutputWritelines(PyObject *self, PyObject *args)
|
||||
*/
|
||||
|
||||
static char_u *buffer = NULL;
|
||||
static int buffer_len = 0;
|
||||
static int buffer_size = 0;
|
||||
static PyInt buffer_len = 0;
|
||||
static PyInt buffer_size = 0;
|
||||
|
||||
static writefn old_fn = NULL;
|
||||
|
||||
static void
|
||||
buffer_ensure(int n)
|
||||
buffer_ensure(PyInt n)
|
||||
{
|
||||
int new_size;
|
||||
PyInt new_size;
|
||||
char_u *new_buffer;
|
||||
|
||||
if (n < buffer_size)
|
||||
@@ -884,7 +898,7 @@ PythonIO_Flush(void)
|
||||
}
|
||||
|
||||
static void
|
||||
writer(writefn fn, char_u *str, int n)
|
||||
writer(writefn fn, char_u *str, PyInt n)
|
||||
{
|
||||
char_u *ptr;
|
||||
|
||||
@@ -895,7 +909,7 @@ writer(writefn fn, char_u *str, int n)
|
||||
|
||||
while (n > 0 && (ptr = memchr(str, '\n', n)) != NULL)
|
||||
{
|
||||
int len = ptr - str;
|
||||
PyInt len = ptr - str;
|
||||
|
||||
buffer_ensure(buffer_len + len + 1);
|
||||
|
||||
@@ -1022,14 +1036,14 @@ typedef struct
|
||||
{
|
||||
PyObject_HEAD
|
||||
BufferObject *buf;
|
||||
int start;
|
||||
int end;
|
||||
PyInt start;
|
||||
PyInt end;
|
||||
}
|
||||
RangeObject;
|
||||
|
||||
#define RangeType_Check(obj) ((obj)->ob_type == &RangeType)
|
||||
|
||||
static PyObject *RangeNew(buf_T *, int, int);
|
||||
static PyObject *RangeNew(buf_T *, PyInt, PyInt);
|
||||
|
||||
static void RangeDestructor(PyObject *);
|
||||
static PyObject *RangeGetattr(PyObject *, char *);
|
||||
@@ -1069,8 +1083,8 @@ static int CurrentSetattr(PyObject *, char *, PyObject *);
|
||||
|
||||
static struct PyMethodDef VimMethods[] = {
|
||||
/* name, function, calling, documentation */
|
||||
{"command", VimCommand, 1, "" },
|
||||
{"eval", VimEval, 1, "" },
|
||||
{"command", VimCommand, 1, "Execute a Vim ex-mode command" },
|
||||
{"eval", VimEval, 1, "Evaluate an expression using Vim evaluator" },
|
||||
{ NULL, NULL, 0, NULL }
|
||||
};
|
||||
|
||||
@@ -1110,7 +1124,7 @@ VimCommand(PyObject *self, PyObject *args)
|
||||
* Function to translate a typval_T into a PyObject; this will recursively
|
||||
* translate lists/dictionaries into their Python equivalents.
|
||||
*
|
||||
* The depth parameter is too avoid infinite recursion, set it to 1 when
|
||||
* The depth parameter is to avoid infinite recursion, set it to 1 when
|
||||
* you call VimToPython.
|
||||
*/
|
||||
static PyObject *
|
||||
@@ -1130,7 +1144,7 @@ VimToPython(typval_T *our_tv, int depth, PyObject *lookupDict)
|
||||
|
||||
/* Check if we run into a recursive loop. The item must be in lookupDict
|
||||
* then and we can use it again. */
|
||||
sprintf(ptrBuf, "%ld", (long)our_tv);
|
||||
sprintf(ptrBuf, PRINTF_DECIMAL_LONG_U, (long_u)our_tv);
|
||||
result = PyDict_GetItemString(lookupDict, ptrBuf);
|
||||
if (result != NULL)
|
||||
Py_INCREF(result);
|
||||
@@ -1184,7 +1198,7 @@ VimToPython(typval_T *our_tv, int depth, PyObject *lookupDict)
|
||||
if (our_tv->vval.v_dict != NULL)
|
||||
{
|
||||
hashtab_T *ht = &our_tv->vval.v_dict->dv_hashtab;
|
||||
int todo = ht->ht_used;
|
||||
long_u todo = ht->ht_used;
|
||||
hashitem_T *hi;
|
||||
dictitem_T *di;
|
||||
|
||||
@@ -1273,7 +1287,7 @@ CheckBuffer(BufferObject *this)
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
RBItem(BufferObject *self, PyInt n, int start, int end)
|
||||
RBItem(BufferObject *self, PyInt n, PyInt start, PyInt end)
|
||||
{
|
||||
if (CheckBuffer(self))
|
||||
return NULL;
|
||||
@@ -1288,7 +1302,7 @@ RBItem(BufferObject *self, PyInt n, int start, int end)
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
RBSlice(BufferObject *self, PyInt lo, PyInt hi, int start, int end)
|
||||
RBSlice(BufferObject *self, PyInt lo, PyInt hi, PyInt start, PyInt end)
|
||||
{
|
||||
PyInt size;
|
||||
|
||||
@@ -1312,9 +1326,9 @@ RBSlice(BufferObject *self, PyInt lo, PyInt hi, int start, int end)
|
||||
}
|
||||
|
||||
static PyInt
|
||||
RBAssItem(BufferObject *self, PyInt n, PyObject *val, int start, int end, int *new_end)
|
||||
RBAssItem(BufferObject *self, PyInt n, PyObject *val, PyInt start, PyInt end, PyInt *new_end)
|
||||
{
|
||||
int len_change;
|
||||
PyInt len_change;
|
||||
|
||||
if (CheckBuffer(self))
|
||||
return -1;
|
||||
@@ -1335,10 +1349,10 @@ RBAssItem(BufferObject *self, PyInt n, PyObject *val, int start, int end, int *n
|
||||
}
|
||||
|
||||
static PyInt
|
||||
RBAssSlice(BufferObject *self, PyInt lo, PyInt hi, PyObject *val, int start, int end, int *new_end)
|
||||
RBAssSlice(BufferObject *self, PyInt lo, PyInt hi, PyObject *val, PyInt start, PyInt end, PyInt *new_end)
|
||||
{
|
||||
int size;
|
||||
int len_change;
|
||||
PyInt size;
|
||||
PyInt len_change;
|
||||
|
||||
/* Self must be a valid buffer */
|
||||
if (CheckBuffer(self))
|
||||
@@ -1368,19 +1382,19 @@ RBAssSlice(BufferObject *self, PyInt lo, PyInt hi, PyObject *val, int start, int
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
RBAppend(BufferObject *self, PyObject *args, int start, int end, int *new_end)
|
||||
RBAppend(BufferObject *self, PyObject *args, PyInt start, PyInt end, PyInt *new_end)
|
||||
{
|
||||
PyObject *lines;
|
||||
int len_change;
|
||||
int max;
|
||||
int n;
|
||||
PyInt len_change;
|
||||
PyInt max;
|
||||
PyInt n;
|
||||
|
||||
if (CheckBuffer(self))
|
||||
return NULL;
|
||||
|
||||
max = n = end - start + 1;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "O|i", &lines, &n))
|
||||
if (!PyArg_ParseTuple(args, "O|" Py_ssize_t_fmt, &lines, &n))
|
||||
return NULL;
|
||||
|
||||
if (n < 0 || n > max)
|
||||
@@ -1405,9 +1419,9 @@ RBAppend(BufferObject *self, PyObject *args, int start, int end, int *new_end)
|
||||
|
||||
static struct PyMethodDef BufferMethods[] = {
|
||||
/* name, function, calling, documentation */
|
||||
{"append", BufferAppend, 1, "" },
|
||||
{"mark", BufferMark, 1, "" },
|
||||
{"range", BufferRange, 1, "" },
|
||||
{"append", BufferAppend, 1, "Append data to Vim buffer" },
|
||||
{"mark", BufferMark, 1, "Return (row,col) representing position of named mark" },
|
||||
{"range", BufferRange, 1, "Return a range object which represents the part of the given buffer between line numbers s and e" },
|
||||
{ NULL, NULL, 0, NULL }
|
||||
};
|
||||
|
||||
@@ -1503,9 +1517,9 @@ BufferGetattr(PyObject *self, char *name)
|
||||
return NULL;
|
||||
|
||||
if (strcmp(name, "name") == 0)
|
||||
return Py_BuildValue("s",this->buf->b_ffname);
|
||||
return Py_BuildValue("s", this->buf->b_ffname);
|
||||
else if (strcmp(name, "number") == 0)
|
||||
return Py_BuildValue("i",this->buf->b_fnum);
|
||||
return Py_BuildValue(Py_ssize_t_fmt, this->buf->b_fnum);
|
||||
else if (strcmp(name,"__members__") == 0)
|
||||
return Py_BuildValue("[ss]", "name", "number");
|
||||
else
|
||||
@@ -1520,14 +1534,13 @@ BufferRepr(PyObject *self)
|
||||
|
||||
if (this->buf == INVALID_BUFFER_VALUE)
|
||||
{
|
||||
vim_snprintf(repr, 100, _("<buffer object (deleted) at %8lX>"),
|
||||
(long)(self));
|
||||
vim_snprintf(repr, 100, _("<buffer object (deleted) at %p>"), (self));
|
||||
return PyString_FromString(repr);
|
||||
}
|
||||
else
|
||||
{
|
||||
char *name = (char *)this->buf->b_fname;
|
||||
int len;
|
||||
PyInt len;
|
||||
|
||||
if (name == NULL)
|
||||
name = "";
|
||||
@@ -1572,7 +1585,7 @@ BufferSlice(PyObject *self, PyInt lo, PyInt hi)
|
||||
BufferAssItem(PyObject *self, PyInt n, PyObject *val)
|
||||
{
|
||||
return RBAssItem((BufferObject *)(self), n, val, 1,
|
||||
(int)((BufferObject *)(self))->buf->b_ml.ml_line_count,
|
||||
(PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
|
||||
NULL);
|
||||
}
|
||||
|
||||
@@ -1580,7 +1593,7 @@ BufferAssItem(PyObject *self, PyInt n, PyObject *val)
|
||||
BufferAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val)
|
||||
{
|
||||
return RBAssSlice((BufferObject *)(self), lo, hi, val, 1,
|
||||
(int)((BufferObject *)(self))->buf->b_ml.ml_line_count,
|
||||
(PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
|
||||
NULL);
|
||||
}
|
||||
|
||||
@@ -1588,7 +1601,7 @@ BufferAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val)
|
||||
BufferAppend(PyObject *self, PyObject *args)
|
||||
{
|
||||
return RBAppend((BufferObject *)(self), args, 1,
|
||||
(int)((BufferObject *)(self))->buf->b_ml.ml_line_count,
|
||||
(PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
|
||||
NULL);
|
||||
}
|
||||
|
||||
@@ -1633,13 +1646,13 @@ BufferMark(PyObject *self, PyObject *args)
|
||||
static PyObject *
|
||||
BufferRange(PyObject *self, PyObject *args)
|
||||
{
|
||||
int start;
|
||||
int end;
|
||||
PyInt start;
|
||||
PyInt end;
|
||||
|
||||
if (CheckBuffer((BufferObject *)(self)))
|
||||
return NULL;
|
||||
|
||||
if (!PyArg_ParseTuple(args, "ii", &start, &end))
|
||||
if (!PyArg_ParseTuple(args, Py_ssize_t_fmt Py_ssize_t_fmt, &start, &end))
|
||||
return NULL;
|
||||
|
||||
return RangeNew(((BufferObject *)(self))->buf, start, end);
|
||||
@@ -1650,7 +1663,7 @@ BufferRange(PyObject *self, PyObject *args)
|
||||
|
||||
static struct PyMethodDef RangeMethods[] = {
|
||||
/* name, function, calling, documentation */
|
||||
{"append", RangeAppend, 1, "" },
|
||||
{"append", RangeAppend, 1, "Append data to the Vim range" },
|
||||
{ NULL, NULL, 0, NULL }
|
||||
};
|
||||
|
||||
@@ -1691,7 +1704,7 @@ static PyTypeObject RangeType = {
|
||||
*/
|
||||
|
||||
static PyObject *
|
||||
RangeNew(buf_T *buf, int start, int end)
|
||||
RangeNew(buf_T *buf, PyInt start, PyInt end)
|
||||
{
|
||||
BufferObject *bufr;
|
||||
RangeObject *self;
|
||||
@@ -1725,9 +1738,9 @@ RangeDestructor(PyObject *self)
|
||||
RangeGetattr(PyObject *self, char *name)
|
||||
{
|
||||
if (strcmp(name, "start") == 0)
|
||||
return Py_BuildValue("i",((RangeObject *)(self))->start - 1);
|
||||
return Py_BuildValue(Py_ssize_t_fmt, ((RangeObject *)(self))->start - 1);
|
||||
else if (strcmp(name, "end") == 0)
|
||||
return Py_BuildValue("i",((RangeObject *)(self))->end - 1);
|
||||
return Py_BuildValue(Py_ssize_t_fmt, ((RangeObject *)(self))->end - 1);
|
||||
else
|
||||
return Py_FindMethod(RangeMethods, self, name);
|
||||
}
|
||||
@@ -1740,8 +1753,8 @@ RangeRepr(PyObject *self)
|
||||
|
||||
if (this->buf->buf == INVALID_BUFFER_VALUE)
|
||||
{
|
||||
vim_snprintf(repr, 100, "<range object (for deleted buffer) at %8lX>",
|
||||
(long)(self));
|
||||
vim_snprintf(repr, 100, "<range object (for deleted buffer) at %p>",
|
||||
(self));
|
||||
return PyString_FromString(repr);
|
||||
}
|
||||
else
|
||||
@@ -1869,7 +1882,7 @@ static PyTypeObject BufListType = {
|
||||
BufListLength(PyObject *self)
|
||||
{
|
||||
buf_T *b = firstbuf;
|
||||
int n = 0;
|
||||
PyInt n = 0;
|
||||
|
||||
while (b)
|
||||
{
|
||||
@@ -2115,8 +2128,7 @@ WindowRepr(PyObject *self)
|
||||
|
||||
if (this->win == INVALID_WINDOW_VALUE)
|
||||
{
|
||||
vim_snprintf(repr, 100, _("<window object (deleted) at %.8lX>"),
|
||||
(long)(self));
|
||||
vim_snprintf(repr, 100, _("<window object (deleted) at %p>"), (self));
|
||||
return PyString_FromString(repr);
|
||||
}
|
||||
else
|
||||
@@ -2128,8 +2140,8 @@ WindowRepr(PyObject *self)
|
||||
++i;
|
||||
|
||||
if (w == NULL)
|
||||
vim_snprintf(repr, 100, _("<window object (unknown) at %.8lX>"),
|
||||
(long)(self));
|
||||
vim_snprintf(repr, 100, _("<window object (unknown) at %p>"),
|
||||
(self));
|
||||
else
|
||||
vim_snprintf(repr, 100, _("<window %d>"), i);
|
||||
|
||||
@@ -2186,7 +2198,7 @@ static PyTypeObject WinListType = {
|
||||
WinListLength(PyObject *self)
|
||||
{
|
||||
win_T *w = firstwin;
|
||||
int n = 0;
|
||||
PyInt n = 0;
|
||||
|
||||
while (w != NULL)
|
||||
{
|
||||
@@ -2254,7 +2266,7 @@ CurrentGetattr(PyObject *self, char *name)
|
||||
else if (strcmp(name, "window") == 0)
|
||||
return (PyObject *)WindowNew(curwin);
|
||||
else if (strcmp(name, "line") == 0)
|
||||
return GetBufferLine(curbuf, (int)curwin->w_cursor.lnum);
|
||||
return GetBufferLine(curbuf, (PyInt)curwin->w_cursor.lnum);
|
||||
else if (strcmp(name, "range") == 0)
|
||||
return RangeNew(curbuf, RangeStart, RangeEnd);
|
||||
else if (strcmp(name,"__members__") == 0)
|
||||
@@ -2272,7 +2284,7 @@ CurrentSetattr(PyObject *self, char *name, PyObject *value)
|
||||
{
|
||||
if (strcmp(name, "line") == 0)
|
||||
{
|
||||
if (SetBufferLine(curbuf, (int)curwin->w_cursor.lnum, value, NULL) == FAIL)
|
||||
if (SetBufferLine(curbuf, (PyInt)curwin->w_cursor.lnum, value, NULL) == FAIL)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
@@ -2344,7 +2356,7 @@ PythonMod_Init(void)
|
||||
/* Set sys.argv[] to avoid a crash in warn(). */
|
||||
PySys_SetArgv(1, argv);
|
||||
|
||||
mod = Py_InitModule("vim", VimMethods);
|
||||
mod = Py_InitModule4("vim", VimMethods, (char *)NULL, (PyObject *)NULL, PYTHON_API_VERSION);
|
||||
dict = PyModule_GetDict(mod);
|
||||
|
||||
VimError = Py_BuildValue("s", "vim.error");
|
||||
@@ -2369,7 +2381,7 @@ PythonMod_Init(void)
|
||||
* string object.
|
||||
*/
|
||||
static PyObject *
|
||||
GetBufferLine(buf_T *buf, int n)
|
||||
GetBufferLine(buf_T *buf, PyInt n)
|
||||
{
|
||||
return LineToString((char *)ml_get_buf(buf, (linenr_T)n, FALSE));
|
||||
}
|
||||
@@ -2422,7 +2434,7 @@ GetBufferLineList(buf_T *buf, PyInt lo, PyInt hi)
|
||||
* deleted).
|
||||
*/
|
||||
static void
|
||||
py_fix_cursor(int lo, int hi, int extra)
|
||||
py_fix_cursor(linenr_T lo, linenr_T hi, linenr_T extra)
|
||||
{
|
||||
if (curwin->w_cursor.lnum >= lo)
|
||||
{
|
||||
@@ -2454,7 +2466,7 @@ py_fix_cursor(int lo, int hi, int extra)
|
||||
* is set to the change in the buffer length.
|
||||
*/
|
||||
static int
|
||||
SetBufferLine(buf_T *buf, int n, PyObject *line, int *len_change)
|
||||
SetBufferLine(buf_T *buf, PyInt n, PyObject *line, PyInt *len_change)
|
||||
{
|
||||
/* First of all, we check the thpe of the supplied Python object.
|
||||
* There are three cases:
|
||||
@@ -2477,7 +2489,7 @@ SetBufferLine(buf_T *buf, int n, PyObject *line, int *len_change)
|
||||
{
|
||||
deleted_lines_mark((linenr_T)n, 1L);
|
||||
if (buf == curwin->w_buffer)
|
||||
py_fix_cursor(n, n + 1, -1);
|
||||
py_fix_cursor((linenr_T)n, (linenr_T)n + 1, (linenr_T)-1);
|
||||
}
|
||||
|
||||
curbuf = savebuf;
|
||||
@@ -2545,7 +2557,7 @@ SetBufferLine(buf_T *buf, int n, PyObject *line, int *len_change)
|
||||
* is set to the change in the buffer length.
|
||||
*/
|
||||
static int
|
||||
SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, int *len_change)
|
||||
SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, PyInt *len_change)
|
||||
{
|
||||
/* First of all, we check the thpe of the supplied Python object.
|
||||
* There are three cases:
|
||||
@@ -2556,7 +2568,7 @@ SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, int *len_chang
|
||||
if (list == Py_None || list == NULL)
|
||||
{
|
||||
PyInt i;
|
||||
PyInt n = hi - lo;
|
||||
PyInt n = (int)(hi - lo);
|
||||
buf_T *savebuf = curbuf;
|
||||
|
||||
PyErr_Clear();
|
||||
@@ -2577,7 +2589,7 @@ SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, int *len_chang
|
||||
deleted_lines_mark((linenr_T)lo, (long)i);
|
||||
|
||||
if (buf == curwin->w_buffer)
|
||||
py_fix_cursor(lo, hi, -n);
|
||||
py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)-n);
|
||||
}
|
||||
|
||||
curbuf = savebuf;
|
||||
@@ -2595,7 +2607,7 @@ SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, int *len_chang
|
||||
PyInt i;
|
||||
PyInt new_len = PyList_Size(list);
|
||||
PyInt old_len = hi - lo;
|
||||
int extra = 0; /* lines added to text, can be negative */
|
||||
PyInt extra = 0; /* lines added to text, can be negative */
|
||||
char **array;
|
||||
buf_T *savebuf;
|
||||
|
||||
@@ -2706,7 +2718,7 @@ SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, int *len_chang
|
||||
changed_lines((linenr_T)lo, 0, (linenr_T)hi, (long)extra);
|
||||
|
||||
if (buf == curwin->w_buffer)
|
||||
py_fix_cursor(lo, hi, extra);
|
||||
py_fix_cursor((linenr_T)lo, (linenr_T)hi, (linenr_T)extra);
|
||||
|
||||
curbuf = savebuf;
|
||||
|
||||
@@ -2734,7 +2746,7 @@ SetBufferLineList(buf_T *buf, PyInt lo, PyInt hi, PyObject *list, int *len_chang
|
||||
* is set to the change in the buffer length.
|
||||
*/
|
||||
static int
|
||||
InsertBufferLines(buf_T *buf, int n, PyObject *lines, int *len_change)
|
||||
InsertBufferLines(buf_T *buf, PyInt n, PyObject *lines, PyInt *len_change)
|
||||
{
|
||||
/* First of all, we check the type of the supplied Python object.
|
||||
* It must be a string or a list, or the call is in error.
|
||||
|
||||
+13
-8
@@ -1880,15 +1880,20 @@ ins_bytes_len(p, len)
|
||||
# ifdef FEAT_MBYTE
|
||||
int n;
|
||||
|
||||
for (i = 0; i < len; i += n)
|
||||
{
|
||||
n = (*mb_ptr2len)(p + i);
|
||||
ins_char_bytes(p + i, n);
|
||||
}
|
||||
# else
|
||||
for (i = 0; i < len; ++i)
|
||||
ins_char(p[i]);
|
||||
if (has_mbyte)
|
||||
for (i = 0; i < len; i += n)
|
||||
{
|
||||
if (enc_utf8)
|
||||
/* avoid reading past p[len] */
|
||||
n = utfc_ptr2len_len(p + i, len - i);
|
||||
else
|
||||
n = (*mb_ptr2len)(p + i);
|
||||
ins_char_bytes(p + i, n);
|
||||
}
|
||||
else
|
||||
# endif
|
||||
for (i = 0; i < len; ++i)
|
||||
ins_char(p[i]);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
+20
-2
@@ -16,6 +16,10 @@
|
||||
* See ":help netbeans-protocol" for explanation.
|
||||
*/
|
||||
|
||||
#if defined(MSDOS) || defined(MSWIN)
|
||||
# include "vimio.h" /* for mch_open(), must be before vim.h */
|
||||
#endif
|
||||
|
||||
#include "vim.h"
|
||||
|
||||
#if defined(FEAT_NETBEANS_INTG) || defined(PROTO)
|
||||
@@ -1974,13 +1978,16 @@ nb_do_cmd(
|
||||
}
|
||||
else if (streq((char *)cmd, "setModified"))
|
||||
{
|
||||
int prev_b_changed;
|
||||
|
||||
if (buf == NULL || buf->bufp == NULL)
|
||||
{
|
||||
/* EMSG("E646: null bufp in setModified"); */
|
||||
return FAIL;
|
||||
}
|
||||
prev_b_changed = buf->bufp->b_changed;
|
||||
if (streq((char *)args, "T"))
|
||||
buf->bufp->b_changed = 1;
|
||||
buf->bufp->b_changed = TRUE;
|
||||
else
|
||||
{
|
||||
struct stat st;
|
||||
@@ -1990,9 +1997,20 @@ nb_do_cmd(
|
||||
if (buf->bufp->b_ffname != NULL
|
||||
&& mch_stat((char *)buf->bufp->b_ffname, &st) >= 0)
|
||||
buf_store_time(buf->bufp, &st, buf->bufp->b_ffname);
|
||||
buf->bufp->b_changed = 0;
|
||||
buf->bufp->b_changed = FALSE;
|
||||
}
|
||||
buf->modified = buf->bufp->b_changed;
|
||||
if (prev_b_changed != buf->bufp->b_changed)
|
||||
{
|
||||
#ifdef FEAT_WINDOWS
|
||||
check_status(buf->bufp);
|
||||
redraw_tabline = TRUE;
|
||||
#endif
|
||||
#ifdef FEAT_TITLE
|
||||
maketitle();
|
||||
#endif
|
||||
update_screen(0);
|
||||
}
|
||||
/* =====================================================================*/
|
||||
}
|
||||
else if (streq((char *)cmd, "setModtime"))
|
||||
|
||||
+3
-2
@@ -243,7 +243,8 @@
|
||||
/* WV_ and BV_ values get typecasted to this for the "indir" field */
|
||||
typedef enum
|
||||
{
|
||||
PV_NONE = 0
|
||||
PV_NONE = 0,
|
||||
PV_MAXVAL = 0xffff /* to avoid warnings for value out of range */
|
||||
} idopt_T;
|
||||
|
||||
/*
|
||||
@@ -8828,7 +8829,7 @@ put_setstring(fd, cmd, name, valuep, expand)
|
||||
{
|
||||
s = *valuep;
|
||||
while (*s != NUL)
|
||||
if (fputs((char *)str2special(&s, FALSE), fd) < 0)
|
||||
if (put_escstr(fd, str2special(&s, FALSE), 2) == FAIL)
|
||||
return FAIL;
|
||||
}
|
||||
else if (expand)
|
||||
|
||||
+29
-10
@@ -209,6 +209,7 @@ typedef struct
|
||||
{
|
||||
SmcConn smcconn; /* The SM connection ID */
|
||||
IceConn iceconn; /* The ICE connection ID */
|
||||
char *clientid; /* The client ID for the current smc session */
|
||||
Bool save_yourself; /* If we're in the middle of a save_yourself */
|
||||
Bool shutdown; /* If we're in shutdown mode */
|
||||
} xsmp_config_T;
|
||||
@@ -2279,6 +2280,10 @@ mch_FullName(fname, buf, len, force)
|
||||
char_u olddir[MAXPATHL];
|
||||
char_u *p;
|
||||
int retval = OK;
|
||||
#ifdef __CYGWIN__
|
||||
char_u posix_fname[MAX_PATH];
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef VMS
|
||||
fname = vms_fixfilename(fname);
|
||||
@@ -2288,7 +2293,8 @@ mch_FullName(fname, buf, len, force)
|
||||
/*
|
||||
* This helps for when "/etc/hosts" is a symlink to "c:/something/hosts".
|
||||
*/
|
||||
cygwin_conv_to_posix_path(fname, fname);
|
||||
cygwin_conv_to_posix_path(fname, posix_fname);
|
||||
fname = posix_fname;
|
||||
#endif
|
||||
|
||||
/* expand it if forced or not an absolute path */
|
||||
@@ -2889,16 +2895,28 @@ mch_free_mem()
|
||||
if (clip_plus.owned)
|
||||
clip_lose_selection(&clip_plus);
|
||||
# endif
|
||||
# if (defined(FEAT_X11) && defined(FEAT_XCLIPBOARD)) || defined(PROTO)
|
||||
# if defined(FEAT_X11) && defined(FEAT_XCLIPBOARD)
|
||||
if (xterm_Shell != (Widget)0)
|
||||
XtDestroyWidget(xterm_Shell);
|
||||
# ifndef LESSTIF_VERSION
|
||||
/* Lesstif crashes here, lose some memory */
|
||||
if (xterm_dpy != NULL)
|
||||
XtCloseDisplay(xterm_dpy);
|
||||
if (app_context != (XtAppContext)NULL)
|
||||
{
|
||||
XtDestroyApplicationContext(app_context);
|
||||
# ifdef FEAT_X11
|
||||
x11_display = NULL; /* freed by XtDestroyApplicationContext() */
|
||||
# endif
|
||||
}
|
||||
# endif
|
||||
# endif
|
||||
# ifdef FEAT_X11
|
||||
if (x11_display != NULL && x11_display != xterm_dpy)
|
||||
if (x11_display != NULL
|
||||
# ifdef FEAT_XCLIPBOARD
|
||||
&& x11_display != xterm_dpy
|
||||
# endif
|
||||
)
|
||||
XCloseDisplay(x11_display);
|
||||
# endif
|
||||
# if defined(HAVE_SIGALTSTACK) || defined(HAVE_SIGSTACK)
|
||||
@@ -3886,7 +3904,7 @@ mch_call_shell(cmd, options)
|
||||
/* push stream discipline modules */
|
||||
if (options & SHELL_COOKED)
|
||||
SetupSlavePTY(pty_slave_fd);
|
||||
# ifdef TIOCSCTTY
|
||||
# if defined(TIOCSCTTY) && !defined(FEAT_GUI_MACVIM)
|
||||
/* Try to become controlling tty (probably doesn't work,
|
||||
* unless run by root) */
|
||||
ioctl(pty_slave_fd, TIOCSCTTY, (char *)NULL);
|
||||
@@ -6292,22 +6310,22 @@ clear_xterm_clip()
|
||||
}
|
||||
if (xterm_dpy != NULL)
|
||||
{
|
||||
#if 0
|
||||
# if 0
|
||||
/* Lesstif and Solaris crash here, lose some memory */
|
||||
XtCloseDisplay(xterm_dpy);
|
||||
#endif
|
||||
# endif
|
||||
if (x11_display == xterm_dpy)
|
||||
x11_display = NULL;
|
||||
xterm_dpy = NULL;
|
||||
}
|
||||
#if 0
|
||||
# if 0
|
||||
if (app_context != (XtAppContext)NULL)
|
||||
{
|
||||
/* Lesstif and Solaris crash here, lose some memory */
|
||||
XtDestroyApplicationContext(app_context);
|
||||
app_context = (XtAppContext)NULL;
|
||||
}
|
||||
#endif
|
||||
# endif
|
||||
}
|
||||
# endif
|
||||
|
||||
@@ -6559,7 +6577,6 @@ static int dummy;
|
||||
xsmp_init(void)
|
||||
{
|
||||
char errorstring[80];
|
||||
char *clientid;
|
||||
SmcCallbacks smcallbacks;
|
||||
#if 0
|
||||
SmPropValue smname;
|
||||
@@ -6601,7 +6618,7 @@ xsmp_init(void)
|
||||
| SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask,
|
||||
&smcallbacks,
|
||||
NULL,
|
||||
&clientid,
|
||||
&xsmp.clientid,
|
||||
sizeof(errorstring),
|
||||
errorstring);
|
||||
if (xsmp.smcconn == NULL)
|
||||
@@ -6640,6 +6657,8 @@ xsmp_close()
|
||||
if (xsmp_icefd != -1)
|
||||
{
|
||||
SmcCloseConnection(xsmp.smcconn, 0, NULL);
|
||||
vim_free(xsmp.clientid);
|
||||
xsmp.clientid = NULL;
|
||||
xsmp_icefd = -1;
|
||||
}
|
||||
}
|
||||
|
||||
+7
-1
@@ -432,7 +432,13 @@ typedef struct dsc$descriptor DESC;
|
||||
* Unix has plenty of memory, use large buffers
|
||||
*/
|
||||
#define CMDBUFFSIZE 1024 /* size of the command processing buffer */
|
||||
#define MAXPATHL 1024 /* Unix has long paths and plenty of memory */
|
||||
|
||||
/* Use the system path length if it makes sense. */
|
||||
#if defined(PATH_MAX) && (PATH_MAX > 1000)
|
||||
# define MAXPATHL PATH_MAX
|
||||
#else
|
||||
# define MAXPATHL 1024
|
||||
#endif
|
||||
|
||||
#define CHECK_INODE /* used when checking if a swap file already
|
||||
exists for a file */
|
||||
|
||||
+17
-2
@@ -1,7 +1,8 @@
|
||||
" Vim script for checking .po files.
|
||||
"
|
||||
" Go through the file and verify that all %...s items in "msgid" are identical
|
||||
" to the ones in "msgstr".
|
||||
" Go through the file and verify that:
|
||||
" - All %...s items in "msgid" are identical to the ones in "msgstr".
|
||||
" - An error or warning code in "msgid" matches the one in "msgstr".
|
||||
|
||||
if 1 " Only execute this if the eval feature is available.
|
||||
|
||||
@@ -56,6 +57,20 @@ while 1
|
||||
endif
|
||||
endwhile
|
||||
|
||||
" Check that error code in msgid matches the one in msgstr.
|
||||
"
|
||||
" Examples of mismatches found with msgid "E123: ..."
|
||||
" - msgstr "E321: ..." error code mismatch
|
||||
" - msgstr "W123: ..." warning instead of error
|
||||
" - msgstr "E123 ..." missing colon
|
||||
" - msgstr "..." missing error code
|
||||
"
|
||||
1
|
||||
if search('msgid "\("\n"\)\?\([EW][0-9]\+:\).*\nmsgstr "\("\n"\)\?[^"]\@=\2\@!') > 0
|
||||
echo 'Mismatching error/warning code in line ' . line('.')
|
||||
let error = 1
|
||||
endif
|
||||
|
||||
if error == 0
|
||||
echo "OK"
|
||||
endif
|
||||
|
||||
@@ -124,7 +124,7 @@ gui_mch_haskey(char_u *name);
|
||||
void
|
||||
gui_mch_iconify(void);
|
||||
void
|
||||
gui_mch_invert_rectangle(int r, int c, int nr, int nc);
|
||||
gui_mch_invert_rectangle(int r, int c, int nr, int nc, int invert);
|
||||
void
|
||||
gui_mch_new_colors(void);
|
||||
void
|
||||
|
||||
+30
-18
@@ -3044,6 +3044,7 @@ typedef struct regbehind_S
|
||||
{
|
||||
regsave_T save_after;
|
||||
regsave_T save_behind;
|
||||
int save_need_clear_subexpr;
|
||||
save_se_T save_start[NSUBEXP];
|
||||
save_se_T save_end[NSUBEXP];
|
||||
} regbehind_T;
|
||||
@@ -5858,17 +5859,23 @@ save_subexpr(bp)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NSUBEXP; ++i)
|
||||
/* When "need_clear_subexpr" is set we don't need to save the values, only
|
||||
* remember that this flag needs to be set again when restoring. */
|
||||
bp->save_need_clear_subexpr = need_clear_subexpr;
|
||||
if (!need_clear_subexpr)
|
||||
{
|
||||
if (REG_MULTI)
|
||||
for (i = 0; i < NSUBEXP; ++i)
|
||||
{
|
||||
bp->save_start[i].se_u.pos = reg_startpos[i];
|
||||
bp->save_end[i].se_u.pos = reg_endpos[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
bp->save_start[i].se_u.ptr = reg_startp[i];
|
||||
bp->save_end[i].se_u.ptr = reg_endp[i];
|
||||
if (REG_MULTI)
|
||||
{
|
||||
bp->save_start[i].se_u.pos = reg_startpos[i];
|
||||
bp->save_end[i].se_u.pos = reg_endpos[i];
|
||||
}
|
||||
else
|
||||
{
|
||||
bp->save_start[i].se_u.ptr = reg_startp[i];
|
||||
bp->save_end[i].se_u.ptr = reg_endp[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -5882,17 +5889,22 @@ restore_subexpr(bp)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < NSUBEXP; ++i)
|
||||
/* Only need to restore saved values when they are not to be cleared. */
|
||||
need_clear_subexpr = bp->save_need_clear_subexpr;
|
||||
if (!need_clear_subexpr)
|
||||
{
|
||||
if (REG_MULTI)
|
||||
for (i = 0; i < NSUBEXP; ++i)
|
||||
{
|
||||
reg_startpos[i] = bp->save_start[i].se_u.pos;
|
||||
reg_endpos[i] = bp->save_end[i].se_u.pos;
|
||||
}
|
||||
else
|
||||
{
|
||||
reg_startp[i] = bp->save_start[i].se_u.ptr;
|
||||
reg_endp[i] = bp->save_end[i].se_u.ptr;
|
||||
if (REG_MULTI)
|
||||
{
|
||||
reg_startpos[i] = bp->save_start[i].se_u.pos;
|
||||
reg_endpos[i] = bp->save_end[i].se_u.pos;
|
||||
}
|
||||
else
|
||||
{
|
||||
reg_startp[i] = bp->save_start[i].se_u.ptr;
|
||||
reg_endp[i] = bp->save_end[i].se_u.ptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+4
-1
@@ -4863,6 +4863,7 @@ comp_char_differs(off_from, off_to)
|
||||
* - the (first byte of the) character is different
|
||||
* - the attributes are different
|
||||
* - the character is multi-byte and the next byte is different
|
||||
* - the character is two cells wide and the second cell differs.
|
||||
*/
|
||||
static int
|
||||
char_needs_redraw(off_from, off_to, cols)
|
||||
@@ -4884,7 +4885,9 @@ char_needs_redraw(off_from, off_to, cols)
|
||||
|| (enc_utf8
|
||||
&& (ScreenLinesUC[off_from] != ScreenLinesUC[off_to]
|
||||
|| (ScreenLinesUC[off_from] != 0
|
||||
&& comp_char_differs(off_from, off_to))))
|
||||
&& comp_char_differs(off_from, off_to))
|
||||
|| (cols > 1 && ScreenLines[off_from + 1]
|
||||
!= ScreenLines[off_to + 1])))
|
||||
#endif
|
||||
))
|
||||
return TRUE;
|
||||
|
||||
@@ -2,6 +2,8 @@ Tests for "r<Tab>" with 'smarttab' and 'expandtab' set/not set.
|
||||
|
||||
STARTTEST
|
||||
:set smarttab expandtab ts=8 sw=4
|
||||
:" make sure that backspace works, no matter what termcap is used
|
||||
:set t_kD=x7f t_kb=x08
|
||||
/some
|
||||
r :set noexpandtab
|
||||
/other
|
||||
|
||||
@@ -3,6 +3,8 @@ Test Virtual replace mode.
|
||||
|
||||
STARTTEST
|
||||
:so small.vim
|
||||
:" make sure that backspace works, no matter what termcap is used
|
||||
:set t_kD=x7f t_kb=x08
|
||||
ggdGa
|
||||
abcdefghi
|
||||
jk lmn
|
||||
|
||||
@@ -1126,7 +1126,11 @@ clip_invert_rectangle(row, col, height, width, invert)
|
||||
{
|
||||
#ifdef FEAT_GUI
|
||||
if (gui.in_use)
|
||||
# ifdef FEAT_GUI_MACVIM
|
||||
gui_mch_invert_rectangle(row, col, height, width, invert);
|
||||
# else
|
||||
gui_mch_invert_rectangle(row, col, height, width);
|
||||
#endif
|
||||
else
|
||||
#endif
|
||||
screen_draw_rectangle(row, col, height, width, invert);
|
||||
|
||||
+49
-7
@@ -681,6 +681,44 @@ static char *(features[]) =
|
||||
|
||||
static int included_patches[] =
|
||||
{ /* Add new patch number below this line */
|
||||
/**/
|
||||
330,
|
||||
/**/
|
||||
329,
|
||||
/**/
|
||||
328,
|
||||
/**/
|
||||
327,
|
||||
/**/
|
||||
326,
|
||||
/**/
|
||||
325,
|
||||
/**/
|
||||
324,
|
||||
/**/
|
||||
323,
|
||||
/**/
|
||||
322,
|
||||
/**/
|
||||
321,
|
||||
/**/
|
||||
320,
|
||||
/**/
|
||||
319,
|
||||
/**/
|
||||
318,
|
||||
/**/
|
||||
317,
|
||||
/**/
|
||||
316,
|
||||
/**/
|
||||
315,
|
||||
/**/
|
||||
314,
|
||||
/**/
|
||||
313,
|
||||
/**/
|
||||
312,
|
||||
/**/
|
||||
311,
|
||||
/**/
|
||||
@@ -1366,12 +1404,12 @@ list_version()
|
||||
# ifdef FEAT_GUI_W32
|
||||
# if defined(_MSC_VER) && (_MSC_VER <= 1010)
|
||||
/* Only MS VC 4.1 and earlier can do Win32s */
|
||||
MSG_PUTS(_("\nMS-Windows 16/32 bit GUI version"));
|
||||
MSG_PUTS(_("\nMS-Windows 16/32-bit GUI version"));
|
||||
# else
|
||||
# ifdef _WIN64
|
||||
MSG_PUTS(_("\nMS-Windows 64 bit GUI version"));
|
||||
MSG_PUTS(_("\nMS-Windows 64-bit GUI version"));
|
||||
# else
|
||||
MSG_PUTS(_("\nMS-Windows 32 bit GUI version"));
|
||||
MSG_PUTS(_("\nMS-Windows 32-bit GUI version"));
|
||||
# endif
|
||||
# endif
|
||||
if (gui_is_win32s())
|
||||
@@ -1380,17 +1418,21 @@ list_version()
|
||||
MSG_PUTS(_(" with OLE support"));
|
||||
# endif
|
||||
# else
|
||||
MSG_PUTS(_("\nMS-Windows 32 bit console version"));
|
||||
# ifdef _WIN64
|
||||
MSG_PUTS(_("\nMS-Windows 64-bit console version"));
|
||||
# else
|
||||
MSG_PUTS(_("\nMS-Windows 32-bit console version"));
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
#ifdef WIN16
|
||||
MSG_PUTS(_("\nMS-Windows 16 bit version"));
|
||||
MSG_PUTS(_("\nMS-Windows 16-bit version"));
|
||||
#endif
|
||||
#ifdef MSDOS
|
||||
# ifdef DJGPP
|
||||
MSG_PUTS(_("\n32 bit MS-DOS version"));
|
||||
MSG_PUTS(_("\n32-bit MS-DOS version"));
|
||||
# else
|
||||
MSG_PUTS(_("\n16 bit MS-DOS version"));
|
||||
MSG_PUTS(_("\n16-bit MS-DOS version"));
|
||||
# endif
|
||||
#endif
|
||||
#ifdef MACOS
|
||||
|
||||
Reference in New Issue
Block a user