Improved method to start Vim processes in a login shell
[MacVim.git] / src / MacVim / MacVim.m
blobb63e2b39bbcfd243ed0c30b37cc75008b1fc4154
1 /* vi:set ts=8 sts=4 sw=4 ft=objc:
2  *
3  * VIM - Vi IMproved            by Bram Moolenaar
4  *                              MacVim GUI port by Bjorn Winckler
5  *
6  * Do ":help uganda"  in Vim to read copying and usage conditions.
7  * Do ":help credits" in Vim to see a list of people who contributed.
8  * See README.txt for an overview of the Vim source code.
9  */
11  * MacVim.m:  Code shared between Vim and MacVim.
12  */
14 #import "MacVim.h"
16 char *MessageStrings[] = 
18     "INVALID MESSAGE ID",
19     "OpenVimWindowMsgID",
20     "InsertTextMsgID",
21     "KeyDownMsgID",
22     "CmdKeyMsgID",
23     "BatchDrawMsgID",
24     "SelectTabMsgID",
25     "CloseTabMsgID",
26     "AddNewTabMsgID",
27     "DraggedTabMsgID",
28     "UpdateTabBarMsgID",
29     "ShowTabBarMsgID",
30     "HideTabBarMsgID",
31     "SetTextDimensionsMsgID",
32     "SetWindowTitleMsgID",
33     "ScrollWheelMsgID",
34     "MouseDownMsgID",
35     "MouseUpMsgID",
36     "MouseDraggedMsgID",
37     "FlushQueueMsgID",
38     "AddMenuMsgID",
39     "AddMenuItemMsgID",
40     "RemoveMenuItemMsgID",
41     "EnableMenuItemMsgID",
42     "ExecuteMenuMsgID",
43     "ShowToolbarMsgID",
44     "ToggleToolbarMsgID",
45     "CreateScrollbarMsgID",
46     "DestroyScrollbarMsgID",
47     "ShowScrollbarMsgID",
48     "SetScrollbarPositionMsgID",
49     "SetScrollbarThumbMsgID",
50     "ScrollbarEventMsgID",
51     "SetFontMsgID",
52     "SetWideFontMsgID",
53     "VimShouldCloseMsgID",
54     "SetDefaultColorsMsgID",
55     "ExecuteActionMsgID",
56     "DropFilesMsgID",
57     "DropStringMsgID",
58     "ShowPopupMenuMsgID",
59     "GotFocusMsgID",
60     "LostFocusMsgID",
61     "MouseMovedMsgID",
62     "SetMouseShapeMsgID",
63     "AdjustLinespaceMsgID",
64     "ActivateMsgID",
65     "SetServerNameMsgID",
66     "EnterFullscreenMsgID",
67     "LeaveFullscreenMsgID",
68     "BuffersNotModifiedMsgID",
69     "BuffersModifiedMsgID",
70     "AddInputMsgID",
71     "SetPreEditPositionMsgID",
72     "TerminateNowMsgID",
73     "ODBEditMsgID",
74     "XcodeModMsgID",
75     "LiveResizeMsgID",
81 // NSUserDefaults keys
82 NSString *MMNoWindowKey                 = @"MMNoWindow";
83 NSString *MMTabMinWidthKey              = @"MMTabMinWidth";
84 NSString *MMTabMaxWidthKey              = @"MMTabMaxWidth";
85 NSString *MMTabOptimumWidthKey          = @"MMTabOptimumWidth";
86 NSString *MMTextInsetLeftKey            = @"MMTextInsetLeft";
87 NSString *MMTextInsetRightKey           = @"MMTextInsetRight";
88 NSString *MMTextInsetTopKey             = @"MMTextInsetTop";
89 NSString *MMTextInsetBottomKey          = @"MMTextInsetBottom";
90 NSString *MMTerminateAfterLastWindowClosedKey
91                                         = @"MMTerminateAfterLastWindowClosed";
92 NSString *MMTypesetterKey               = @"MMTypesetter";
93 NSString *MMCellWidthMultiplierKey      = @"MMCellWidthMultiplier";
94 NSString *MMBaselineOffsetKey           = @"MMBaselineOffset";
95 NSString *MMTranslateCtrlClickKey       = @"MMTranslateCtrlClick";
96 NSString *MMTopLeftPointKey             = @"MMTopLeftPoint";
97 NSString *MMOpenFilesInTabsKey          = @"MMOpenFilesInTabs";
98 NSString *MMNoFontSubstitutionKey       = @"MMNoFontSubstitution";
99 NSString *MMLoginShellKey               = @"MMLoginShell";
100 NSString *MMAtsuiRendererKey            = @"MMAtsuiRenderer";
101 NSString *MMUntitledWindowKey           = @"MMUntitledWindow";
102 NSString *MMTexturedWindowKey           = @"MMTexturedWindow";
103 NSString *MMZoomBothKey                 = @"MMZoomBoth";
104 NSString *MMCurrentPreferencePaneKey    = @"MMCurrentPreferencePane";
105 NSString *MMLoginShellCommandKey        = @"MMLoginShellCommand";
106 NSString *MMLoginShellArgumentKey       = @"MMLoginShellArgument";
111     ATSFontContainerRef
112 loadFonts()
114     // This loads all fonts from the Resources folder.  The fonts are only
115     // available to the process which loaded them, so loading has to be done
116     // once for MacVim and an additional time for each Vim process.  The
117     // returned container ref should be used to deactiave the font.
118     //
119     // (Code taken from cocoadev.com)
120     ATSFontContainerRef fontContainerRef = 0;
121     NSString *fontsFolder = [[NSBundle mainBundle] resourcePath];    
122     if (fontsFolder) {
123         NSURL *fontsURL = [NSURL fileURLWithPath:fontsFolder];
124         if (fontsURL) {
125             FSRef fsRef;
126             FSSpec fsSpec;
127             CFURLGetFSRef((CFURLRef)fontsURL, &fsRef);
129             if (FSGetCatalogInfo(&fsRef, kFSCatInfoNone, NULL, NULL, &fsSpec,
130                         NULL) == noErr) {
131                 ATSFontActivateFromFileSpecification(&fsSpec,
132                         kATSFontContextLocal, kATSFontFormatUnspecified, NULL,
133                         kATSOptionFlagsDefault, &fontContainerRef);
134             }
135         }
136     }
138     return fontContainerRef;
144     NSString *
145 buildTabDropCommand(NSArray *filenames)
147     // Create a command line string that will open the specified files in tabs.
149     if (!filenames || [filenames count] == 0)
150         return [NSString string];
152     NSMutableString *cmd = [NSMutableString stringWithString:
153             @"<C-\\><C-N>:tab drop"];
155     NSEnumerator *e = [filenames objectEnumerator];
156     id o;
157     while ((o = [e nextObject])) {
158         NSString *file = [o stringByEscapingSpecialFilenameCharacters];
159         [cmd appendString:@" "];
160         [cmd appendString:file];
161     }
163     [cmd appendString:@"|redr|f<CR>"];
165     return cmd;
168     NSString *
169 buildSelectRangeCommand(NSRange range)
171     // Build a command line string that will select the given range of lines.
172     // If range.length == 0, then position the cursor on the given line but do
173     // not select.
175     if (range.location == NSNotFound)
176         return [NSString string];
178     NSString *cmd;
179     if (range.length > 0) {
180         cmd = [NSString stringWithFormat:@"<C-\\><C-N>%dGV%dGz.0",
181                 NSMaxRange(range), range.location];
182     } else {
183         cmd = [NSString stringWithFormat:@"<C-\\><C-N>%dGz.0", range.location];
184     }
186     return cmd;
189     NSString *
190 buildSearchTextCommand(NSString *searchText)
192     // TODO: Searching is an exclusive motion, so if the pattern would match on
193     // row 0 column 0 then this pattern will miss that match.
194     return [NSString stringWithFormat:@"<C-\\><C-N>gg/\\c%@<CR>", searchText];
200 @implementation NSString (MMExtras)
202 - (NSString *)stringByEscapingSpecialFilenameCharacters
204     // NOTE: This code assumes that no characters already have been escaped.
205     NSMutableString *string = [self mutableCopy];
207     [string replaceOccurrencesOfString:@"\\"
208                             withString:@"\\\\"
209                                options:NSLiteralSearch
210                                  range:NSMakeRange(0, [string length])];
211     [string replaceOccurrencesOfString:@" "
212                             withString:@"\\ "
213                                options:NSLiteralSearch
214                                  range:NSMakeRange(0, [string length])];
215     [string replaceOccurrencesOfString:@"\t"
216                             withString:@"\\\t "
217                                options:NSLiteralSearch
218                                  range:NSMakeRange(0, [string length])];
219     [string replaceOccurrencesOfString:@"%"
220                             withString:@"\\%"
221                                options:NSLiteralSearch
222                                  range:NSMakeRange(0, [string length])];
223     [string replaceOccurrencesOfString:@"#"
224                             withString:@"\\#"
225                                options:NSLiteralSearch
226                                  range:NSMakeRange(0, [string length])];
227     [string replaceOccurrencesOfString:@"|"
228                             withString:@"\\|"
229                                options:NSLiteralSearch
230                                  range:NSMakeRange(0, [string length])];
231     [string replaceOccurrencesOfString:@"\""
232                             withString:@"\\\""
233                                options:NSLiteralSearch
234                                  range:NSMakeRange(0, [string length])];
236     return [string autorelease];
239 @end // NSString (MMExtras)
243 @implementation NSIndexSet (MMExtras)
245 + (id)indexSetWithVimList:(NSString *)list
247     NSMutableIndexSet *idxSet = [NSMutableIndexSet indexSet];
248     NSArray *array = [list componentsSeparatedByString:@"\n"];
249     unsigned i, count = [array count];
251     for (i = 0; i < count; ++i) {
252         NSString *entry = [array objectAtIndex:i];
253         if ([entry intValue] > 0)
254             [idxSet addIndex:i];
255     }
257     return idxSet;
260 @end // NSIndexSet (MMExtras)
265 @implementation NSColor (MMExtras)
267 + (NSColor *)colorWithRgbInt:(unsigned)rgb
269     float r = ((rgb>>16) & 0xff)/255.0f;
270     float g = ((rgb>>8) & 0xff)/255.0f;
271     float b = (rgb & 0xff)/255.0f;
273     return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:1.0f];
276 + (NSColor *)colorWithArgbInt:(unsigned)argb
278     float a = ((argb>>24) & 0xff)/255.0f;
279     float r = ((argb>>16) & 0xff)/255.0f;
280     float g = ((argb>>8) & 0xff)/255.0f;
281     float b = (argb & 0xff)/255.0f;
283     return [NSColor colorWithCalibratedRed:r green:g blue:b alpha:a];
286 @end // NSColor (MMExtras)