3 - To build the project:
4 + patch vim7 src with MacVim patch
5 + make vim7 src with --enable-gui=macvim
6 + build MacVim.xcodeproj
8 + copy MacVim.app to /Applications (or anywhere you want it)
9 + in ~/.profile add this line:
10 alias gvim='/Applications/MacVim.app/Contents/MacOS/Vim -g'
12 + Double click MacVim icon
13 + with the above alias you can type 'gvim' in terminal to open MacVim
14 (if the -g switch is left out, then Vim is started in terminal mode)
15 + in terminal mode of Vim, type :gui and MacVim will start
17 + to build a universal binary, the compiler AND linker needs the flags
18 '-isysroot /Developer/SDKs/MacOSX10.4u.sdk -arch ppc -arch i386'; also,
19 make needs argument --with-mac-arch=both
20 + vim runtime files are copied to
21 'MacVim.app/Contents/Resources/vim/runtime/'
25 - When the text system (Cocoa) comes across multi byte characters it
26 automatically chooses a font for those characters; this font may not be the
27 same height as the one set on the text storage and hence the program must
28 account for the fact that lines may have differing heights.
29 We get around this problem by resizing the window to fit the text storage
30 after the layout manager has performed layout. As a side-effect the user
31 sees how the window resizes when certain multi byte characters are being
33 - Remember to set 'inputReceived = YES' in MMBackend
34 handlePortMessage:, otherwise Vim will not inform MMVimController of
35 changes it makes (e.g. in response to a key down event).
36 - The way delegate messages from the tab bar are handled are based on lots of
37 assumptions on how the code works. See comments in tabView:... delegate
38 messages in MMWindowController.
39 - The insertion point is automatically moved to wherever changes are made in
40 the text storage. To set the position manually (via setSelectedRange:),
41 first call endEditing on the text storage.
42 - Delegate messages from the tab view need to be able to differentiate whether
43 the message was sent due to the user clicking a tab with the mouse, or if the
44 vim task initiated the change. To facilitate this, flags must be set
45 whenever the vim task does something that results in these delegate messages
46 being sent. See comments in the tabView:...Item: messages in
48 - In Vim the first tab has index 1, in the gui the first tab has index 0. This
49 is compensated for in MMBackend.m.
50 - The PSMTabBarControl does not reorder the NSTabView when a user drags tabs
51 around, so we must rely on [PSMTabBarControl representedItems] to get the
52 correct order of tabs (the order which the user can 'see'). WARNING! This
53 means that the code cannot rely on calls like
54 [NSTabView selectTabViewItemAtIndex:] etc. since the NSTabView has the
56 - The MMVimController is added to the NSEventTrackingRunLoopMode, otherwise
57 updates from Vim would not reach the MMVimController while the user
58 resizes the window using the mouse.
59 - It seems that (oneway void) DO messages can arrive when another such message
60 is being processed. For this reason, no input is sent to Vim whilst in
61 processCommandQueue:. Instead, messages are queued and sent when
62 processCommandQueue: has finished. Otherwise the invariant that all Vim
63 messages must appear in the same order they were issued will be violated.
64 - Text storage dimensions are not ever directly modified, instead a message is
65 sent to Vim asking it to change the "shell size". Otherwise, a message
66 asking Vim to change the shell size might get lost and Vim and MacVim will
67 have inconsistent states.
68 - gui_mch_browse() is a blocking call, but you can't put up dialogs in Cocoa
69 which block until the user dismisses them (it uses callbacks). This
70 complicates the browsing somewhat.
75 - Output is queued and sent to the MMVimController only when
76 [MMBackend flushQueue] is called in order to minimize the amount of
77 messages sent back and forth between the task and gui. Also, this makes sure
78 that commands reach MacVim in the same order they were issued by Vim.
79 - Drawing commands are stored in a buffer (drawData) and put on the output
80 queue whenever [MMBackend flush] is called. This buffer might no
81 longer be needed now that there is a general output queue. However, the
82 existing code works, so why change it?
83 - [obsolete] The gui listens for tasks on a named port whose name is derived
84 from CFBundleIdentifier (which is defined inside Info.plist of the app
85 bundle). In order to run two different copies of MacVim at the same time,
86 they need to have differing bundle identifiers; otherwise one copy will not
87 be able to create the named listening port and all tasks will connect to the
89 - The gui creates a named NSConnection which vends the MMAppController object.
90 - All tabs share one text view and its associated text storage. There used to
91 be one text view per tab, but this only complicated the code since Vim has no
92 concept of different views (as in NSView).
93 - Vim holds the actual state. MacVim should never change Vim related states
94 directly, instead it must ask Vim to change the state and wait for Vim to
95 reply with an actual state change command.
96 - If MacVim wants to change the state of Vim it must go through
97 processInput:data:, this is an asynchronous call.
98 - MacVim can query state information synchronously by adding a suitable message
99 to MMBackendProtocol, however this must not change the state of Vim!
100 - If MacVim or Vim dies, the NSConnection is invalidated and connectionDidDie:
106 - input ends up in one of the following methods
108 (2) doCommandBySelector:
109 (3) performKeyEquivalent:
111 - (1) handles: printable keys (a, Space, 1, ...) and <M-key> (also <M-C-key>).
112 if Ctrl+Option is held [NSEvents characters] will translate the input to
113 control characters; note that if the translation fails, then Shift and Option
114 modifiers are NOT includeded in [NSEvent characters], but they are included
115 in [NSEvent charactersIgnoringModifiers]. e.g. given <M-C-S-1>, characters
116 returns 1, charactersIgnoringModifiers returns <M-S-1>.
117 - (2) handles: Ctrl+key, enter, backspace, escape.
118 same note on translation of Ctrl+key as above holds true.
119 - (3) handles: Cmd+key, arrow keys, function keys
120 - <M-Space> and <Space> are two different characters (the former is 0xa0)
125 - Using NSString initWithBytesNoCopy:::: causes crash when trying to set window
127 - NSTabViewItem setInitialFirstResponder: seems to have no effect, so we
128 manually set the first responder when the tab item selection changes.
131 Features (!supp indicates that a feature is not supported):
133 - Multiple top-level windows: each window runs its own vim process (they are
134 completely independent)
135 - Tabs: uses PSMTabBarControl to show tabs, can reorder tabs by dragging them,
136 has overflow menu, new tab button on tabline
137 - Menubar: accelerators !supp, actext hint displayed as tool tip
138 instead of on menu, each window has its own menu, key equivalents !supp
139 - Toolbar: toolbariconsize supported (tiny&small equiv to 24x24 px,
140 medium&large equiv to 32x32 px), toolbar supports 'icons' and 'text' options
141 (but not 'tooltip' which is always on), each window has its own toolbar,
143 - Cocoa input protocols: input managers, character palette input etc.
144 supported, marked text !supp, cocoa key bindings (DefaultKeyBinding.dict)
146 - Mouse: resize (vim) windows, selection, different mouse cursors !supp,
147 autoscrolling whilst selecting works poorly
148 - Drag and Drop: drag files onto dock icon to open in tabs, drag to text view
150 - Zoom: Command-click to zoom height only, otherwise maximize witdh as well,
151 hold down Option to zoom all windows
152 - Resize: live resize (although terribly slow), :set lines will not make window
153 higher than can fit the screen (no such restrictions on width at the moment)
154 - Pasteboard: star-register works with the mac os x pasteboard
155 - Open/Save dialog: use with :browse
156 - Fonts: bold/italic/underline traits supported, font changes !supp
157 - File type associations: add more associations by editing Info.plist
158 - Start GUI from terminal, type :gui
160 - Wide characters: !supp
162 - Find/Replace dialog: !supp
164 - External editor protocol: !supp
165 - Services menu: !supp
166 - Encodings: !supp (enc, tenc always set to utf-8)