mirror of
https://github.com/macvim-dev/macvim.git
synced 2026-05-28 00:21:57 +02:00
Compare commits
180 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 | |||
| bf70f82498 | |||
| 89d9e60b8a | |||
| 0ea7546c7c | |||
| 321fdf61aa | |||
| 2fa74c01aa | |||
| c4222c6ebb | |||
| 1f538dc364 | |||
| 9471224d0b | |||
| 1d83527039 | |||
| 7752431b82 | |||
| 2ac28f887e | |||
| 9c517cb4e9 | |||
| 3915c6afc6 | |||
| a4569d06ac | |||
| cb120a21cf | |||
| 7070fd3f76 | |||
| 9f1b770ee6 | |||
| ebf10927c7 | |||
| e18186c461 | |||
| af279d2477 | |||
| 8c442b7b28 | |||
| 4c6ed9759c | |||
| d98e291038 | |||
| 092e0cc894 | |||
| b904b019b8 | |||
| c0159b8fdf | |||
| 11ec93a03a | |||
| c2f8b396de | |||
| fa15736b2b | |||
| d1a9e08f94 | |||
| 9d2727c56f | |||
| ce9c112020 | |||
| 0e2ddfca38 | |||
| 1f7de911ba | |||
| f6ab5cbc03 | |||
| 44d7e60b06 | |||
| 0e37f590ab | |||
| a0f684e003 | |||
| f54c3100e9 | |||
| a588fc3e33 | |||
| 039f611554 | |||
| 3a4682c9dd | |||
| fdc64858c5 | |||
| 45a9151fc6 | |||
| b9241163d8 | |||
| defa7bd098 | |||
| 6bfab82aca | |||
| 64959e3177 | |||
| 2eee45eb39 | |||
| 8d051eef4e | |||
| 7f449520a5 | |||
| 07831f45b2 | |||
| 9a69ad0d62 | |||
| be6ecb5d92 | |||
| 138be9d567 | |||
| 0430474168 | |||
| 0f1ee64746 | |||
| d08cc220fd | |||
| 04d9ab21b0 | |||
| 9c7523e944 | |||
| 030d0d07ec | |||
| 0578f14843 | |||
| 11274e43c4 | |||
| ebfad47ec6 | |||
| 48e6f325d6 | |||
| e899e2dfc7 | |||
| 1bc466c774 | |||
| f08c899208 | |||
| 31bd050607 | |||
| 2e6fb2ea53 | |||
| 862da53932 | |||
| 15763286bd | |||
| fed823a238 | |||
| 5d5176aabf | |||
| 19468d3117 | |||
| 0402b6b5c4 | |||
| b6932fb3ae | |||
| 22695b7f3b | |||
| bc8b62f3d9 | |||
| bd542602dd | |||
| e5159c3b6a | |||
| b36829bcaa | |||
| 07c344444b | |||
| bafcc3365d | |||
| 41ca0e5508 | |||
| 246dfc17f4 | |||
| 9aae3ba3cc | |||
| 0a54dd7370 | |||
| 6e8e20588d | |||
| 296634f40e | |||
| 13d45e4ff9 | |||
| 3e314dee6e | |||
| 779811f241 | |||
| 22017e1410 | |||
| af8ea2cc11 | |||
| ac3b778ddb | |||
| 1de2bc973a | |||
| cdb8dc17ca | |||
| b11e6ca3c9 | |||
| 69c366f7ed | |||
| 7792c4e8ab | |||
| 3910f20697 | |||
| 472eda54f6 | |||
| c09ef35588 | |||
| bf90097520 | |||
| 3292e01a82 | |||
| ba210fdada | |||
| 2d57fac276 | |||
| 4868c3cb85 | |||
| d38abe1843 | |||
| 045cef0a51 | |||
| 560504f7ba | |||
| 4ba3129468 | |||
| 98cc0fee24 | |||
| 26349fc938 | |||
| fb5cf175af | |||
| 0243a624be | |||
| 96433d48a1 | |||
| e5ecb34260 | |||
| 60fd59ea55 | |||
| 8afb077865 | |||
| eef4ba19a6 | |||
| 8574b2152c | |||
| 52b5ee23fc | |||
| d97c301011 | |||
| 343bd24d2e | |||
| a58654a6b0 | |||
| af62299744 | |||
| 60cd2a75c1 | |||
| 2ef7f8c8a0 | |||
| f2282b0096 | |||
| 90c663f76b | |||
| 5d748c8f27 | |||
| b884eef376 | |||
| 49cb3f99b8 |
@@ -193,6 +193,7 @@ SRC_UNIX = \
|
||||
src/vim_icon.xbm \
|
||||
src/vim_mask.xbm \
|
||||
src/vimtutor \
|
||||
src/gvimtutor \
|
||||
src/which.sh \
|
||||
src/workshop.c \
|
||||
src/workshop.h \
|
||||
|
||||
+22
-10
@@ -1,6 +1,6 @@
|
||||
" Vim autoload file for editing compressed files.
|
||||
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||
" Last Change: 2007 May 10
|
||||
" Last Change: 2008 May 29
|
||||
|
||||
" These functions are used by the gzip plugin.
|
||||
|
||||
@@ -73,8 +73,15 @@ fun gzip#read(cmd)
|
||||
let empty = line("'[") == 1 && line("']") == line("$")
|
||||
let tmp = tempname()
|
||||
let tmpe = tmp . "." . expand("<afile>:e")
|
||||
if exists('*fnameescape')
|
||||
let tmp_esc = fnameescape(tmp)
|
||||
let tmpe_esc = fnameescape(tmpe)
|
||||
else
|
||||
let tmp_esc = escape(tmp, ' ')
|
||||
let tmpe_esc = escape(tmpe, ' ')
|
||||
endif
|
||||
" write the just read lines to a temp file "'[,']w tmp.gz"
|
||||
execute "silent '[,']w " . escape(tmpe, ' ')
|
||||
execute "silent '[,']w " . tmpe_esc
|
||||
" uncompress the temp file: call system("gzip -dn tmp.gz")
|
||||
call system(a:cmd . " " . s:escape(tmpe))
|
||||
if !filereadable(tmp)
|
||||
@@ -95,12 +102,12 @@ fun gzip#read(cmd)
|
||||
setlocal nobin
|
||||
if exists(":lockmarks")
|
||||
if empty
|
||||
execute "silent lockmarks " . l . "r ++edit " . tmp
|
||||
execute "silent lockmarks " . l . "r ++edit " . tmp_esc
|
||||
else
|
||||
execute "silent lockmarks " . l . "r " . tmp
|
||||
execute "silent lockmarks " . l . "r " . tmp_esc
|
||||
endif
|
||||
else
|
||||
execute "silent " . l . "r " . tmp
|
||||
execute "silent " . l . "r " . tmp_esc
|
||||
endif
|
||||
|
||||
" if buffer became empty, delete trailing blank line
|
||||
@@ -110,8 +117,8 @@ fun gzip#read(cmd)
|
||||
endif
|
||||
" delete the temp file and the used buffers
|
||||
call delete(tmp)
|
||||
silent! exe "bwipe " . tmp
|
||||
silent! exe "bwipe " . tmpe
|
||||
silent! exe "bwipe " . tmp_esc
|
||||
silent! exe "bwipe " . tmpe_esc
|
||||
endif
|
||||
|
||||
" Restore saved option values.
|
||||
@@ -124,10 +131,15 @@ fun gzip#read(cmd)
|
||||
|
||||
" When uncompressed the whole buffer, do autocommands
|
||||
if ok && empty
|
||||
if &verbose >= 8
|
||||
execute "doau BufReadPost " . expand("%:r")
|
||||
if exists('*fnameescape')
|
||||
let fname = fnameescape(expand("%:r"))
|
||||
else
|
||||
execute "silent! doau BufReadPost " . expand("%:r")
|
||||
let fname = escape(expand("%:r"), " \t\n*?[{`$\\%#'\"|!<")
|
||||
endif
|
||||
if &verbose >= 8
|
||||
execute "doau BufReadPost " . fname
|
||||
else
|
||||
execute "silent! doau BufReadPost " . fname
|
||||
endif
|
||||
endif
|
||||
endfun
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
" MacVim colorscheme
|
||||
"
|
||||
" Maintainer: Bjorn Winckler <bjorn.winckler@gmail.com>
|
||||
" Last Change: 2007 Nov 17
|
||||
" Last Change: 2008 May 9
|
||||
"
|
||||
" This is the default MacVim color scheme. It supports both light and dark
|
||||
" backgrounds (see :h 'background').
|
||||
@@ -50,7 +50,11 @@ hi TabLineFill gui=reverse
|
||||
hi TabLineSel gui=bold
|
||||
hi Title gui=bold guifg=DeepSkyBlue3
|
||||
hi VertSplit gui=NONE guifg=DarkSlateGray guibg=Gray90
|
||||
hi Visual guibg=MacSelectedTextBackgroundColor
|
||||
if has("gui_macvim")
|
||||
hi Visual guibg=MacSelectedTextBackgroundColor
|
||||
else
|
||||
hi Visual guibg=#72F7FF
|
||||
endif
|
||||
hi WarningMsg guifg=Firebrick2
|
||||
|
||||
" Syntax items (`:he group-name` -- more groups are available, these are just
|
||||
@@ -101,7 +105,11 @@ else
|
||||
hi DiffText gui=NONE guibg=Gold
|
||||
hi LineNr guifg=#888888 guibg=#E6E6E6
|
||||
hi MatchParen guifg=White guibg=MediumPurple1
|
||||
hi Normal gui=NONE guifg=MacTextColor guibg=MacTextBackgroundColor
|
||||
if has("gui_macvim")
|
||||
hi Normal gui=NONE guifg=MacTextColor guibg=MacTextBackgroundColor
|
||||
else
|
||||
hi Normal gui=NONE guifg=Black guibg=White
|
||||
endif
|
||||
hi Search guibg=CadetBlue1 guifg=NONE
|
||||
hi Statement gui=bold guifg=Maroon guibg=NONE
|
||||
hi Todo gui=NONE guifg=DarkGreen guibg=PaleGreen1
|
||||
@@ -115,7 +123,7 @@ endif
|
||||
" Change the selection color on focus change (but only if the "macvim"
|
||||
" colorscheme is active).
|
||||
"
|
||||
if !exists("s:augroups_defined")
|
||||
if has("gui_macvim") && !exists("s:augroups_defined")
|
||||
au FocusLost * if exists("colors_name") && colors_name == "macvim" | hi Visual guibg=MacSecondarySelectedControlColor | endif
|
||||
au FocusGained * if exists("colors_name") && colors_name == "macvim" | hi Visual guibg=MacSelectedTextBackgroundColor | endif
|
||||
|
||||
|
||||
+19
-1
@@ -1,4 +1,4 @@
|
||||
*eval.txt* For Vim version 7.1. Last change: 2008 Feb 20
|
||||
*eval.txt* For Vim version 7.1. Last change: 2008 May 28
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@@ -1609,6 +1609,7 @@ finddir( {name}[, {path}[, {count}]])
|
||||
String find directory {name} in {path}
|
||||
findfile( {name}[, {path}[, {count}]])
|
||||
String find file {name} in {path}
|
||||
fnameescape( {fname}) String escape special characters in {fname}
|
||||
fnamemodify( {fname}, {mods}) String modify file name
|
||||
foldclosed( {lnum}) Number first line of fold at {lnum} if closed
|
||||
foldclosedend( {lnum}) Number last line of fold at {lnum} if closed
|
||||
@@ -2620,6 +2621,19 @@ findfile({name}[, {path}[, {count}]]) *findfile()*
|
||||
< Searches from the directory of the current file upwards until
|
||||
it finds the file "tags.vim".
|
||||
|
||||
fnameescape({string}) *fnameescape()*
|
||||
Escape {string} for use as file name command argument. All
|
||||
characters that have a special meaning, such as '%' and '|'
|
||||
are escaped with a backslash.
|
||||
For most systems the characters escaped are "". For systems
|
||||
where a backslash appears in a filename, it depends on the
|
||||
value of 'isfname'.
|
||||
Example: >
|
||||
:let fname = 'some str%nge|name'
|
||||
:exe "edit " . fnameescape(fname)
|
||||
< results in executing: >
|
||||
edit some\ str\%nge\|name
|
||||
|
||||
fnamemodify({fname}, {mods}) *fnamemodify()*
|
||||
Modify file name {fname} according to {mods}. {mods} is a
|
||||
string of characters like it is used for file names on the
|
||||
@@ -3501,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
|
||||
|
||||
+94
-51
@@ -1,4 +1,4 @@
|
||||
*gui_mac.txt* For Vim version 7.1. Last change: 2008 Feb 05
|
||||
*gui_mac.txt* For Vim version 7.1. Last change: 2008 May 25
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bjorn Winckler
|
||||
@@ -124,7 +124,7 @@ strings like "((3) of 2)" to appear in the window title.
|
||||
|
||||
*macvim-options*
|
||||
These are the non-standard options that MacVim supports:
|
||||
'fullscreen' 'toolbariconsize' 'transparency'
|
||||
'fullscreen' 'fuoptions' 'toolbariconsize' 'transparency' 'antialias'
|
||||
|
||||
*macvim-find*
|
||||
Whenever you search for something in Vim (e.g. using "/") the search query is
|
||||
@@ -142,6 +142,11 @@ another in MacVim. Simply search for something in one window (using "/") then
|
||||
switch to another (e.g. with <D-`>) and hit <D-g> and the search will be
|
||||
repeated in the new window.
|
||||
|
||||
*macvim-backspace* *macvim-delete*
|
||||
The 'backspace' option is set in the system vimrc to make the delete key
|
||||
behave in a more familiar way to new users. If you dislike this non-default
|
||||
behaviour, then add the line "set backspace&" to your "~/.vimrc" file.
|
||||
|
||||
==============================================================================
|
||||
2. Starting MacVim *macvim-start*
|
||||
|
||||
@@ -220,7 +225,9 @@ as general information regarding Mac OS X user defaults.
|
||||
Here is a list of relevant dictionary entries:
|
||||
|
||||
KEY VALUE ~
|
||||
MMAtsuiRenderer enable ATSUI renderer [bool]
|
||||
MMCellWidthMultiplier width of a normal glyph in em units [float]
|
||||
MMDialogsTrackPwd open/save dialogs track the Vim pwd [bool]
|
||||
MMLoginShellArgument login shell parameter [string]
|
||||
MMLoginShellCommand which shell to use to launch Vim [string]
|
||||
MMNoFontSubstitution disable automatic font substitution [bool]
|
||||
@@ -309,49 +316,84 @@ than the default?) then post them to |vim_mac|.
|
||||
==============================================================================
|
||||
5. Menus *macvim-menus*
|
||||
|
||||
*:macm* *:macmenukey*
|
||||
MacVim has a special way of binding keys to menu items that differs from other
|
||||
Vim GUI ports. A menu binding is called a "key equivalent" in Mac OS X
|
||||
terminology, this is displayed on the right side of a menu item. The
|
||||
":macmenukey" command is used to set the key equivalent of a menu item. This
|
||||
command takes two parameters, the first names the menu item to bind to, the
|
||||
second gives the key combination. For example: >
|
||||
:macmenukey File.New\ Tab <D-t>
|
||||
This sets the key equivalent of the "New Tab" menu item under the "File" menu
|
||||
to Cmd+t.
|
||||
Menus in Mac OS X behave slightly different from other platforms. For that
|
||||
reason two new commands have been added to Vim. To understand what these
|
||||
commands do you must first understand how menus work on OS X.
|
||||
|
||||
Note that key equivalents:
|
||||
* must contain the Cmd modifier flag (<D-...>)
|
||||
* take precedence over normal mappings made with ":map"
|
||||
* can only be modified during startup (e.g. in .gvimrc)
|
||||
Each entry in a menu is called a "menu item". With each menu item is
|
||||
associated: a title, a key equivalent and an action message. When a menu is
|
||||
displayed the title is shown on the left and the key equivalent (if any) is
|
||||
shown on the right. Key equivalents enable you to access a menu item using
|
||||
the keyboard instead of having to use the mouse. When a menu item is clicked
|
||||
it will send it's associated action message. Actions can be used to instruct
|
||||
MacVim to paste some text (paste:), open a new window (newWindow:), etc.
|
||||
Certain actions are standard throughout OS X which is why MacVim must be able
|
||||
to set these for each menu item. (E.g. the menu item "Edit.Paste" must be
|
||||
bound to the action "paste:" otherwise pasting won't work in dialogs since
|
||||
that is the action that instructs them to paste something.)
|
||||
|
||||
It is possible to reset a key equivalent by calling :macmenukey with a menu
|
||||
name but no key. This is so that the default key equivalents can be reset in
|
||||
"~/.gvimrc". For example, if you would like to free up <D-s> (which is the
|
||||
key equivalent of "File.Save") then add the following line to "~/.gvimrc": >
|
||||
macmenukey File.Save
|
||||
Now you can use :map to bind <D-s> to whatever you like.
|
||||
Menus are configured using the |:macmenu| command and the |:macaction| command
|
||||
can be used to send action messages.
|
||||
|
||||
It is not necessary to reset a key equivalent if all you want to do is to
|
||||
change the key equivalent of a menu item. For example, say you want to use
|
||||
<D-M-Right> as the key equivalent for "Next Tab", then add the following line
|
||||
to "~/.gvimrc": >
|
||||
macmenukey Window.Next\ Tab <D-M-Right>
|
||||
<
|
||||
*:maca* *:macaction*
|
||||
It is typical for menu items in Cocoa applications to bind to Objective-C
|
||||
selectors. To support this, MacVim introduces the ":macaction" command. This
|
||||
command takes the name of an action message as its only parameter. (An action
|
||||
message is an Objective-C message with "void" return type and a single
|
||||
parameter of type "id".) For example, the "New Window" menu item on the
|
||||
"File" menu is created in the following manner: >
|
||||
:an 10.290 File.New\ Window :macaction newWindow:<CR>
|
||||
:maca[ction] {action:} Send the message "action:" to the first responder.
|
||||
The list of allowed actions can be seen by typing
|
||||
:maca <C-d>
|
||||
An attempt to send an action not listed here will
|
||||
result in an error. This list is specified in a
|
||||
property list file called |Actions.plist|.
|
||||
|
||||
Note 1: A menu item which is bound to ":macaction" will automatically be bound
|
||||
to that action in all modes (as if ":an" was used). It is not possible to
|
||||
bind to ":macaction" in one mode only.
|
||||
Note 2: The action is "nil-targeted", which means it is passed down the first
|
||||
responder chain.
|
||||
*:macm* *:macmenu*
|
||||
:mac[menu] {menu} {key}={arg} ...
|
||||
Set Mac specific properties for {menu}. The
|
||||
properties that can be set are:
|
||||
action the action this menu sends
|
||||
alt "yes" if alternate of previous menu
|
||||
key the key equivalent of this menu
|
||||
This command must be used in a startup file, for
|
||||
example in "~/.gvimrc". It has no effect otherwise.
|
||||
|
||||
For convenience, a menu with "action=name:" which is
|
||||
bound to <Nop> will act as if bound to
|
||||
":maca name:<CR>". Thus, if "Menu.Item" is given by
|
||||
:an Menu.Item <Nop>
|
||||
:macm Menu.Item action=name:
|
||||
then ":emenu Menu.Item" is equivalent to
|
||||
":maca name:".
|
||||
|
||||
The key equivalent is specified with the <D-..>
|
||||
syntax. Note that key equivalents must contain the
|
||||
Cmd modifier flag (<D-...>), and they take precedence
|
||||
over normal mappings.
|
||||
Use the syntax "key=<nop>" to clear the key equivalent
|
||||
of a menu. This can be used to free up a key
|
||||
combination that is set in the system gvimrc so that
|
||||
it may be mapped to using ":map".
|
||||
|
||||
Recognised values of "alt" are "0", "no", "1", and
|
||||
"yes". The default is "no". An alternate menu must
|
||||
have the same key equivalent as the previous menu,
|
||||
except the modifier flags must differ. The alternate
|
||||
menu is by default hidden and only shows up when the
|
||||
modifier is held down.
|
||||
|
||||
Here are some examples on how to use these commands:
|
||||
|
||||
1. Create a menu item with title "New Window" under the "File" menu, with key
|
||||
equivalent Cmd-n, which opens a new window when selected: >
|
||||
:an 10.290 File.New\ Window <Nop>
|
||||
:macm File.New\ Window action=newWindow: key=<D-n>
|
||||
2. Change the key equivalent to cycle through tabs to Cmd-Left/Right: >
|
||||
:macm Window.Previous\ Tab key=<D-Left>
|
||||
:macm Window.Next\ Tab key=<D-Right>
|
||||
3. Create a mapping in normal mode which closes the current tab/window: >
|
||||
:map <C-w> :maca performClose:<CR>
|
||||
>
|
||||
|
||||
The standard Vim menus are modified in "$VIM/gvimrc". Take a look at that
|
||||
file for more examples on how to set up menus. Note: When no window is open a
|
||||
minimal default menu is used. The default menu is set up in MainMenu.nib
|
||||
which resides in "Resources/English.lproj/" folder inside the app bundle.
|
||||
|
||||
*Actions.plist*
|
||||
Some action messages would not be suitable to call from within Vim, so there
|
||||
@@ -360,29 +402,30 @@ application bundle) which contains all actions that may be called. The key in
|
||||
this dictionary is the name of the action message (case sensitive), the value
|
||||
is not used.
|
||||
|
||||
Hint: The |:macaction| command supports command-line completion so you can
|
||||
enter ":maca<Space><C-d>" to see a list of all available actions.
|
||||
|
||||
Here is a random assortment of actions from Actions.plist which might be
|
||||
useful.
|
||||
useful.
|
||||
|
||||
Action Description ~
|
||||
fileOpen: Show "File Open" dialog
|
||||
findNext: Search forward using the "Find Pasteboard"
|
||||
findPrevious: Search backward using the "Find Pasteboard"
|
||||
fontSizeDown: Decrease font size
|
||||
fontSizeUp: Increase font size
|
||||
hide: Hide MacVim
|
||||
miniaturizeAll: Minimize all windows to the dock
|
||||
newWindow: Open a new (empty) window
|
||||
orderFrontCharacterPalette: Show the the "Special Characters" dialog
|
||||
orderFrontFontPanel: Show the Font panel
|
||||
orderFrontPreferencePanel: Show the Preferences panel
|
||||
performMiniaturize: Minimize window to the dock
|
||||
performZoom: Zoom window (same as clicking the green blob)
|
||||
selectNextWindow: Select next window (similar to <D-`>)
|
||||
selectPreviousWindow: Select previous window (similar to <S-D-`>)
|
||||
|
||||
As an example, to map <C-z> to performZoom: you could do something like this: >
|
||||
:map <silent> <C-z> :macaction performZoom:<CR>
|
||||
A better way to map to performZoom: would be to set the key equivalent of the
|
||||
menu item "Window.Zoom" to the above action. This can be done by adding the
|
||||
following line to "~/.gvimrc": >
|
||||
macmenukey Window.Zoom <D-C-z>
|
||||
(Note that key equivalents must contain the 'D' flag.)
|
||||
terminate: Quit MacVim
|
||||
zoomAll: Zoom all windows
|
||||
_cycleWindows: Select next window (similar to <D-`>)
|
||||
_cycleWindowsBackwards: Select previous window (similar to <D-S-`>)
|
||||
|
||||
==============================================================================
|
||||
6. Toolbar *macvim-toolbar*
|
||||
|
||||
@@ -1289,7 +1289,7 @@ The commands are sorted on the non-optional part of their name.
|
||||
|:move| :m[ove] move lines
|
||||
|:mark| :ma[rk] set a mark
|
||||
|:macation| :maca[ction] send action message
|
||||
|:macmenukey| :macm[eyequiv] set key equivalent for menu item
|
||||
|:macmenu| :macm[enu] set Mac specific properties for menu item
|
||||
|:make| :mak[e] execute external command 'makeprg' and parse
|
||||
error messages
|
||||
|:map| :map show or enter a mapping
|
||||
|
||||
+80
-18
@@ -1,4 +1,4 @@
|
||||
*options.txt* For Vim version 7.1. Last change: 2007 Aug 10
|
||||
*options.txt* For Vim version 7.1. Last change: 2008 Feb 24
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar
|
||||
@@ -666,17 +666,21 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
Standard Annex #11 (http://www.unicode.org/reports/tr11).
|
||||
|
||||
*'antialias'* *'anti'* *'noantialias'* *'noanti'*
|
||||
'antialias' 'anti' boolean (default: off)
|
||||
'antialias' 'anti' boolean (default off, on for MacVim)
|
||||
global
|
||||
{not in Vi}
|
||||
{only available when compiled with Carbon GUI enabled
|
||||
on Mac OS X}
|
||||
This option only has an effect in the Carbon GUI version of Vim on Mac
|
||||
OS X v10.2 or later. When on, Vim will use smooth ("antialiased")
|
||||
fonts, which can be easier to read at certain sizes on certain
|
||||
displays. Setting this option can sometimes cause problems if
|
||||
'guifont' is set to its default (empty string).
|
||||
Note: Antialiasing is handled automatically on MacVim.
|
||||
{only available when compiled with GUI enabled on
|
||||
Mac OS X}
|
||||
This option only has an effect in the GUI version of Vim on Mac OS X
|
||||
v10.2 or later. When on, Vim will use smooth ("antialiased") fonts,
|
||||
which can be easier to read at certain sizes on certain displays.
|
||||
|
||||
Setting this option in the Carbon version can sometimes cause problems
|
||||
if 'guifont' is set to its default (empty string).
|
||||
|
||||
Support for this option is not flawless in MacVim. In particular,
|
||||
Monaco always seems to render not antialiased for point sizes up
|
||||
to 10. The ATSUI renderer has better antialias support.
|
||||
|
||||
*'autochdir'* *'acd'* *'noautochdir'* *'noacd'*
|
||||
'autochdir' 'acd' boolean (default off)
|
||||
@@ -3046,16 +3050,74 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
'fullscreen' 'fu' boolean (default off)
|
||||
global
|
||||
{not in Vi}
|
||||
{only available in the MacVim GUI}
|
||||
When this option is set, the whole screen is covered by vim. Screen
|
||||
{only in MacVim GUI}
|
||||
When this option is set, the whole screen is covered by Vim. Screen
|
||||
decorations drawn by the operating system (such as the dock or the
|
||||
menu bar) are hidden. Most of vim's window chrome is hidden as well
|
||||
(e.g. toolbar, title bar). The tab bar and scroll bars remains visible.
|
||||
|
||||
Most of the screen is black, only a 'columns' x 'lines' part of the
|
||||
screen is covered by the actual vim control. The control is centered.
|
||||
menu bar) are hidden. Most of Vim's window chrome is hidden as well
|
||||
(e.g. toolbar, title bar). The tab bar and scroll bars remain visible.
|
||||
Updates to the window position are ignored in fullscreen mode.
|
||||
|
||||
See 'fuoptions' for how Vim resizes and colors the background when
|
||||
entering and leaving fullscreen mode.
|
||||
|
||||
XXX: Add fuenter/fuleave autocommands? You might want to display
|
||||
a NERDTree or a Tlist only in fullscreen for example. Then again, this
|
||||
could probably be in a sizechanged autocommand that triggers if the
|
||||
size is above a certain threshold.
|
||||
XXX: Think about how 'fullscreen' and 'transparency' should interact.
|
||||
|
||||
*'fuoptions'* *'fuopt'*
|
||||
'fuoptions' 'fuopt' string (default "maxvert")
|
||||
global
|
||||
{not in Vi}
|
||||
{only in MacVim GUI}
|
||||
In fullscreen mode, most of the screen is black, only a part of the
|
||||
screen is covered by the actual Vim control. The control is centered.
|
||||
This option controls the size of the Vim control as well as the color
|
||||
of the unused screen area.
|
||||
value effect ~
|
||||
maxvert When entering fullscreen, 'lines' is set to the maximum number
|
||||
of lines fitting on the screen in fullscreen mode. When
|
||||
leaving fullscreen, if 'lines' is still equal to the maximized
|
||||
number of lines, it is restored to the value it had before
|
||||
entering fullscreen.
|
||||
maxhorz When entering fullscreen, 'columns' is set to the maximum number
|
||||
of columns fitting on the screen in fullscreen mode. When
|
||||
leaving fullscreen, if 'columns' is still equal to the maximized
|
||||
number of columns, it is restored to the value it had before
|
||||
entering fullscreen.
|
||||
background:color
|
||||
When entering fullscreen, 'color' defines the color of the part
|
||||
of the screen that is not occupied by the Vim control. If
|
||||
'color' is an 8-digit hexadecimal number preceded by '#',
|
||||
it is interpreted as an explicit color value '#aarrggbb', with
|
||||
one byte each for the alpha, red, green, and blue values.
|
||||
Otherwise, 'color' is interpreted as a highlight group name,
|
||||
and the fullscreen background is filled with that highlight
|
||||
group's background color, as defined by the current color
|
||||
scheme.
|
||||
|
||||
Examples:
|
||||
Don't change size of Vim when entering fullscreen: >
|
||||
:set fuoptions=
|
||||
< Maximize Vim when entering fullscreen: >
|
||||
:set fuoptions=maxvert,maxhorz
|
||||
< Maximize Vim only vertically when entering fullscreen, and color the
|
||||
background dark blue: >
|
||||
:set fuoptions=maxvert,background:#FF003042
|
||||
< Don't change the size of Vim when entering fullscreen, and color the
|
||||
background like the current text background: >
|
||||
:set fuoptions=background:Normal
|
||||
<
|
||||
XXX: what if the font size is changed? you probably never want to
|
||||
restore the old 'lines' or 'columns' in that case.
|
||||
XXX: Each time the Vim window resizes (for example due to font size
|
||||
changes, re-maximize Vim to fullscreen?)
|
||||
XXX: The approach doesn't restore vertical Vim size if fu is entered
|
||||
without tabs and leaves with tabs (or the other way round).
|
||||
|
||||
|
||||
|
||||
*'gdefault'* *'gd'* *'nogdefault'* *'nogd'*
|
||||
'gdefault' 'gd' boolean (default off)
|
||||
global
|
||||
@@ -4906,7 +4968,7 @@ A jump table for the options with a short description can be found at |Q_op|.
|
||||
|autocmd-osfiletypes|
|
||||
|
||||
*'paragraphs'* *'para'*
|
||||
'paragraphs' 'para' string (default "IPLPPPQPP LIpplpipbp")
|
||||
'paragraphs' 'para' string (default "IPLPPPQPP TPHPLIPpLpItpplpipbp")
|
||||
global
|
||||
Specifies the nroff macros that separate paragraphs. These are pairs
|
||||
of two letters (see |object-motions|).
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
*os_mac.txt* For Vim version 7.1. Last change: 2006 Apr 30
|
||||
*os_mac.txt* For Vim version 7.1. Last change: 2008 May 19
|
||||
|
||||
|
||||
VIM REFERENCE MANUAL by Bram Moolenaar et al.
|
||||
@@ -6,9 +6,13 @@
|
||||
|
||||
*mac* *Mac* *macintosh* *Macintosh*
|
||||
|
||||
This file documents the particularities of the Macintosh version of Vim.
|
||||
This file documents the particularities of the Mac version of Vim. It was
|
||||
written with the older Carbon version of Vim in mind. If you are using the
|
||||
newer MacVim.app then please go to |macvim|. Some of the information here
|
||||
does not apply to MacVim.app.
|
||||
|
||||
NOTE: This file is a bit outdated. You might find more useful info here:
|
||||
NOTE: This file is a bit outdated. You might find more useful info on the old
|
||||
Carbon version of Vim here:
|
||||
http://macvim.org/
|
||||
|
||||
1. Filename Convention |mac-filename|
|
||||
|
||||
@@ -697,6 +697,7 @@ Short explanation of each option: *option-list*
|
||||
'formatexpr' 'fex' expression used with "gq" command
|
||||
'fsync' 'fs' whether to invoke fsync() after file write
|
||||
'fullscreen' 'fu' let vim cover the whole screen (MacVim only)
|
||||
'fuoptions' 'fuopt' controls how 'fullscreen' behaves (MacVim only)
|
||||
'gdefault' 'gd' the ":substitute" flag 'g' is default on
|
||||
'grepformat' 'gfm' format of 'grepprg' output
|
||||
'grepprg' 'gp' program to use for ":grep"
|
||||
|
||||
@@ -766,7 +766,8 @@ accordingly. Vim proceeds in this order:
|
||||
Note that this file is ALWAYS read in 'compatible' mode, since the
|
||||
automatic resetting of 'compatible' is only done later. Add a ":set
|
||||
nocp" command if you like.
|
||||
For the Macintosh the $VIMRUNTIME/macmap.vim is read.
|
||||
For the Macintosh the $VIMRUNTIME/macmap.vim is read (not on
|
||||
MacVim.app, this only applies to the older Carbon version).
|
||||
|
||||
*VIMINIT* *.vimrc* *_vimrc* *EXINIT* *.exrc* *_exrc*
|
||||
c. Four places are searched for initializations. The first that exists
|
||||
|
||||
@@ -1177,6 +1177,8 @@ goes from 2.2 to 2.3. (Gordon Prieur)
|
||||
|
||||
Mac: When starting up Vim will load the $VIMRUNTIME/macmap.vim script to
|
||||
define default command-key mappings. (mostly by Benji Fisher)
|
||||
This only applies to the older Carbon version of Vim, MacVim.app does not
|
||||
source this file.
|
||||
|
||||
Mac: Add the selection type to the clipboard, so that Block, line and
|
||||
character selections can be used between two Vims. (Eckehard Berns)
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
vimtutor \- the Vim tutor
|
||||
.SH SYNOPSIS
|
||||
.br
|
||||
.B vimtutor [language]
|
||||
.B vimtutor [-g] [language]
|
||||
.SH DESCRIPTION
|
||||
.B Vimtutor
|
||||
starts the
|
||||
@@ -18,6 +18,9 @@ is useful for people that want to learn their first
|
||||
.B Vim
|
||||
commands.
|
||||
.PP
|
||||
The optional argument -g starts vimtutor with gvim rather than vim, if the
|
||||
GUI version of vim is available, or falls back to Vim if gvim is not found.
|
||||
.PP
|
||||
The optional [language] argument is the two-letter name of a language, like
|
||||
"it" or "es".
|
||||
If the [language] argument is missing, the language of the current locale will
|
||||
|
||||
@@ -16,20 +16,23 @@ set cpo&vim
|
||||
augroup filetypedetect
|
||||
|
||||
" Ignored extensions
|
||||
if exists("*fnameescape")
|
||||
au BufNewFile,BufRead ?\+.orig,?\+.bak,?\+.old,?\+.new,?\+.rpmsave,?\+.rpmnew
|
||||
\ exe "doau filetypedetect BufRead " . expand("<afile>:r")
|
||||
\ exe "doau filetypedetect BufRead " . fnameescape(expand("<afile>:r"))
|
||||
au BufNewFile,BufRead *~
|
||||
\ let s:name = expand("<afile>") |
|
||||
\ let s:short = substitute(s:name, '\~$', '', '') |
|
||||
\ if s:name != s:short && s:short != "" |
|
||||
\ exe "doau filetypedetect BufRead " . s:short |
|
||||
\ exe "doau filetypedetect BufRead " . fnameescape(s:short) |
|
||||
\ endif |
|
||||
\ unlet s:name |
|
||||
\ unlet s:short
|
||||
\ unlet s:name s:short
|
||||
au BufNewFile,BufRead ?\+.in
|
||||
\ if expand("<afile>:t") != "configure.in" |
|
||||
\ exe "doau filetypedetect BufRead " . expand("<afile>:r") |
|
||||
\ exe "doau filetypedetect BufRead " . fnameescape(expand("<afile>:r")) |
|
||||
\ endif
|
||||
elseif &verbose > 0
|
||||
echomsg "Warning: some filetypes will not be recognized because this version of Vim does not have fnameescape()"
|
||||
endif
|
||||
|
||||
" Pattern used to match file names which should not be inspected.
|
||||
" Currently finds compressed files.
|
||||
@@ -187,7 +190,7 @@ func! s:FTasmsyntax()
|
||||
let head = " ".getline(1)." ".getline(2)." ".getline(3)." ".getline(4).
|
||||
\" ".getline(5)." "
|
||||
if head =~ '\sasmsyntax=\S\+\s'
|
||||
let b:asmsyntax = substitute(head, '.*\sasmsyntax=\(\S\+\)\s.*','\1', "")
|
||||
let b:asmsyntax = substitute(head, '.*\sasmsyntax=\([a-zA-Z0-9]\+\)\s.*','\1', "")
|
||||
elseif ((head =~? '\.title') || (head =~? '\.ident') || (head =~? '\.macro') || (head =~? '\.subtitle') || (head =~? '\.library'))
|
||||
let b:asmsyntax = "vmasm"
|
||||
endif
|
||||
|
||||
+3
-2
@@ -783,8 +783,9 @@ func! s:BMMunge(fname, bnum)
|
||||
return name
|
||||
endfunc
|
||||
|
||||
" When just starting Vim, load the buffer menu later
|
||||
if has("vim_starting")
|
||||
" When just starting Vim, load the buffer menu later. Don't do this for MacVim
|
||||
" because it makes the menu flicker each time a new editor window is opened.
|
||||
if has("vim_starting") && !has("gui_macvim")
|
||||
augroup LoadBufferMenu
|
||||
au! VimEnter * if !exists("no_buffers_menu") | call <SID>BMShow() | endif
|
||||
au VimEnter * au! LoadBufferMenu
|
||||
|
||||
+8
-2
@@ -1,7 +1,7 @@
|
||||
" These commands create the option window.
|
||||
"
|
||||
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||
" Last Change: 2006 Oct 10
|
||||
" Last Change: 2008 May 12
|
||||
|
||||
" If there already is an option window, jump to that one.
|
||||
if bufwinnr("option-window") > 0
|
||||
@@ -147,7 +147,7 @@ endwhile
|
||||
|
||||
" Open the window
|
||||
new option-window
|
||||
setlocal ts=15 tw=0
|
||||
setlocal ts=15 tw=0 noro
|
||||
|
||||
" Insert help and a "set" command for each option.
|
||||
call append(0, '" Each "set" line shows the current value of an option (on the left).')
|
||||
@@ -350,6 +350,10 @@ call append("$", "lines\tnumber of lines in the display")
|
||||
call append("$", " \tset lines=" . &lines)
|
||||
call append("$", "lazyredraw\tdon't redraw while executing macros")
|
||||
call <SID>BinOptionG("lz", &lz)
|
||||
if has("reltime")
|
||||
call append("$", "redrawtime\ttimeout for 'hlsearch' and :match highlighting in msec")
|
||||
call append("$", " \tset rdt=" . &rdt)
|
||||
endif
|
||||
call append("$", "writedelay\tdelay in msec for each char written to the display")
|
||||
call append("$", "\t(for debugging)")
|
||||
call append("$", " \tset wd=" . &wd)
|
||||
@@ -617,6 +621,8 @@ if has("gui")
|
||||
call append("$", " \tset transparency=" . &transp)
|
||||
call append("$", "fullscreen\tdisplay vim in fullscreen mode")
|
||||
call <SID>BinOptionG("fullscreen", &fullscreen)
|
||||
call append("$", "fuoptions\tcontrol how fullscreen mode should behave")
|
||||
call <SID>OptionG("fuoptions", &fuoptions)
|
||||
endif
|
||||
endif
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
" Vim plugin for showing matching parens
|
||||
" Maintainer: Bram Moolenaar <Bram@vim.org>
|
||||
" Last Change: 2008 Jan 06
|
||||
" Last Change: 2008 Feb 27
|
||||
|
||||
" Exit quickly when:
|
||||
" - this plugin was already loaded (or disabled)
|
||||
@@ -34,7 +34,8 @@ function! s:Highlight_Matching_Pair()
|
||||
endif
|
||||
|
||||
" Avoid that we remove the popup menu.
|
||||
if pumvisible()
|
||||
" Return when there are no colors (looks like the cursor jumps).
|
||||
if pumvisible() || (&t_Co < 8 && !has("gui_running"))
|
||||
return
|
||||
endif
|
||||
|
||||
@@ -60,39 +61,13 @@ function! s:Highlight_Matching_Pair()
|
||||
endif
|
||||
|
||||
" Figure out the arguments for searchpairpos().
|
||||
" Restrict the search to visible lines with "stopline".
|
||||
" And avoid searching very far (e.g., for closed folds and long lines)
|
||||
" The "viewable" variables give a range in which we can scroll while keeping
|
||||
" the cursor at the same position
|
||||
" adjustedScrolloff accounts for very large numbers of scrolloff
|
||||
let adjustedScrolloff = min([&scrolloff, (line('w$') - line('w0')) / 2])
|
||||
let bottom_viewable = min([line('$'), c_lnum + &lines - adjustedScrolloff - 2])
|
||||
let top_viewable = max([1, c_lnum-&lines+adjustedScrolloff + 2])
|
||||
" one of these stoplines will be adjusted below, but the current values are
|
||||
" minimal boundaries within the current window
|
||||
let stoplinebottom = line('w$')
|
||||
let stoplinetop = line('w0')
|
||||
if i % 2 == 0
|
||||
let s_flags = 'nW'
|
||||
let c2 = plist[i + 1]
|
||||
if has("byte_offset") && has("syntax_items") && &smc > 0
|
||||
let stopbyte = min([line2byte("$"), line2byte(".") + col(".") + &smc * 2])
|
||||
let stopline = min([bottom_viewable, byte2line(stopbyte)])
|
||||
else
|
||||
let stopline = min([bottom_viewable, c_lnum + 100])
|
||||
endif
|
||||
let stoplinebottom = stopline
|
||||
else
|
||||
let s_flags = 'nbW'
|
||||
let c2 = c
|
||||
let c = plist[i - 1]
|
||||
if has("byte_offset") && has("syntax_items") && &smc > 0
|
||||
let stopbyte = max([1, line2byte(".") + col(".") - &smc * 2])
|
||||
let stopline = max([top_viewable, byte2line(stopbyte)])
|
||||
else
|
||||
let stopline = max([top_viewable, c_lnum - 100])
|
||||
endif
|
||||
let stoplinetop = stopline
|
||||
endif
|
||||
if c == '['
|
||||
let c = '\['
|
||||
@@ -111,10 +86,47 @@ function! s:Highlight_Matching_Pair()
|
||||
\ '=~? "string\\|character\\|singlequote\\|comment"'
|
||||
execute 'if' s_skip '| let s_skip = 0 | endif'
|
||||
|
||||
" Limit the search to lines visible in the window.
|
||||
let stoplinebottom = line('w$')
|
||||
let stoplinetop = line('w0')
|
||||
if i % 2 == 0
|
||||
let stopline = stoplinebottom
|
||||
else
|
||||
let stopline = stoplinetop
|
||||
endif
|
||||
|
||||
try
|
||||
" Limit the search time to 500 msec to avoid a hang on very long lines.
|
||||
let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline, 500)
|
||||
" Limit the search time to 300 msec to avoid a hang on very long lines.
|
||||
" This fails when a timeout is not supported.
|
||||
let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline, 300)
|
||||
catch /E118/
|
||||
" Can't use the timeout, restrict the stopline a bit more to avoid taking
|
||||
" a long time on closed folds and long lines.
|
||||
" The "viewable" variables give a range in which we can scroll while
|
||||
" keeping the cursor at the same position.
|
||||
" adjustedScrolloff accounts for very large numbers of scrolloff.
|
||||
let adjustedScrolloff = min([&scrolloff, (line('w$') - line('w0')) / 2])
|
||||
let bottom_viewable = min([line('$'), c_lnum + &lines - adjustedScrolloff - 2])
|
||||
let top_viewable = max([1, c_lnum-&lines+adjustedScrolloff + 2])
|
||||
" one of these stoplines will be adjusted below, but the current values are
|
||||
" minimal boundaries within the current window
|
||||
if i % 2 == 0
|
||||
if has("byte_offset") && has("syntax_items") && &smc > 0
|
||||
let stopbyte = min([line2byte("$"), line2byte(".") + col(".") + &smc * 2])
|
||||
let stopline = min([bottom_viewable, byte2line(stopbyte)])
|
||||
else
|
||||
let stopline = min([bottom_viewable, c_lnum + 100])
|
||||
endif
|
||||
let stoplinebottom = stopline
|
||||
else
|
||||
if has("byte_offset") && has("syntax_items") && &smc > 0
|
||||
let stopbyte = max([1, line2byte(".") + col(".") - &smc * 2])
|
||||
let stopline = max([top_viewable, byte2line(stopbyte)])
|
||||
else
|
||||
let stopline = max([top_viewable, c_lnum - 100])
|
||||
endif
|
||||
let stoplinetop = stopline
|
||||
endif
|
||||
let [m_lnum, m_col] = searchpairpos(c, '', c2, s_flags, s_skip, stopline)
|
||||
endtry
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ gvimext.dll: gvimext.obj \
|
||||
gvimext.obj: gvimext.h
|
||||
|
||||
.cpp.obj:
|
||||
$(cc) $(cflags) -DFEAT_GETTEXT $(cvarsdll) $*.cpp
|
||||
$(cc) $(cflags) -DFEAT_GETTEXT $(cvarsmt) $*.cpp
|
||||
|
||||
gvimext.res: gvimext.rc
|
||||
$(rc) $(rcflags) $(rcvars) gvimext.rc
|
||||
|
||||
+20
-5
@@ -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.
|
||||
@@ -82,9 +82,8 @@ To compile and debug Vim with the VC2003 Toolkit, you will also need
|
||||
|ms-platform-sdk|, |dotnet-1.1-redist|, |dotnet-1.1-sdk|,
|
||||
and |windbg-download|.
|
||||
|
||||
It's easier to download Visual C++ 2005 Express Edition, |msvc-2005-express|.
|
||||
The advantage of the VC 2003 Toolkit is that it will be freely available
|
||||
long after VC 2005 Express Edition stops being free in November 2006.
|
||||
It's easier to download Visual C++ 2008 Express Edition, |msvc-2008-express|,
|
||||
which is freely available in perpetuity.
|
||||
|
||||
The free Code::Blocks IDE works with the VC2003 Toolkit, as described at
|
||||
http://wiki.codeblocks.org/index.php?title=Integrating_Microsoft_Visual_Toolkit_2003_with_Code::Blocks_IDE
|
||||
@@ -140,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:
|
||||
@@ -152,6 +151,22 @@ Instructions for integrating the Platform SDK into VC Express:
|
||||
http://msdn.microsoft.com/vstudio/express/visualc/usingpsdk/default.aspx
|
||||
|
||||
|
||||
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.
|
||||
|
||||
|
||||
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,11 +1,21 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>_cycleWindows:</key>
|
||||
<string></string>
|
||||
<key>_cycleWindowsBackwards:</key>
|
||||
<string></string>
|
||||
<key>addNewTab:</key>
|
||||
<string></string>
|
||||
<key>arrangeInFront:</key>
|
||||
<string></string>
|
||||
<key>clearRecentDocuments:</key>
|
||||
<string></string>
|
||||
<key>copy:</key>
|
||||
<string></string>
|
||||
<key>cut:</key>
|
||||
<string></string>
|
||||
<key>fileOpen:</key>
|
||||
<string></string>
|
||||
<key>findNext:</key>
|
||||
@@ -24,27 +34,43 @@
|
||||
<string></string>
|
||||
<key>newWindow:</key>
|
||||
<string></string>
|
||||
<key>openWebsite:</key>
|
||||
<string></string>
|
||||
<key>orderFrontCharacterPalette:</key>
|
||||
<string></string>
|
||||
<key>orderFrontFontPanel:</key>
|
||||
<string></string>
|
||||
<key>orderFrontPreferencePanel:</key>
|
||||
<string></string>
|
||||
<key>paste:</key>
|
||||
<string></string>
|
||||
<key>performClose:</key>
|
||||
<string></string>
|
||||
<key>performMiniaturize:</key>
|
||||
<string></string>
|
||||
<key>performZoom:</key>
|
||||
<string></string>
|
||||
<key>recentFilesDummy:</key>
|
||||
<string></string>
|
||||
<key>redo:</key>
|
||||
<string></string>
|
||||
<key>selectAll:</key>
|
||||
<string></string>
|
||||
<key>selectNextWindow:</key>
|
||||
<string></string>
|
||||
<key>selectPreviousWindow:</key>
|
||||
<string></string>
|
||||
<key>showVimHelp:</key>
|
||||
<string></string>
|
||||
<key>terminate:</key>
|
||||
<string></string>
|
||||
<key>undo:</key>
|
||||
<string></string>
|
||||
<key>unhide:</key>
|
||||
<string></string>
|
||||
<key>unhideAllApplications:</key>
|
||||
<string></string>
|
||||
<key>zoomAll:</key>
|
||||
<string></string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
+16
-14
@@ -1,32 +1,34 @@
|
||||
{\rtf1\mac\ansicpg10000\cocoartf824\cocoasubrtf440
|
||||
{\fonttbl\f0\fswiss\fcharset77 Helvetica-Bold;\f1\fswiss\fcharset77 Helvetica;\f2\fswiss\fcharset77 Helvetica-Oblique;
|
||||
}
|
||||
{\rtf1\ansi\ansicpg1252\cocoartf949\cocoasubrtf270
|
||||
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\vieww9000\viewh8400\viewkind0
|
||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural
|
||||
|
||||
\f0\b\fs24 \cf0 VIM - Vi IMproved
|
||||
\f1\b0 \
|
||||
\b0 \
|
||||
|
||||
\f2\i Bram Moolenaar et al.
|
||||
\f1\i0 \
|
||||
\i Bram Moolenaar et al.
|
||||
\i0 \
|
||||
\
|
||||
|
||||
\f0\b MacVim GUI\
|
||||
\b MacVim GUI\
|
||||
|
||||
\f2\i\b0 Bj\'9arn Winckler\
|
||||
\i\b0 Bj\'f6rn Winckler\
|
||||
|
||||
\f1\i0 \
|
||||
\i0 \
|
||||
with the help of:\
|
||||
|
||||
\f2\i Nico Weber (full-screen editing, Sparkle support, ...)\
|
||||
George Harker (transparency, ...)\
|
||||
\i Nico Weber\
|
||||
George Harker\
|
||||
Jjgod Jiang\
|
||||
Tim Allen\
|
||||
Chris Willmore\
|
||||
Ben Schmidt\
|
||||
Scott Renfro\
|
||||
Enno L\'fcbbers\
|
||||
|
||||
\f1\i0 \
|
||||
...and many others who have helped by reporting bugs or otherwise.\
|
||||
\i0 \
|
||||
...and many others who have helped by reporting bugs etc.\
|
||||
\
|
||||
\
|
||||
Thank you to {\field{\*\fldinst{HYPERLINK "http://www.positivespinmedia.com"}}{\fldrslt Positive Spin Media}} for the PSMTabBarControl Framework.\
|
||||
@@ -35,7 +37,7 @@ Toolbar icons from {\field{\*\fldinst{HYPERLINK "http://svn.gnome.org/viewvc/gno
|
||||
\
|
||||
Vim icons made by {\field{\*\fldinst{HYPERLINK "http://www.cs.princeton.edu/~mtwebb/vim_icon/vim_icons.html"}}{\fldrslt Matthew Webb}}.\
|
||||
\
|
||||
The default font in MacVim, DejaVu Sans Mono, is based on the Bitstream Vera\'aa and Arev fonts. Bitstream Vera\'aa is \'a9 2003 by Bitstream, Inc. Arev is \'a9 2006 by Tavmjong Bah. The DejaVu changes to these fonts are in the public domain.\
|
||||
The default font in MacVim, DejaVu Sans Mono, is based on the Bitstream Vera\'99 and Arev fonts. Bitstream Vera\'99 is \'a9 2003 by Bitstream, Inc. Arev is \'a9 2006 by Tavmjong Bah. The DejaVu changes to these fonts are in the public domain.\
|
||||
\
|
||||
Thanks to Andy Matuschak for {\field{\*\fldinst{HYPERLINK "http://sparkle.andymatuschak.org/"}}{\fldrslt Sparkle}}.\
|
||||
\
|
||||
|
||||
+20
@@ -15,12 +15,20 @@
|
||||
<string>id</string>
|
||||
<key>newWindow</key>
|
||||
<string>id</string>
|
||||
<key>openWebsite</key>
|
||||
<string>id</string>
|
||||
<key>orderFrontPreferencePanel</key>
|
||||
<string>id</string>
|
||||
<key>selectNextWindow</key>
|
||||
<string>id</string>
|
||||
<key>selectPreviousWindow</key>
|
||||
<string>id</string>
|
||||
<key>showHelp</key>
|
||||
<string>id</string>
|
||||
<key>showVimHelp</key>
|
||||
<string>id</string>
|
||||
<key>zoomAll</key>
|
||||
<string>id</string>
|
||||
</dict>
|
||||
<key>CLASS</key>
|
||||
<string>MMAppController</string>
|
||||
@@ -29,9 +37,21 @@
|
||||
<key>SUPERCLASS</key>
|
||||
<string>NSObject</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CLASS</key>
|
||||
<string>NSMenu</string>
|
||||
<key>LANGUAGE</key>
|
||||
<string>ObjC</string>
|
||||
<key>SUPERCLASS</key>
|
||||
<string>NSObject</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>ACTIONS</key>
|
||||
<dict>
|
||||
<key>_cycleWindows</key>
|
||||
<string>id</string>
|
||||
<key>_cycleWindowsBackwards</key>
|
||||
<string>id</string>
|
||||
<key>addNewTab</key>
|
||||
<string>id</string>
|
||||
</dict>
|
||||
|
||||
+2
-4
@@ -9,11 +9,9 @@
|
||||
<key>IBOldestOS</key>
|
||||
<integer>5</integer>
|
||||
<key>IBOpenObjects</key>
|
||||
<array>
|
||||
<integer>57</integer>
|
||||
</array>
|
||||
<array/>
|
||||
<key>IBSystem Version</key>
|
||||
<string>9B18</string>
|
||||
<string>9D34</string>
|
||||
<key>targetFramework</key>
|
||||
<string>IBCocoaFramework</string>
|
||||
</dict>
|
||||
|
||||
Binary file not shown.
+57
-25
@@ -1,25 +1,57 @@
|
||||
{
|
||||
IBClasses = (
|
||||
{
|
||||
CLASS = DBPrefsWindowController;
|
||||
LANGUAGE = ObjC;
|
||||
SUPERCLASS = NSWindowController;
|
||||
},
|
||||
{CLASS = FirstResponder; LANGUAGE = ObjC; SUPERCLASS = NSObject; },
|
||||
{
|
||||
ACTIONS = {installOdb = id; uninstallOdb = id; };
|
||||
CLASS = MMPreferenceController;
|
||||
LANGUAGE = ObjC;
|
||||
OUTLETS = {
|
||||
editors = NSPopUpButton;
|
||||
generalPreferences = NSView;
|
||||
installOdbButton = NSButton;
|
||||
integrationPreferences = NSView;
|
||||
obdBundleVersionLabel = NSTextField;
|
||||
uninstallOdbButton = NSButton;
|
||||
};
|
||||
SUPERCLASS = DBPrefsWindowController;
|
||||
}
|
||||
);
|
||||
IBVersion = 1;
|
||||
}
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IBClasses</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>ACTIONS</key>
|
||||
<dict>
|
||||
<key>installOdb</key>
|
||||
<string>id</string>
|
||||
<key>uninstallOdb</key>
|
||||
<string>id</string>
|
||||
</dict>
|
||||
<key>CLASS</key>
|
||||
<string>MMPreferenceController</string>
|
||||
<key>LANGUAGE</key>
|
||||
<string>ObjC</string>
|
||||
<key>OUTLETS</key>
|
||||
<dict>
|
||||
<key>editors</key>
|
||||
<string>NSPopUpButton</string>
|
||||
<key>generalPreferences</key>
|
||||
<string>NSView</string>
|
||||
<key>installOdbButton</key>
|
||||
<string>NSButton</string>
|
||||
<key>integrationPreferences</key>
|
||||
<string>NSView</string>
|
||||
<key>obdBundleVersionLabel</key>
|
||||
<string>NSTextField</string>
|
||||
<key>uninstallOdbButton</key>
|
||||
<string>NSButton</string>
|
||||
</dict>
|
||||
<key>SUPERCLASS</key>
|
||||
<string>DBPrefsWindowController</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CLASS</key>
|
||||
<string>FirstResponder</string>
|
||||
<key>LANGUAGE</key>
|
||||
<string>ObjC</string>
|
||||
<key>SUPERCLASS</key>
|
||||
<string>NSObject</string>
|
||||
</dict>
|
||||
<dict>
|
||||
<key>CLASS</key>
|
||||
<string>DBPrefsWindowController</string>
|
||||
<key>LANGUAGE</key>
|
||||
<string>ObjC</string>
|
||||
<key>SUPERCLASS</key>
|
||||
<string>NSWindowController</string>
|
||||
</dict>
|
||||
</array>
|
||||
<key>IBVersion</key>
|
||||
<string>1</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
+4
-10
@@ -1,16 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
<plist version="1.0">
|
||||
<dict>
|
||||
<key>IBDocumentLocation</key>
|
||||
<string>69 14 356 240 0 0 1024 746 </string>
|
||||
<key>IBEditorPositions</key>
|
||||
<dict>
|
||||
<key>191</key>
|
||||
<string>260 290 503 416 0 0 1024 746 </string>
|
||||
</dict>
|
||||
<key>IBFramework Version</key>
|
||||
<string>489.0</string>
|
||||
<string>629</string>
|
||||
<key>IBLastKnownRelativeProjectPath</key>
|
||||
<string>../../MacVim.xcodeproj</string>
|
||||
<key>IBOldestOS</key>
|
||||
@@ -18,9 +11,10 @@
|
||||
<key>IBOpenObjects</key>
|
||||
<array>
|
||||
<integer>191</integer>
|
||||
<integer>115</integer>
|
||||
</array>
|
||||
<key>IBSystem Version</key>
|
||||
<string>8S165</string>
|
||||
<string>9C31</string>
|
||||
<key>targetFramework</key>
|
||||
<string>IBCocoaFramework</string>
|
||||
</dict>
|
||||
|
||||
Binary file not shown.
+30
-1
@@ -4,6 +4,35 @@
|
||||
<dict>
|
||||
<key>CFBundleDevelopmentRegion</key>
|
||||
<string>English</string>
|
||||
<!--
|
||||
Both UTExportedTypeDeclarations (for Spotlight and QuickLook) and
|
||||
CFBundleDocumentTypes seem to be required, even though they contain
|
||||
more or less the same information:
|
||||
http://lists.apple.com/archives/Spotlight-dev/2007/Jul/msg00019.html
|
||||
-->
|
||||
<key>UTExportedTypeDeclarations</key>
|
||||
<array>
|
||||
<dict>
|
||||
<key>UTTypeConformsTo</key>
|
||||
<array>
|
||||
<string>public.text</string>
|
||||
<string>public.plain-text</string>
|
||||
</array>
|
||||
<key>UTTypeDescription</key>
|
||||
<string>vim script file</string>
|
||||
<key>UTTypeIdentifier</key>
|
||||
<string>org.vim.vim</string>
|
||||
<key>UTTypeTagSpecification</key>
|
||||
<dict>
|
||||
<key>com.apple.ostype</key>
|
||||
<string>TEXT</string>
|
||||
<key>public.filename-extension</key>
|
||||
<array>
|
||||
<string>vim</string>
|
||||
</array>
|
||||
</dict>
|
||||
</dict>
|
||||
</array>
|
||||
<key>CFBundleDocumentTypes</key>
|
||||
<array>
|
||||
<dict>
|
||||
@@ -545,7 +574,7 @@
|
||||
<key>CFBundleSignature</key>
|
||||
<string>VIMM</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>23</string>
|
||||
<string>32</string>
|
||||
<key>NSMainNibFile</key>
|
||||
<string>MainMenu</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
|
||||
@@ -16,20 +16,29 @@
|
||||
|
||||
|
||||
@interface MMAppController : NSObject <MMAppProtocol> {
|
||||
NSConnection *connection;
|
||||
NSMutableArray *vimControllers;
|
||||
NSString *openSelectionString;
|
||||
ATSFontContainerRef fontContainerRef;
|
||||
NSMutableDictionary *pidArguments;
|
||||
NSMenu *defaultMainMenu;
|
||||
NSMenuItem *appMenuItemTemplate;
|
||||
NSMenuItem *recentFilesMenuItem;
|
||||
}
|
||||
|
||||
+ (MMAppController *)sharedInstance;
|
||||
- (NSMenu *)defaultMainMenu;
|
||||
- (NSMenuItem *)appMenuItemTemplate;
|
||||
- (void)removeVimController:(id)controller;
|
||||
- (void)windowControllerWillOpen:(MMWindowController *)windowController;
|
||||
- (void)setMainMenu:(NSMenu *)mainMenu;
|
||||
- (IBAction)newWindow:(id)sender;
|
||||
- (IBAction)fileOpen:(id)sender;
|
||||
- (IBAction)selectNextWindow:(id)sender;
|
||||
- (IBAction)selectPreviousWindow:(id)sender;
|
||||
- (IBAction)fontSizeUp:(id)sender;
|
||||
- (IBAction)fontSizeDown:(id)sender;
|
||||
- (IBAction)orderFrontPreferencePanel:(id)sender;
|
||||
- (IBAction)openWebsite:(id)sender;
|
||||
- (IBAction)showVimHelp:(id)sender;
|
||||
- (IBAction)zoomAll:(id)sender;
|
||||
|
||||
@end
|
||||
|
||||
+352
-101
@@ -13,7 +13,7 @@
|
||||
* MMAppController is the delegate of NSApp and as such handles file open
|
||||
* requests, application termination, etc. It sets up a named NSConnection on
|
||||
* which it listens to incoming connections from Vim processes. It also
|
||||
* coordinates all MMVimControllers.
|
||||
* coordinates all MMVimControllers and takes care of the main menu.
|
||||
*
|
||||
* A new Vim process is started by calling launchVimProcessWithArguments:.
|
||||
* When the Vim process is initialized it notifies the app controller by
|
||||
@@ -24,6 +24,17 @@
|
||||
* A Vim process started from the command line connects directly by sending the
|
||||
* connectBackend:pid: message (launchVimProcessWithArguments: is never called
|
||||
* in this case).
|
||||
*
|
||||
* The main menu is handled as follows. Each Vim controller keeps its own main
|
||||
* menu. All menus except the "MacVim" menu are controlled by the Vim process.
|
||||
* The app controller also keeps a reference to the "default main menu" which
|
||||
* is set up in MainMenu.nib. When no editor window is open the default main
|
||||
* menu is used. When a new editor window becomes main its main menu becomes
|
||||
* the new main menu, this is done in -[MMAppController setMainMenu:].
|
||||
* NOTE: Certain heuristics are used to find the "MacVim", "Windows", "File",
|
||||
* and "Services" menu. If MainMenu.nib changes these heuristics may have to
|
||||
* change as well. For specifics see the find... methods defined in the NSMenu
|
||||
* category "MMExtras".
|
||||
*/
|
||||
|
||||
#import "MMAppController.h"
|
||||
@@ -41,6 +52,12 @@
|
||||
static NSTimeInterval MMRequestTimeout = 5;
|
||||
static NSTimeInterval MMReplyTimeout = 5;
|
||||
|
||||
static NSString *MMWebsiteString = @"http://code.google.com/p/macvim/";
|
||||
|
||||
// When terminating, notify Vim processes then sleep for these many
|
||||
// microseconds.
|
||||
static useconds_t MMTerminationSleepPeriod = 10000;
|
||||
|
||||
|
||||
#pragma options align=mac68k
|
||||
typedef struct
|
||||
@@ -84,15 +101,24 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
- (void)passArguments:(NSDictionary *)args toVimController:(MMVimController*)vc;
|
||||
@end
|
||||
|
||||
@interface NSMenu (MMExtras)
|
||||
- (void)recurseSetAutoenablesItems:(BOOL)on;
|
||||
@end
|
||||
|
||||
@interface NSNumber (MMExtras)
|
||||
- (int)tag;
|
||||
@end
|
||||
|
||||
|
||||
@interface NSMenu (MMExtras)
|
||||
- (int)indexOfItemWithAction:(SEL)action;
|
||||
- (NSMenuItem *)itemWithAction:(SEL)action;
|
||||
- (NSMenu *)findMenuContainingItemWithAction:(SEL)action;
|
||||
- (NSMenu *)findWindowsMenu;
|
||||
- (NSMenu *)findApplicationMenu;
|
||||
- (NSMenu *)findServicesMenu;
|
||||
- (NSMenu *)findFileMenu;
|
||||
@end
|
||||
|
||||
|
||||
|
||||
|
||||
@implementation MMAppController
|
||||
|
||||
@@ -122,6 +148,7 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
[NSNumber numberWithBool:NO], MMZoomBothKey,
|
||||
@"", MMLoginShellCommandKey,
|
||||
@"", MMLoginShellArgumentKey,
|
||||
[NSNumber numberWithBool:YES], MMDialogsTrackPwdKey,
|
||||
nil];
|
||||
|
||||
[[NSUserDefaults standardUserDefaults] registerDefaults:dict];
|
||||
@@ -138,24 +165,30 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
vimControllers = [NSMutableArray new];
|
||||
pidArguments = [NSMutableDictionary new];
|
||||
|
||||
// NOTE: Do not use the default connection since the Logitech Control
|
||||
// Center (LCC) input manager steals and this would cause MacVim to
|
||||
// never open any windows. (This is a bug in LCC but since they are
|
||||
// unlikely to fix it, we graciously give them the default connection.)
|
||||
connection = [[NSConnection alloc] initWithReceivePort:[NSPort port]
|
||||
sendPort:nil];
|
||||
[connection setRootObject:self];
|
||||
[connection setRequestTimeout:MMRequestTimeout];
|
||||
[connection setReplyTimeout:MMReplyTimeout];
|
||||
|
||||
// NOTE: When the user is resizing the window the AppKit puts the run
|
||||
// loop in event tracking mode. Unless the connection listens to
|
||||
// request in this mode, live resizing won't work.
|
||||
[connection addRequestMode:NSEventTrackingRunLoopMode];
|
||||
|
||||
// NOTE! If the name of the connection changes here it must also be
|
||||
// updated in MMBackend.m.
|
||||
NSConnection *connection = [NSConnection defaultConnection];
|
||||
NSString *name = [NSString stringWithFormat:@"%@-connection",
|
||||
[[NSBundle mainBundle] bundleIdentifier]];
|
||||
//NSLog(@"Registering connection with name '%@'", name);
|
||||
if ([connection registerName:name]) {
|
||||
[connection setRequestTimeout:MMRequestTimeout];
|
||||
[connection setReplyTimeout:MMReplyTimeout];
|
||||
[connection setRootObject:self];
|
||||
|
||||
// NOTE: When the user is resizing the window the AppKit puts the
|
||||
// run loop in event tracking mode. Unless the connection listens
|
||||
// to request in this mode, live resizing won't work.
|
||||
[connection addRequestMode:NSEventTrackingRunLoopMode];
|
||||
} else {
|
||||
NSLog(@"WARNING: Failed to register connection with name '%@'",
|
||||
if (![connection registerName:name]) {
|
||||
NSLog(@"FATAL ERROR: Failed to register connection with name '%@'",
|
||||
name);
|
||||
[connection release]; connection = nil;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -166,23 +199,65 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
{
|
||||
//NSLog(@"MMAppController dealloc");
|
||||
|
||||
[connection release]; connection = nil;
|
||||
[pidArguments release]; pidArguments = nil;
|
||||
[vimControllers release]; vimControllers = nil;
|
||||
[openSelectionString release]; openSelectionString = nil;
|
||||
[recentFilesMenuItem release]; recentFilesMenuItem = nil;
|
||||
[defaultMainMenu release]; defaultMainMenu = nil;
|
||||
[appMenuItemTemplate release]; appMenuItemTemplate = nil;
|
||||
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
#if MM_HANDLE_XCODE_MOD_EVENT
|
||||
- (void)applicationWillFinishLaunching:(NSNotification *)notification
|
||||
{
|
||||
// Remember the default menu so that it can be restored if the user closes
|
||||
// all editor windows.
|
||||
defaultMainMenu = [[NSApp mainMenu] retain];
|
||||
|
||||
// Store a copy of the default app menu so we can use this as a template
|
||||
// for all other menus. We make a copy here because the "Services" menu
|
||||
// will not yet have been populated at this time. If we don't we get
|
||||
// problems trying to set key equivalents later on because they might clash
|
||||
// with items on the "Services" menu.
|
||||
appMenuItemTemplate = [defaultMainMenu itemAtIndex:0];
|
||||
appMenuItemTemplate = [appMenuItemTemplate copy];
|
||||
|
||||
// Set up the "Open Recent" menu. See
|
||||
// http://lapcatsoftware.com/blog/2007/07/10/
|
||||
// working-without-a-nib-part-5-open-recent-menu/
|
||||
// and
|
||||
// http://www.cocoabuilder.com/archive/message/cocoa/2007/8/15/187793
|
||||
// for more information.
|
||||
//
|
||||
// The menu itself is created in MainMenu.nib but we still seem to have to
|
||||
// hack around a bit to get it to work. (This has to be done in
|
||||
// applicationWillFinishLaunching at the latest, otherwise it doesn't
|
||||
// work.)
|
||||
NSMenu *fileMenu = [defaultMainMenu findFileMenu];
|
||||
if (fileMenu) {
|
||||
int idx = [fileMenu indexOfItemWithAction:@selector(fileOpen:)];
|
||||
if (idx >= 0 && idx+1 < [fileMenu numberOfItems])
|
||||
|
||||
recentFilesMenuItem = [fileMenu itemWithTitle:@"Open Recent"];
|
||||
[[recentFilesMenuItem submenu] performSelector:@selector(_setMenuName:)
|
||||
withObject:@"NSRecentDocumentsMenu"];
|
||||
|
||||
// Note: The "Recent Files" menu must be moved around since there is no
|
||||
// -[NSApp setRecentFilesMenu:] method. We keep a reference to it to
|
||||
// facilitate this move (see setMainMenu: below).
|
||||
[recentFilesMenuItem retain];
|
||||
}
|
||||
|
||||
#if MM_HANDLE_XCODE_MOD_EVENT
|
||||
[[NSAppleEventManager sharedAppleEventManager]
|
||||
setEventHandler:self
|
||||
andSelector:@selector(handleXcodeModEvent:replyEvent:)
|
||||
forEventClass:'KAHL'
|
||||
andEventID:'MOD '];
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
- (void)applicationDidFinishLaunching:(NSNotification *)notification
|
||||
{
|
||||
@@ -259,6 +334,16 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
[arguments setObject:filenames forKey:@"filenames"];
|
||||
[arguments setObject:[NSNumber numberWithBool:YES] forKey:@"openFiles"];
|
||||
|
||||
// Add file names to "Recent Files" menu.
|
||||
int i, count = [filenames count];
|
||||
for (i = 0; i < count; ++i) {
|
||||
// Don't add files that are being edited remotely (using ODB).
|
||||
if ([arguments objectForKey:@"remoteID"]) continue;
|
||||
|
||||
[[NSDocumentController sharedDocumentController]
|
||||
noteNewRecentFilePath:[filenames objectAtIndex:i]];
|
||||
}
|
||||
|
||||
if ((openInTabs && (vc = [self topmostVimController]))
|
||||
|| (vc = [self findUntitledWindow])) {
|
||||
// Open files in an already open window.
|
||||
@@ -338,11 +423,16 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
if (modifiedBuffers) {
|
||||
NSAlert *alert = [[NSAlert alloc] init];
|
||||
[alert setAlertStyle:NSWarningAlertStyle];
|
||||
[alert addButtonWithTitle:@"Quit"];
|
||||
[alert addButtonWithTitle:@"Cancel"];
|
||||
[alert setMessageText:@"Quit without saving?"];
|
||||
[alert setInformativeText:@"There are modified buffers, "
|
||||
"if you quit now all changes will be lost. Quit anyway?"];
|
||||
[alert addButtonWithTitle:NSLocalizedString(@"Quit",
|
||||
@"Dialog button")];
|
||||
[alert addButtonWithTitle:NSLocalizedString(@"Cancel",
|
||||
@"Dialog button")];
|
||||
[alert setMessageText:NSLocalizedString(@"Quit without saving?",
|
||||
@"Quit dialog with changed buffers, title")];
|
||||
[alert setInformativeText:NSLocalizedString(
|
||||
@"There are modified buffers, "
|
||||
"if you quit now all changes will be lost. Quit anyway?",
|
||||
@"Quit dialog with changed buffers, text")];
|
||||
|
||||
if ([alert runModal] != NSAlertFirstButtonReturn)
|
||||
reply = NSTerminateCancel;
|
||||
@@ -369,24 +459,35 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
if (numWindows > 1 || numTabs > 1) {
|
||||
NSAlert *alert = [[NSAlert alloc] init];
|
||||
[alert setAlertStyle:NSWarningAlertStyle];
|
||||
[alert addButtonWithTitle:@"Quit"];
|
||||
[alert addButtonWithTitle:@"Cancel"];
|
||||
[alert setMessageText:@"Are you sure you want to quit MacVim?"];
|
||||
[alert addButtonWithTitle:NSLocalizedString(@"Quit",
|
||||
@"Dialog button")];
|
||||
[alert addButtonWithTitle:NSLocalizedString(@"Cancel",
|
||||
@"Dialog button")];
|
||||
[alert setMessageText:NSLocalizedString(
|
||||
@"Are you sure you want to quit MacVim?",
|
||||
@"Quit dialog with no changed buffers, title")];
|
||||
|
||||
NSString *info = nil;
|
||||
if (numWindows > 1) {
|
||||
if (numTabs > numWindows)
|
||||
info = [NSString stringWithFormat:@"There are %d windows "
|
||||
"open in MacVim, with a total of %d tabs. Do you want "
|
||||
"to quit anyway?", numWindows, numTabs];
|
||||
info = [NSString stringWithFormat:NSLocalizedString(
|
||||
@"There are %d windows open in MacVim, with a "
|
||||
"total of %d tabs. Do you want to quit anyway?",
|
||||
@"Quit dialog with no changed buffers, text"),
|
||||
numWindows, numTabs];
|
||||
else
|
||||
info = [NSString stringWithFormat:@"There are %d windows "
|
||||
"open in MacVim. Do you want to quit anyway?",
|
||||
info = [NSString stringWithFormat:NSLocalizedString(
|
||||
@"There are %d windows open in MacVim. "
|
||||
"Do you want to quit anyway?",
|
||||
@"Quit dialog with no changed buffers, text"),
|
||||
numWindows];
|
||||
|
||||
} else {
|
||||
info = [NSString stringWithFormat:@"There are %d tabs open "
|
||||
"in MacVim. Do you want to quit anyway?", numTabs];
|
||||
info = [NSString stringWithFormat:NSLocalizedString(
|
||||
@"There are %d tabs open in MacVim. "
|
||||
"Do you want to quit anyway?",
|
||||
@"Quit dialog with no changed buffers, text"),
|
||||
numTabs];
|
||||
}
|
||||
|
||||
[alert setInformativeText:info];
|
||||
@@ -406,6 +507,11 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
id vc;
|
||||
while ((vc = [e nextObject]))
|
||||
[vc sendMessage:TerminateNowMsgID data:nil];
|
||||
|
||||
// Give Vim processes a chance to terminate before MacVim. If they
|
||||
// haven't terminated by the time applicationWillTerminate: is sent,
|
||||
// they may be forced to quit (see below).
|
||||
usleep(MMTerminationSleepPeriod);
|
||||
}
|
||||
|
||||
return reply;
|
||||
@@ -419,9 +525,9 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
andEventID:'MOD '];
|
||||
#endif
|
||||
|
||||
// This will invalidate all connections (since they were spawned from the
|
||||
// default connection).
|
||||
[[NSConnection defaultConnection] invalidate];
|
||||
// This will invalidate all connections (since they were spawned from this
|
||||
// connection).
|
||||
[connection invalidate];
|
||||
|
||||
// Send a SIGINT to all running Vim processes, so that they are sure to
|
||||
// receive the connectionDidDie: notification (a process has to be checking
|
||||
@@ -442,40 +548,52 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
[NSApp setDelegate:nil];
|
||||
}
|
||||
|
||||
+ (MMAppController *)sharedInstance
|
||||
{
|
||||
// Note: The app controller is a singleton which is instantiated in
|
||||
// MainMenu.nib where it is also connected as the delegate of NSApp.
|
||||
id delegate = [NSApp delegate];
|
||||
return [delegate isKindOfClass:self] ? (MMAppController*)delegate : nil;
|
||||
}
|
||||
|
||||
- (NSMenu *)defaultMainMenu
|
||||
{
|
||||
return defaultMainMenu;
|
||||
}
|
||||
|
||||
- (NSMenuItem *)appMenuItemTemplate
|
||||
{
|
||||
return appMenuItemTemplate;
|
||||
}
|
||||
|
||||
- (void)removeVimController:(id)controller
|
||||
{
|
||||
//NSLog(@"%s%@", _cmd, controller);
|
||||
|
||||
[controller cleanup];
|
||||
[[controller windowController] close];
|
||||
|
||||
[vimControllers removeObject:controller];
|
||||
|
||||
if (![vimControllers count]) {
|
||||
// Turn on autoenabling of menus (because no Vim is open to handle it),
|
||||
// but do not touch the MacVim menu. Note that the menus must be
|
||||
// enabled first otherwise autoenabling does not work.
|
||||
NSMenu *mainMenu = [NSApp mainMenu];
|
||||
int i, count = [mainMenu numberOfItems];
|
||||
for (i = 1; i < count; ++i) {
|
||||
NSMenuItem *item = [mainMenu itemAtIndex:i];
|
||||
[item setEnabled:YES];
|
||||
[[item submenu] recurseSetAutoenablesItems:YES];
|
||||
}
|
||||
// The last editor window just closed so restore the main menu back to
|
||||
// its default state (which is defined in MainMenu.nib).
|
||||
[self setMainMenu:defaultMainMenu];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)windowControllerWillOpen:(MMWindowController *)windowController
|
||||
{
|
||||
NSPoint topLeft = NSZeroPoint;
|
||||
NSWindow *keyWin = [NSApp keyWindow];
|
||||
NSWindow *topWin = [[[self topmostVimController] windowController] window];
|
||||
NSWindow *win = [windowController window];
|
||||
|
||||
if (!win) return;
|
||||
|
||||
// If there is a key window, cascade from it, otherwise use the autosaved
|
||||
// window position (if any).
|
||||
if (keyWin) {
|
||||
NSRect frame = [keyWin frame];
|
||||
// If there is a window belonging to a Vim process, cascade from it,
|
||||
// otherwise use the autosaved window position (if any).
|
||||
if (topWin) {
|
||||
NSRect frame = [topWin frame];
|
||||
topLeft = NSMakePoint(frame.origin.x, NSMaxY(frame));
|
||||
} else {
|
||||
NSString *topLeftString = [[NSUserDefaults standardUserDefaults]
|
||||
@@ -485,7 +603,7 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
}
|
||||
|
||||
if (!NSEqualPoints(topLeft, NSZeroPoint)) {
|
||||
if (keyWin)
|
||||
if (topWin)
|
||||
topLeft = [win cascadeTopLeftFromPoint:topLeft];
|
||||
|
||||
[win setFrameTopLeftPoint:topLeft];
|
||||
@@ -503,6 +621,69 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)setMainMenu:(NSMenu *)mainMenu
|
||||
{
|
||||
if ([NSApp mainMenu] == mainMenu) return;
|
||||
|
||||
// If the new menu has a "Recent Files" dummy item, then swap the real item
|
||||
// for the dummy. We are forced to do this since Cocoa initializes the
|
||||
// "Recent Files" menu and there is no way to simply point Cocoa to a new
|
||||
// item each time the menus are swapped.
|
||||
NSMenu *fileMenu = [mainMenu findFileMenu];
|
||||
if (recentFilesMenuItem && fileMenu) {
|
||||
int dummyIdx =
|
||||
[fileMenu indexOfItemWithAction:@selector(recentFilesDummy:)];
|
||||
if (dummyIdx >= 0) {
|
||||
NSMenuItem *dummyItem = [[fileMenu itemAtIndex:dummyIdx] retain];
|
||||
[fileMenu removeItemAtIndex:dummyIdx];
|
||||
|
||||
NSMenu *recentFilesParentMenu = [recentFilesMenuItem menu];
|
||||
int idx = [recentFilesParentMenu indexOfItem:recentFilesMenuItem];
|
||||
if (idx >= 0) {
|
||||
[[recentFilesMenuItem retain] autorelease];
|
||||
[recentFilesParentMenu removeItemAtIndex:idx];
|
||||
[recentFilesParentMenu insertItem:dummyItem atIndex:idx];
|
||||
}
|
||||
|
||||
[fileMenu insertItem:recentFilesMenuItem atIndex:dummyIdx];
|
||||
[dummyItem release];
|
||||
}
|
||||
}
|
||||
|
||||
// Now set the new menu. Notice that we keep one menu for each editor
|
||||
// window since each editor can have its own set of menus. When swapping
|
||||
// menus we have to tell Cocoa where the new "MacVim", "Windows", and
|
||||
// "Services" menu are.
|
||||
[NSApp setMainMenu:mainMenu];
|
||||
|
||||
// Setting the "MacVim" (or "Application") menu ensures that it is typeset
|
||||
// in boldface. (The setAppleMenu: method used to be public but is now
|
||||
// private so this will have to be considered a bit of a hack!)
|
||||
NSMenu *appMenu = [mainMenu findApplicationMenu];
|
||||
[NSApp performSelector:@selector(setAppleMenu:) withObject:appMenu];
|
||||
|
||||
NSMenu *servicesMenu = [mainMenu findServicesMenu];
|
||||
[NSApp setServicesMenu:servicesMenu];
|
||||
|
||||
NSMenu *windowsMenu = [mainMenu findWindowsMenu];
|
||||
if (windowsMenu) {
|
||||
// Cocoa isn't clever enough to get rid of items it has added to the
|
||||
// "Windows" menu so we have to do it ourselves otherwise there will be
|
||||
// multiple menu items for each window in the "Windows" menu.
|
||||
// This code assumes that the only items Cocoa add are ones which
|
||||
// send off the action makeKeyAndOrderFront:. (Cocoa will not add
|
||||
// another separator item if the last item on the "Windows" menu
|
||||
// already is a separator, so we needen't worry about separators.)
|
||||
int i, count = [windowsMenu numberOfItems];
|
||||
for (i = count-1; i >= 0; --i) {
|
||||
NSMenuItem *item = [windowsMenu itemAtIndex:i];
|
||||
if ([item action] == @selector(makeKeyAndOrderFront:))
|
||||
[windowsMenu removeItem:item];
|
||||
}
|
||||
}
|
||||
[NSApp setWindowsMenu:windowsMenu];
|
||||
}
|
||||
|
||||
- (IBAction)newWindow:(id)sender
|
||||
{
|
||||
[self launchVimProcessWithArguments:nil];
|
||||
@@ -510,10 +691,17 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
|
||||
- (IBAction)fileOpen:(id)sender
|
||||
{
|
||||
NSString *dir = nil;
|
||||
BOOL trackPwd = [[NSUserDefaults standardUserDefaults]
|
||||
boolForKey:MMDialogsTrackPwdKey];
|
||||
if (trackPwd) {
|
||||
MMVimController *vc = [self keyVimController];
|
||||
if (vc) dir = [[vc vimState] objectForKey:@"pwd"];
|
||||
}
|
||||
|
||||
NSOpenPanel *panel = [NSOpenPanel openPanel];
|
||||
[panel setAllowsMultipleSelection:YES];
|
||||
|
||||
int result = [panel runModalForTypes:nil];
|
||||
int result = [panel runModalForDirectory:dir file:nil types:nil];
|
||||
if (NSOKButton == result)
|
||||
[self application:NSApp openFiles:[panel filenames]];
|
||||
}
|
||||
@@ -561,23 +749,29 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
}
|
||||
}
|
||||
|
||||
- (IBAction)fontSizeUp:(id)sender
|
||||
{
|
||||
[[NSFontManager sharedFontManager] modifyFont:
|
||||
[NSNumber numberWithInt:NSSizeUpFontAction]];
|
||||
}
|
||||
|
||||
- (IBAction)fontSizeDown:(id)sender
|
||||
{
|
||||
[[NSFontManager sharedFontManager] modifyFont:
|
||||
[NSNumber numberWithInt:NSSizeDownFontAction]];
|
||||
}
|
||||
|
||||
- (IBAction)orderFrontPreferencePanel:(id)sender
|
||||
{
|
||||
[[MMPreferenceController sharedPrefsWindowController] showWindow:self];
|
||||
}
|
||||
|
||||
- (IBAction)openWebsite:(id)sender
|
||||
{
|
||||
[[NSWorkspace sharedWorkspace] openURL:
|
||||
[NSURL URLWithString:MMWebsiteString]];
|
||||
}
|
||||
|
||||
- (IBAction)showVimHelp:(id)sender
|
||||
{
|
||||
// Open a new window with the help window maximized.
|
||||
[self launchVimProcessWithArguments:[NSArray arrayWithObjects:
|
||||
@"-c", @":h gui_mac", @"-c", @":res", nil]];
|
||||
}
|
||||
|
||||
- (IBAction)zoomAll:(id)sender
|
||||
{
|
||||
[NSApp makeWindowsPerform:@selector(performZoom:) inOrder:YES];
|
||||
}
|
||||
|
||||
- (byref id <MMFrontendProtocol>)
|
||||
connectBackend:(byref in id <MMBackendProtocol>)backend
|
||||
pid:(int)pid
|
||||
@@ -591,7 +785,8 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
setProtocolForProxy:@protocol(MMBackendProtocol)];
|
||||
|
||||
vc = [[[MMVimController alloc]
|
||||
initWithBackend:backend pid:pid] autorelease];
|
||||
initWithBackend:backend pid:pid]
|
||||
autorelease];
|
||||
|
||||
if (![vimControllers count]) {
|
||||
// The first window autosaves its position. (The autosaving
|
||||
@@ -733,9 +928,10 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
|
||||
- (MMVimController *)topmostVimController
|
||||
{
|
||||
NSArray *windows = [NSApp orderedWindows];
|
||||
if ([windows count] > 0) {
|
||||
NSWindow *window = [windows objectAtIndex:0];
|
||||
// Find the topmost visible window which has an associated vim controller.
|
||||
NSEnumerator *e = [[NSApp orderedWindows] objectEnumerator];
|
||||
id window;
|
||||
while ((window = [e nextObject]) && [window isVisible]) {
|
||||
unsigned i, count = [vimControllers count];
|
||||
for (i = 0; i < count; ++i) {
|
||||
MMVimController *vc = [vimControllers objectAtIndex:i];
|
||||
@@ -810,18 +1006,23 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
|
||||
if (firstMissingFile) {
|
||||
NSAlert *alert = [[NSAlert alloc] init];
|
||||
[alert addButtonWithTitle:@"OK"];
|
||||
[alert addButtonWithTitle:NSLocalizedString(@"OK",
|
||||
@"Dialog button")];
|
||||
|
||||
NSString *text;
|
||||
if ([files count] >= count-1) {
|
||||
[alert setMessageText:@"File not found"];
|
||||
text = [NSString stringWithFormat:@"Could not open file with "
|
||||
"name %@.", firstMissingFile];
|
||||
[alert setMessageText:NSLocalizedString(@"File not found",
|
||||
@"File not found dialog, title")];
|
||||
text = [NSString stringWithFormat:NSLocalizedString(
|
||||
@"Could not open file with name %@.",
|
||||
@"File not found dialog, text"), firstMissingFile];
|
||||
} else {
|
||||
[alert setMessageText:@"Multiple files not found"];
|
||||
text = [NSString stringWithFormat:@"Could not open file with "
|
||||
"name %@, and %d other files.", firstMissingFile,
|
||||
count-[files count]-1];
|
||||
[alert setMessageText:NSLocalizedString(@"Multiple files not found",
|
||||
@"File not found dialog, title")];
|
||||
text = [NSString stringWithFormat:NSLocalizedString(
|
||||
@"Could not open file with name %@, and %d other files.",
|
||||
@"File not found dialog, text"),
|
||||
firstMissingFile, count-[files count]-1];
|
||||
}
|
||||
|
||||
[alert setInformativeText:text];
|
||||
@@ -953,6 +1154,8 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
// TODO: This is a moronic test...should query the Vim process if there
|
||||
// are any open buffers or something like that instead.
|
||||
NSString *title = [[[vc windowController] window] title];
|
||||
|
||||
// TODO: this will not work in a localized MacVim
|
||||
if ([title hasPrefix:@"[No Name] - VIM"]) {
|
||||
//NSLog(@"found untitled window");
|
||||
return vc;
|
||||
@@ -1059,28 +1262,6 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
|
||||
|
||||
|
||||
@implementation NSMenu (MMExtras)
|
||||
|
||||
- (void)recurseSetAutoenablesItems:(BOOL)on
|
||||
{
|
||||
[self setAutoenablesItems:on];
|
||||
|
||||
int i, count = [self numberOfItems];
|
||||
for (i = 0; i < count; ++i) {
|
||||
NSMenuItem *item = [self itemAtIndex:i];
|
||||
[item setEnabled:YES];
|
||||
NSMenu *submenu = [item submenu];
|
||||
if (submenu) {
|
||||
[submenu recurseSetAutoenablesItems:on];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@end // NSMenu (MMExtras)
|
||||
|
||||
|
||||
|
||||
|
||||
@implementation NSNumber (MMExtras)
|
||||
- (int)tag
|
||||
{
|
||||
@@ -1091,6 +1272,77 @@ static int executeInLoginShell(NSString *path, NSArray *args);
|
||||
|
||||
|
||||
|
||||
@implementation NSMenu (MMExtras)
|
||||
|
||||
- (int)indexOfItemWithAction:(SEL)action
|
||||
{
|
||||
int i, count = [self numberOfItems];
|
||||
for (i = 0; i < count; ++i) {
|
||||
NSMenuItem *item = [self itemAtIndex:i];
|
||||
if ([item action] == action)
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
- (NSMenuItem *)itemWithAction:(SEL)action
|
||||
{
|
||||
int idx = [self indexOfItemWithAction:action];
|
||||
return idx >= 0 ? [self itemAtIndex:idx] : nil;
|
||||
}
|
||||
|
||||
- (NSMenu *)findMenuContainingItemWithAction:(SEL)action
|
||||
{
|
||||
// NOTE: We only look for the action in the submenus of 'self'
|
||||
int i, count = [self numberOfItems];
|
||||
for (i = 0; i < count; ++i) {
|
||||
NSMenu *menu = [[self itemAtIndex:i] submenu];
|
||||
NSMenuItem *item = [menu itemWithAction:action];
|
||||
if (item) return menu;
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (NSMenu *)findWindowsMenu
|
||||
{
|
||||
return [self findMenuContainingItemWithAction:
|
||||
@selector(performMiniaturize:)];
|
||||
}
|
||||
|
||||
- (NSMenu *)findApplicationMenu
|
||||
{
|
||||
// TODO: Just return [self itemAtIndex:0]?
|
||||
return [self findMenuContainingItemWithAction:@selector(terminate:)];
|
||||
}
|
||||
|
||||
- (NSMenu *)findServicesMenu
|
||||
{
|
||||
// NOTE! Our heuristic for finding the "Services" menu is to look for the
|
||||
// second item before the "Hide MacVim" menu item on the "MacVim" menu.
|
||||
// (The item before "Hide MacVim" should be a separator, but this is not
|
||||
// important as long as the item before that is the "Services" menu.)
|
||||
|
||||
NSMenu *appMenu = [self findApplicationMenu];
|
||||
if (!appMenu) return nil;
|
||||
|
||||
int idx = [appMenu indexOfItemWithAction: @selector(hide:)];
|
||||
if (idx-2 < 0) return nil; // idx == -1, if selector not found
|
||||
|
||||
return [[appMenu itemAtIndex:idx-2] submenu];
|
||||
}
|
||||
|
||||
- (NSMenu *)findFileMenu
|
||||
{
|
||||
return [self findMenuContainingItemWithAction:@selector(performClose:)];
|
||||
}
|
||||
|
||||
@end // NSMenu (MMExtras)
|
||||
|
||||
|
||||
|
||||
|
||||
static int
|
||||
executeInLoginShell(NSString *path, NSArray *args)
|
||||
{
|
||||
@@ -1184,4 +1436,3 @@ executeInLoginShell(NSString *path, NSArray *args)
|
||||
|
||||
return pid;
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ enum { MMMaxCellsPerChar = 2 };
|
||||
NSImage *contentImage;
|
||||
NSSize imageSize;
|
||||
ATSUStyle atsuStyles[MMMaxCellsPerChar];
|
||||
BOOL antialias;
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(NSRect)frame;
|
||||
@@ -53,10 +54,11 @@ enum { MMMaxCellsPerChar = 2 };
|
||||
//
|
||||
// MMTextView methods
|
||||
//
|
||||
- (NSEvent *)lastMouseDownEvent;
|
||||
- (void)setShouldDrawInsertionPoint:(BOOL)on;
|
||||
- (void)setPreEditRow:(int)row column:(int)col;
|
||||
- (void)hideMarkedTextField;
|
||||
- (void)setMouseShape:(int)shape;
|
||||
- (void)setAntialias:(BOOL)state;
|
||||
|
||||
//
|
||||
// NSTextView methods
|
||||
|
||||
+137
-21
@@ -27,6 +27,8 @@
|
||||
|
||||
#import "MMAtsuiTextView.h"
|
||||
#import "MMVimController.h"
|
||||
#import "MMWindowController.h"
|
||||
#import "MMAppController.h"
|
||||
#import "MacVim.h"
|
||||
|
||||
|
||||
@@ -65,6 +67,8 @@ enum {
|
||||
- (void)updateAtsuStyles;
|
||||
- (void)dispatchKeyEvent:(NSEvent *)event;
|
||||
- (void)sendKeyDown:(const char *)chars length:(int)len modifiers:(int)flags;
|
||||
- (void)hideMouseCursor;
|
||||
- (MMWindowController *)windowController;
|
||||
- (MMVimController *)vimController;
|
||||
@end
|
||||
|
||||
@@ -92,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
|
||||
|
||||
|
||||
@@ -108,6 +114,10 @@ enum {
|
||||
imageSize = NSZeroSize;
|
||||
insetSize = NSZeroSize;
|
||||
|
||||
// NOTE: If the default changes to 'NO' then the intialization of
|
||||
// p_antialias in option.c must change as well.
|
||||
antialias = YES;
|
||||
|
||||
[self initAtsuStyles];
|
||||
}
|
||||
|
||||
@@ -241,11 +251,6 @@ enum {
|
||||
|
||||
|
||||
|
||||
- (NSEvent *)lastMouseDownEvent
|
||||
{
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)setShouldDrawInsertionPoint:(BOOL)on
|
||||
{
|
||||
}
|
||||
@@ -258,6 +263,15 @@ enum {
|
||||
{
|
||||
}
|
||||
|
||||
- (void)setMouseShape:(int)shape
|
||||
{
|
||||
}
|
||||
|
||||
- (void)setAntialias:(BOOL)state
|
||||
{
|
||||
antialias = state;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -322,8 +336,7 @@ enum {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Support 'mousehide' (check p_mh)
|
||||
[NSCursor setHiddenUntilMouseMoves:YES];
|
||||
[self hideMouseCursor];
|
||||
|
||||
// NOTE: 'string' is either an NSString or an NSAttributedString. Since we
|
||||
// do not support attributes, simply pass the corresponding NSString in the
|
||||
@@ -395,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! 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.
|
||||
//
|
||||
// Will this hack work for all languages / keyboard layouts?
|
||||
if ([event keyCode] == 50)
|
||||
return NO;
|
||||
|
||||
// HACK! On Leopard Ctrl-key events end up here instead of keyDown:.
|
||||
if (flags & NSControlKeyMask) {
|
||||
[self keyDown:event];
|
||||
@@ -590,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.
|
||||
@@ -713,6 +737,42 @@ enum {
|
||||
[[self vimController] sendMessage:ScrollWheelMsgID data:data];
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// NOTE: The menu items cut/copy/paste/undo/redo/select all/... must be bound
|
||||
// to the same actions as in IB otherwise they will not work with dialogs. All
|
||||
// we do here is forward these actions to the Vim process.
|
||||
//
|
||||
- (IBAction)cut:(id)sender
|
||||
{
|
||||
[[self windowController] vimMenuItemAction:sender];
|
||||
}
|
||||
|
||||
- (IBAction)copy:(id)sender
|
||||
{
|
||||
[[self windowController] vimMenuItemAction:sender];
|
||||
}
|
||||
|
||||
- (IBAction)paste:(id)sender
|
||||
{
|
||||
[[self windowController] vimMenuItemAction:sender];
|
||||
}
|
||||
|
||||
- (IBAction)undo:(id)sender
|
||||
{
|
||||
[[self windowController] vimMenuItemAction:sender];
|
||||
}
|
||||
|
||||
- (IBAction)redo:(id)sender
|
||||
{
|
||||
[[self windowController] vimMenuItemAction:sender];
|
||||
}
|
||||
|
||||
- (IBAction)selectAll:(id)sender
|
||||
{
|
||||
[[self windowController] vimMenuItemAction:sender];
|
||||
}
|
||||
|
||||
@end // MMAtsuiTextView
|
||||
|
||||
|
||||
@@ -854,21 +914,34 @@ enum {
|
||||
[data appendBytes:&len length:sizeof(int)];
|
||||
[data appendBytes:chars length:len];
|
||||
|
||||
// TODO: Support 'mousehide' (check p_mh)
|
||||
[NSCursor setHiddenUntilMouseMoves:YES];
|
||||
[self hideMouseCursor];
|
||||
|
||||
//NSLog(@"%s len=%d chars=0x%x", _cmd, len, chars[0]);
|
||||
[[self vimController] sendMessage:KeyDownMsgID data:data];
|
||||
}
|
||||
}
|
||||
|
||||
- (MMVimController *)vimController
|
||||
- (void)hideMouseCursor
|
||||
{
|
||||
// Check 'mousehide' option
|
||||
id mh = [[[self vimController] vimState] objectForKey:@"p_mh"];
|
||||
if (mh && ![mh boolValue])
|
||||
[NSCursor setHiddenUntilMouseMoves:NO];
|
||||
else
|
||||
[NSCursor setHiddenUntilMouseMoves:YES];
|
||||
}
|
||||
|
||||
- (MMWindowController *)windowController
|
||||
{
|
||||
id windowController = [[self window] windowController];
|
||||
if ([windowController isKindOfClass:[MMWindowController class]])
|
||||
return (MMWindowController*)windowController;
|
||||
return nil;
|
||||
}
|
||||
|
||||
// TODO: Make sure 'windowController' is a MMWindowController before type
|
||||
// casting.
|
||||
return [(MMWindowController*)windowController vimController];
|
||||
- (MMVimController *)vimController
|
||||
{
|
||||
return [[self windowController] vimController];
|
||||
}
|
||||
|
||||
@end // MMAtsuiTextView (Private)
|
||||
@@ -918,6 +991,9 @@ enum {
|
||||
[contentImage unlockFocus];
|
||||
}
|
||||
|
||||
#define atsu_style_set_bool(s, t, b) \
|
||||
ATSUSetAttributes(s, 1, &t, &(sizeof(Boolean)), &&b);
|
||||
|
||||
- (void)drawString:(UniChar *)string length:(UniCharCount)length
|
||||
atRow:(int)row column:(int)col cells:(int)cells
|
||||
withFlags:(int)flags foregroundColor:(NSColor *)fg
|
||||
@@ -929,6 +1005,26 @@ enum {
|
||||
ATSUStyle style = (flags & DRAW_WIDE) ? atsuStyles[1] : atsuStyles[0];
|
||||
ATSUTextLayout layout;
|
||||
|
||||
// Font selection and rendering options for ATSUI
|
||||
ATSUAttributeTag attribTags[3] = { kATSUQDBoldfaceTag,
|
||||
kATSUQDItalicTag,
|
||||
kATSUStyleRenderingOptionsTag };
|
||||
ByteCount attribSizes[] = { sizeof(Boolean),
|
||||
sizeof(Boolean),
|
||||
sizeof(UInt32) };
|
||||
Boolean useBold, useItalic;
|
||||
UInt32 useAntialias;
|
||||
ATSUAttributeValuePtr attribValues[3] = { &useBold, &useItalic,
|
||||
&useAntialias };
|
||||
|
||||
useBold = (flags & DRAW_BOLD) ? true : false;
|
||||
useItalic = (flags & DRAW_ITALIC) ? true : false;
|
||||
useAntialias = antialias ? kATSStyleApplyAntiAliasing
|
||||
: kATSStyleNoAntiAliasing;
|
||||
|
||||
ATSUSetAttributes(style, sizeof(attribValues) / sizeof(attribValues[0]),
|
||||
attribTags, attribSizes, attribValues);
|
||||
|
||||
// NSLog(@"drawString: %d", length);
|
||||
|
||||
ATSUCreateTextLayout(&layout);
|
||||
@@ -1038,6 +1134,10 @@ enum {
|
||||
} else if (MMInsertionPointVertical == shape) {
|
||||
int frac = (cellSize.width * percent + 99)/100;
|
||||
rect.size.width = frac;
|
||||
} else if (MMInsertionPointVerticalRight == shape) {
|
||||
int frac = (cellSize.width * percent + 99)/100;
|
||||
rect.origin.x += rect.size.width - frac;
|
||||
rect.size.width = frac;
|
||||
}
|
||||
|
||||
[color set];
|
||||
@@ -1048,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)
|
||||
|
||||
+8
-10
@@ -24,6 +24,7 @@
|
||||
id frontendProxy;
|
||||
NSDictionary *colorDict;
|
||||
NSDictionary *sysColorDict;
|
||||
NSDictionary *actionDict;
|
||||
BOOL inputReceived;
|
||||
BOOL tabBarVisible;
|
||||
unsigned backgroundColor;
|
||||
@@ -54,7 +55,9 @@
|
||||
- (void)setSpecialColor:(int)color;
|
||||
- (void)setDefaultColorsBackground:(int)bg foreground:(int)fg;
|
||||
- (NSConnection *)connection;
|
||||
- (NSDictionary *)actionDict;
|
||||
|
||||
- (void)queueMessage:(int)msgid properties:(NSDictionary *)props;
|
||||
- (BOOL)checkin;
|
||||
- (BOOL)openVimWindow;
|
||||
- (void)clearAll;
|
||||
@@ -68,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;
|
||||
@@ -82,15 +87,6 @@
|
||||
saving:(int)saving;
|
||||
- (int)presentDialogWithType:(int)type title:(char *)title message:(char *)msg
|
||||
buttons:(char *)btns textField:(char *)txtfield;
|
||||
- (void)addMenuWithTag:(int)tag parent:(int)parentTag name:(char *)name
|
||||
atIndex:(int)index;
|
||||
- (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name
|
||||
tip:(char *)tip icon:(char *)icon
|
||||
keyEquivalent:(int)key modifiers:(int)mods
|
||||
action:(NSString *)action atIndex:(int)index;
|
||||
- (void)removeMenuItemWithTag:(int)tag;
|
||||
- (void)enableMenuItemWithTag:(int)tag state:(int)enabled;
|
||||
- (void)showPopupMenuWithName:(char *)name atMouseLocation:(BOOL)mouse;
|
||||
- (void)showToolbar:(int)enable flags:(int)flags;
|
||||
- (void)createScrollbarWithIdentifier:(long)ident type:(int)type;
|
||||
- (void)destroyScrollbarWithIdentifier:(long)ident;
|
||||
@@ -112,9 +108,11 @@
|
||||
- (int)lookupColorWithKey:(NSString *)key;
|
||||
- (BOOL)hasSpecialKeyWithValue:(NSString *)value;
|
||||
|
||||
- (void)enterFullscreen;
|
||||
- (void)enterFullscreen:(int)fuoptions background:(int)bg;
|
||||
- (void)leaveFullscreen;
|
||||
|
||||
- (void)setAntialias:(BOOL)antialias;
|
||||
|
||||
- (void)updateModifiedFlag;
|
||||
|
||||
- (void)registerServerWithName:(NSString *)name;
|
||||
|
||||
+140
-198
@@ -51,10 +51,12 @@ static unsigned MMServerMax = 1000;
|
||||
|
||||
// TODO: Move to separate file.
|
||||
static int eventModifierFlagsToVimModMask(int modifierFlags);
|
||||
static int vimModMaskToEventModifierFlags(int mods);
|
||||
static int eventModifierFlagsToVimMouseModMask(int modifierFlags);
|
||||
static int eventButtonNumberToVimMouseButton(int buttonNumber);
|
||||
static int specialKeyToNSKey(int key);
|
||||
|
||||
// In gui_macvim.m
|
||||
vimmenu_T *menu_for_descriptor(NSArray *desc);
|
||||
|
||||
|
||||
enum {
|
||||
MMBlinkStateNone = 0,
|
||||
@@ -76,7 +78,10 @@ static NSString *MMSymlinkWarningString =
|
||||
|
||||
|
||||
|
||||
|
||||
@interface MMBackend (Private)
|
||||
- (void)waitForDialogReturn;
|
||||
- (void)queueVimStateMessage;
|
||||
- (void)processInputQueue;
|
||||
- (void)handleInputEvent:(int)msgid data:(NSData *)data;
|
||||
+ (NSDictionary *)specialKeys;
|
||||
@@ -142,8 +147,12 @@ static NSString *MMSymlinkWarningString =
|
||||
sysColorDict = [[NSDictionary dictionaryWithContentsOfFile:path]
|
||||
retain];
|
||||
|
||||
if (!(colorDict && sysColorDict))
|
||||
NSLog(@"ERROR: Failed to load color dictionaries.%@",
|
||||
path = [mainBundle pathForResource:@"Actions" ofType:@"plist"];
|
||||
if (path)
|
||||
actionDict = [[NSDictionary dictionaryWithContentsOfFile:path] retain];
|
||||
|
||||
if (!(colorDict && sysColorDict && actionDict))
|
||||
NSLog(@"ERROR: Failed to load dictionaries.%@",
|
||||
MMSymlinkWarningString);
|
||||
|
||||
return self;
|
||||
@@ -165,6 +174,7 @@ static NSString *MMSymlinkWarningString =
|
||||
[drawData release]; drawData = nil;
|
||||
[frontendProxy release]; frontendProxy = nil;
|
||||
[connection release]; connection = nil;
|
||||
[actionDict release]; actionDict = nil;
|
||||
[sysColorDict release]; sysColorDict = nil;
|
||||
[colorDict release]; colorDict = nil;
|
||||
|
||||
@@ -215,6 +225,16 @@ static NSString *MMSymlinkWarningString =
|
||||
return connection;
|
||||
}
|
||||
|
||||
- (NSDictionary *)actionDict
|
||||
{
|
||||
return actionDict;
|
||||
}
|
||||
|
||||
- (void)queueMessage:(int)msgid properties:(NSDictionary *)props
|
||||
{
|
||||
[self queueMessage:msgid data:[props dictionaryAsData]];
|
||||
}
|
||||
|
||||
- (BOOL)checkin
|
||||
{
|
||||
if (![self connection]) {
|
||||
@@ -409,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
|
||||
@@ -429,9 +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 (!force && lastFlushDate && -[lastFlushDate timeIntervalSinceNow]
|
||||
< MMFlushTimeoutInterval
|
||||
&& [drawData length] < MMFlushQueueLenHint)
|
||||
if (!force && lastFlushDate
|
||||
&& -[lastFlushDate timeIntervalSinceNow] < MMFlushTimeoutInterval
|
||||
&& [drawData length] < MMFlushQueueLenHint)
|
||||
return;
|
||||
|
||||
if ([drawData length] > 0) {
|
||||
@@ -451,7 +484,12 @@ static NSString *MMSymlinkWarningString =
|
||||
[drawData setLength:0];
|
||||
}
|
||||
|
||||
if ([outputQueue count] > 0) {
|
||||
if ([outputQueue count] > 0 || force) {
|
||||
// When 'force' is set we always update the Vim state to ensure that
|
||||
// MacVim has a copy of the latest state (since 'force' is typically
|
||||
// set just before Vim takes a nap whilst waiting for input).
|
||||
[self queueVimStateMessage];
|
||||
|
||||
@try {
|
||||
[frontendProxy processCommandQueue:outputQueue];
|
||||
}
|
||||
@@ -615,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];
|
||||
@@ -639,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];
|
||||
@@ -694,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]) {
|
||||
@@ -723,98 +762,6 @@ static NSString *MMSymlinkWarningString =
|
||||
return retval;
|
||||
}
|
||||
|
||||
- (void)addMenuWithTag:(int)tag parent:(int)parentTag name:(char *)name
|
||||
atIndex:(int)index
|
||||
{
|
||||
//NSLog(@"addMenuWithTag:%d parent:%d name:%s atIndex:%d", tag, parentTag,
|
||||
// name, index);
|
||||
|
||||
int namelen = name ? strlen(name) : 0;
|
||||
NSMutableData *data = [NSMutableData data];
|
||||
|
||||
[data appendBytes:&tag length:sizeof(int)];
|
||||
[data appendBytes:&parentTag length:sizeof(int)];
|
||||
[data appendBytes:&namelen length:sizeof(int)];
|
||||
if (namelen > 0) [data appendBytes:name length:namelen];
|
||||
[data appendBytes:&index length:sizeof(int)];
|
||||
|
||||
[self queueMessage:AddMenuMsgID data:data];
|
||||
}
|
||||
|
||||
- (void)addMenuItemWithTag:(int)tag parent:(int)parentTag name:(char *)name
|
||||
tip:(char *)tip icon:(char *)icon
|
||||
keyEquivalent:(int)key modifiers:(int)mods
|
||||
action:(NSString *)action atIndex:(int)index
|
||||
{
|
||||
//NSLog(@"addMenuItemWithTag:%d parent:%d name:%s tip:%s atIndex:%d", tag,
|
||||
// parentTag, name, tip, index);
|
||||
|
||||
int namelen = name ? strlen(name) : 0;
|
||||
int tiplen = tip ? strlen(tip) : 0;
|
||||
int iconlen = icon ? strlen(icon) : 0;
|
||||
int eventFlags = vimModMaskToEventModifierFlags(mods);
|
||||
int actionlen = [action lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
|
||||
NSMutableData *data = [NSMutableData data];
|
||||
|
||||
key = specialKeyToNSKey(key);
|
||||
|
||||
[data appendBytes:&tag length:sizeof(int)];
|
||||
[data appendBytes:&parentTag length:sizeof(int)];
|
||||
[data appendBytes:&namelen length:sizeof(int)];
|
||||
if (namelen > 0) [data appendBytes:name length:namelen];
|
||||
[data appendBytes:&tiplen length:sizeof(int)];
|
||||
if (tiplen > 0) [data appendBytes:tip length:tiplen];
|
||||
[data appendBytes:&iconlen length:sizeof(int)];
|
||||
if (iconlen > 0) [data appendBytes:icon length:iconlen];
|
||||
[data appendBytes:&actionlen length:sizeof(int)];
|
||||
if (actionlen > 0) [data appendBytes:[action UTF8String] length:actionlen];
|
||||
[data appendBytes:&index length:sizeof(int)];
|
||||
[data appendBytes:&key length:sizeof(int)];
|
||||
[data appendBytes:&eventFlags length:sizeof(int)];
|
||||
|
||||
[self queueMessage:AddMenuItemMsgID data:data];
|
||||
}
|
||||
|
||||
- (void)removeMenuItemWithTag:(int)tag
|
||||
{
|
||||
NSMutableData *data = [NSMutableData data];
|
||||
[data appendBytes:&tag length:sizeof(int)];
|
||||
|
||||
[self queueMessage:RemoveMenuItemMsgID data:data];
|
||||
}
|
||||
|
||||
- (void)enableMenuItemWithTag:(int)tag state:(int)enabled
|
||||
{
|
||||
NSMutableData *data = [NSMutableData data];
|
||||
|
||||
[data appendBytes:&tag length:sizeof(int)];
|
||||
[data appendBytes:&enabled length:sizeof(int)];
|
||||
|
||||
[self queueMessage:EnableMenuItemMsgID data:data];
|
||||
}
|
||||
|
||||
- (void)showPopupMenuWithName:(char *)name atMouseLocation:(BOOL)mouse
|
||||
{
|
||||
int len = strlen(name);
|
||||
int row = -1, col = -1;
|
||||
|
||||
if (len <= 0) return;
|
||||
|
||||
if (!mouse && curwin) {
|
||||
row = curwin->w_wrow;
|
||||
col = curwin->w_wcol;
|
||||
}
|
||||
|
||||
NSMutableData *data = [NSMutableData data];
|
||||
|
||||
[data appendBytes:&row length:sizeof(int)];
|
||||
[data appendBytes:&col length:sizeof(int)];
|
||||
[data appendBytes:&len length:sizeof(int)];
|
||||
[data appendBytes:name length:len];
|
||||
|
||||
[self queueMessage:ShowPopupMenuMsgID data:data];
|
||||
}
|
||||
|
||||
- (void)showToolbar:(int)enable flags:(int)flags
|
||||
{
|
||||
NSMutableData *data = [NSMutableData data];
|
||||
@@ -1055,9 +1002,13 @@ static NSString *MMSymlinkWarningString =
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)enterFullscreen
|
||||
- (void)enterFullscreen:(int)fuoptions background:(int)bg
|
||||
{
|
||||
[self queueMessage:EnterFullscreenMsgID data:nil];
|
||||
NSMutableData *data = [NSMutableData data];
|
||||
[data appendBytes:&fuoptions length:sizeof(int)];
|
||||
bg = MM_COLOR(bg);
|
||||
[data appendBytes:&bg length:sizeof(int)];
|
||||
[self queueMessage:EnterFullscreenMsgID data:data];
|
||||
}
|
||||
|
||||
- (void)leaveFullscreen
|
||||
@@ -1065,6 +1016,13 @@ static NSString *MMSymlinkWarningString =
|
||||
[self queueMessage:LeaveFullscreenMsgID data:nil];
|
||||
}
|
||||
|
||||
- (void)setAntialias:(BOOL)antialias
|
||||
{
|
||||
int msgid = antialias ? EnableAntialiasMsgID : DisableAntialiasMsgID;
|
||||
|
||||
[self queueMessage:msgid data:nil];
|
||||
}
|
||||
|
||||
- (void)updateModifiedFlag
|
||||
{
|
||||
// Notify MacVim if _any_ buffer has changed from unmodified to modified or
|
||||
@@ -1243,6 +1201,8 @@ static NSString *MMSymlinkWarningString =
|
||||
|
||||
- (BOOL)starRegisterToPasteboard:(byref NSPasteboard *)pboard
|
||||
{
|
||||
// TODO: This method should share code with clip_mch_request_selection().
|
||||
|
||||
if (VIsual_active && (State & NORMAL) && clip_star.available) {
|
||||
// If there is no pasteboard, return YES to indicate that there is text
|
||||
// to copy.
|
||||
@@ -1529,8 +1489,70 @@ 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
|
||||
// MacVim. Do not add state that could potentially require lots of memory
|
||||
// since this message gets sent each time the output queue is forcibly
|
||||
// flushed (e.g. storing the currently selected text would be a bad idea).
|
||||
// We take this approach of "pushing" the state to MacVim to avoid having
|
||||
// to make synchronous calls from MacVim to Vim in order to get state.
|
||||
|
||||
NSDictionary *vimState = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
[[NSFileManager defaultManager] currentDirectoryPath], @"pwd",
|
||||
[NSNumber numberWithInt:p_mh], @"p_mh",
|
||||
nil];
|
||||
|
||||
[self queueMessage:SetVimStateMsgID data:[vimState dictionaryAsData]];
|
||||
}
|
||||
|
||||
- (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
|
||||
@@ -1604,14 +1626,12 @@ static NSString *MMSymlinkWarningString =
|
||||
//NSLog(@"[VimTask] Resizing shell to %dx%d.", cols, rows);
|
||||
gui_resize_shell(cols, rows);
|
||||
} else if (ExecuteMenuMsgID == msgid) {
|
||||
if (!data) return;
|
||||
const void *bytes = [data bytes];
|
||||
int tag = *((int*)bytes); bytes += sizeof(int);
|
||||
|
||||
vimmenu_T *menu = (vimmenu_T*)tag;
|
||||
// TODO! Make sure 'menu' is a valid menu pointer!
|
||||
if (menu) {
|
||||
gui_menu_cb(menu);
|
||||
NSDictionary *attrs = [NSDictionary dictionaryWithData:data];
|
||||
if (attrs) {
|
||||
NSArray *desc = [attrs objectForKey:@"descriptor"];
|
||||
vimmenu_T *menu = menu_for_descriptor(desc);
|
||||
if (menu)
|
||||
gui_menu_cb(menu);
|
||||
}
|
||||
} else if (ToggleToolbarMsgID == msgid) {
|
||||
[self handleToggleToolbar];
|
||||
@@ -1826,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];
|
||||
@@ -2420,22 +2443,6 @@ static int eventModifierFlagsToVimModMask(int modifierFlags)
|
||||
return modMask;
|
||||
}
|
||||
|
||||
static int vimModMaskToEventModifierFlags(int mods)
|
||||
{
|
||||
int flags = 0;
|
||||
|
||||
if (mods & MOD_MASK_SHIFT)
|
||||
flags |= NSShiftKeyMask;
|
||||
if (mods & MOD_MASK_CTRL)
|
||||
flags |= NSControlKeyMask;
|
||||
if (mods & MOD_MASK_ALT)
|
||||
flags |= NSAlternateKeyMask;
|
||||
if (mods & MOD_MASK_CMD)
|
||||
flags |= NSCommandKeyMask;
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
static int eventModifierFlagsToVimMouseModMask(int modifierFlags)
|
||||
{
|
||||
int modMask = 0;
|
||||
@@ -2457,68 +2464,3 @@ static int eventButtonNumberToVimMouseButton(int buttonNumber)
|
||||
return (buttonNumber >= 0 && buttonNumber < 3)
|
||||
? mouseButton[buttonNumber] : -1;
|
||||
}
|
||||
|
||||
static int specialKeyToNSKey(int key)
|
||||
{
|
||||
if (!IS_SPECIAL(key))
|
||||
return key;
|
||||
|
||||
static struct {
|
||||
int special;
|
||||
int nskey;
|
||||
} sp2ns[] = {
|
||||
{ K_UP, NSUpArrowFunctionKey },
|
||||
{ K_DOWN, NSDownArrowFunctionKey },
|
||||
{ K_LEFT, NSLeftArrowFunctionKey },
|
||||
{ K_RIGHT, NSRightArrowFunctionKey },
|
||||
{ K_F1, NSF1FunctionKey },
|
||||
{ K_F2, NSF2FunctionKey },
|
||||
{ K_F3, NSF3FunctionKey },
|
||||
{ K_F4, NSF4FunctionKey },
|
||||
{ K_F5, NSF5FunctionKey },
|
||||
{ K_F6, NSF6FunctionKey },
|
||||
{ K_F7, NSF7FunctionKey },
|
||||
{ K_F8, NSF8FunctionKey },
|
||||
{ K_F9, NSF9FunctionKey },
|
||||
{ K_F10, NSF10FunctionKey },
|
||||
{ K_F11, NSF11FunctionKey },
|
||||
{ K_F12, NSF12FunctionKey },
|
||||
{ K_F13, NSF13FunctionKey },
|
||||
{ K_F14, NSF14FunctionKey },
|
||||
{ K_F15, NSF15FunctionKey },
|
||||
{ K_F16, NSF16FunctionKey },
|
||||
{ K_F17, NSF17FunctionKey },
|
||||
{ K_F18, NSF18FunctionKey },
|
||||
{ K_F19, NSF19FunctionKey },
|
||||
{ K_F20, NSF20FunctionKey },
|
||||
{ K_F21, NSF21FunctionKey },
|
||||
{ K_F22, NSF22FunctionKey },
|
||||
{ K_F23, NSF23FunctionKey },
|
||||
{ K_F24, NSF24FunctionKey },
|
||||
{ K_F25, NSF25FunctionKey },
|
||||
{ K_F26, NSF26FunctionKey },
|
||||
{ K_F27, NSF27FunctionKey },
|
||||
{ K_F28, NSF28FunctionKey },
|
||||
{ K_F29, NSF29FunctionKey },
|
||||
{ K_F30, NSF30FunctionKey },
|
||||
{ K_F31, NSF31FunctionKey },
|
||||
{ K_F32, NSF32FunctionKey },
|
||||
{ K_F33, NSF33FunctionKey },
|
||||
{ K_F34, NSF34FunctionKey },
|
||||
{ K_F35, NSF35FunctionKey },
|
||||
{ K_DEL, NSBackspaceCharacter },
|
||||
{ K_BS, NSDeleteCharacter },
|
||||
{ K_HOME, NSHomeFunctionKey },
|
||||
{ K_END, NSEndFunctionKey },
|
||||
{ K_PAGEUP, NSPageUpFunctionKey },
|
||||
{ K_PAGEDOWN, NSPageDownFunctionKey }
|
||||
};
|
||||
|
||||
int i;
|
||||
for (i = 0; i < sizeof(sp2ns)/sizeof(sp2ns[0]); ++i) {
|
||||
if (sp2ns[i].special == key)
|
||||
return sp2ns[i].nskey;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* vi:set ts=8 sts=4 sw=4 ft=objc:
|
||||
*
|
||||
* VIM - Vi IMproved by Bram Moolenaar
|
||||
* MacVim GUI port by Bjorn Winckler
|
||||
* VIM - Vi IMproved by Bram Moolenaar
|
||||
* MacVim GUI port by Bjorn Winckler
|
||||
*
|
||||
* Do ":help uganda" in Vim to read copying and usage conditions.
|
||||
* Do ":help credits" in Vim to see a list of people who contributed.
|
||||
@@ -19,11 +19,21 @@
|
||||
MMVimView *view;
|
||||
NSPoint oldPosition;
|
||||
NSString *oldTabBarStyle;
|
||||
|
||||
// These are only valid in fullscreen mode and store pre-fu vim size
|
||||
int nonFuRows, nonFuColumns;
|
||||
|
||||
// These store the size vim had right after entering fu mode
|
||||
int startFuRows, startFuColumns;
|
||||
|
||||
// This stores the contents of fuoptions_flags at fu start time
|
||||
int startFuFlags;
|
||||
}
|
||||
|
||||
- (MMFullscreenWindow *)initWithWindow:(NSWindow *)t view:(MMVimView *)v;
|
||||
- (MMFullscreenWindow *)initWithWindow:(NSWindow *)t view:(MMVimView *)v
|
||||
backgroundColor:(NSColor *)back;
|
||||
|
||||
- (void)enterFullscreen;
|
||||
- (void)enterFullscreen:(int)fuoptions;
|
||||
- (void)leaveFullscreen;
|
||||
- (void)centerView;
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* vi:set ts=8 sts=4 sw=4 ft=objc:
|
||||
*
|
||||
* VIM - Vi IMproved by Bram Moolenaar
|
||||
* MacVim GUI port by Bjorn Winckler
|
||||
* VIM - Vi IMproved by Bram Moolenaar
|
||||
* MacVim GUI port by Bjorn Winckler
|
||||
*
|
||||
* Do ":help uganda" in Vim to read copying and usage conditions.
|
||||
* Do ":help credits" in Vim to see a list of people who contributed.
|
||||
@@ -23,6 +23,7 @@
|
||||
* Author: Nico Weber
|
||||
*/
|
||||
|
||||
#import "MMVimController.h"
|
||||
#import "MMFullscreenWindow.h"
|
||||
#import <PSMTabBarControl.h>
|
||||
#import "MMVimView.h"
|
||||
@@ -30,6 +31,11 @@
|
||||
#import "MMWindowController.h"
|
||||
#import <Carbon/Carbon.h>
|
||||
|
||||
// These have to be the same as in option.h
|
||||
#define FUOPT_MAXVERT 0x001
|
||||
#define FUOPT_MAXHORZ 0x002
|
||||
#define FUOPT_BGCOLOR_HLGROUP 0x004
|
||||
|
||||
|
||||
static int numFullscreenWindows = 0;
|
||||
|
||||
@@ -41,7 +47,8 @@ static int numFullscreenWindows = 0;
|
||||
|
||||
@implementation MMFullscreenWindow
|
||||
|
||||
- (MMFullscreenWindow *)initWithWindow:(NSWindow *)t view:(MMVimView *)v
|
||||
- (MMFullscreenWindow *)initWithWindow:(NSWindow *)t view:(MMVimView *)v
|
||||
backgroundColor:(NSColor *)back
|
||||
{
|
||||
NSScreen* screen = [t screen];
|
||||
|
||||
@@ -68,7 +75,7 @@ static int numFullscreenWindows = 0;
|
||||
|
||||
[self setHasShadow:NO];
|
||||
[self setShowsResizeIndicator:NO];
|
||||
[self setBackgroundColor:[NSColor blackColor]];
|
||||
[self setBackgroundColor:back];
|
||||
[self setReleasedWhenClosed:NO];
|
||||
|
||||
return self;
|
||||
@@ -82,7 +89,7 @@ static int numFullscreenWindows = 0;
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (void)enterFullscreen
|
||||
- (void)enterFullscreen:(int)fuoptions
|
||||
{
|
||||
[self hideDockIfAppropriate];
|
||||
|
||||
@@ -123,6 +130,42 @@ static int numFullscreenWindows = 0;
|
||||
// focus gained message
|
||||
[self setDelegate:delegate];
|
||||
|
||||
// resize vim view according to fuoptions
|
||||
int currRows, currColumns;
|
||||
[[view textView] getMaxRows:&currRows columns:&currColumns];
|
||||
|
||||
int fuRows = currRows, fuColumns = currColumns;
|
||||
|
||||
int maxRows, maxColumns;
|
||||
NSSize size = [[self screen] visibleFrame].size;
|
||||
[view constrainRows:&maxRows columns:&maxColumns toSize:size];
|
||||
|
||||
// Store current pre-fu vim size
|
||||
nonFuRows = currRows;
|
||||
nonFuColumns = currColumns;
|
||||
|
||||
// Compute current fu size
|
||||
if (fuoptions & FUOPT_MAXVERT)
|
||||
fuRows = maxRows;
|
||||
if (fuoptions & FUOPT_MAXHORZ)
|
||||
fuColumns = maxColumns;
|
||||
|
||||
startFuFlags = fuoptions;
|
||||
|
||||
// if necessary, resize vim to target fu size
|
||||
if (currRows != fuRows || currColumns != fuColumns) {
|
||||
int newSize[2] = { fuRows, fuColumns };
|
||||
NSData *data = [NSData dataWithBytes:newSize length:2*sizeof(int)];
|
||||
MMVimController *vimController =
|
||||
[[self windowController] vimController];
|
||||
|
||||
[vimController sendMessage:SetTextDimensionsMsgID data:data];
|
||||
[[view textView] setMaxRows:fuRows columns:fuColumns];
|
||||
}
|
||||
|
||||
startFuRows = fuRows;
|
||||
startFuColumns = fuColumns;
|
||||
|
||||
// move vim view to the window's center
|
||||
[self centerView];
|
||||
|
||||
@@ -149,6 +192,32 @@ static int numFullscreenWindows = 0;
|
||||
didBlend = YES;
|
||||
}
|
||||
|
||||
// restore old vim view size
|
||||
int currRows, currColumns;
|
||||
[[view textView] getMaxRows:&currRows columns:&currColumns];
|
||||
int newRows = currRows, newColumns = currColumns;
|
||||
|
||||
// compute desired non-fu size.
|
||||
// if current fu size is equal to fu size at fu enter time,
|
||||
// restore the old size
|
||||
//
|
||||
if (startFuFlags & FUOPT_MAXVERT && startFuRows == currRows)
|
||||
newRows = nonFuRows;
|
||||
|
||||
if (startFuFlags & FUOPT_MAXHORZ && startFuColumns == currColumns)
|
||||
newColumns = nonFuColumns;
|
||||
|
||||
// resize vim if necessary
|
||||
if (currRows != newRows || currColumns != newColumns) {
|
||||
int newSize[2] = { newRows, newColumns };
|
||||
NSData *data = [NSData dataWithBytes:newSize length:2*sizeof(int)];
|
||||
MMVimController *vimController =
|
||||
[[self windowController] vimController];
|
||||
|
||||
[vimController sendMessage:SetTextDimensionsMsgID data:data];
|
||||
[[view textView] setMaxRows:newRows columns:newColumns];
|
||||
}
|
||||
|
||||
// fix up target controller
|
||||
[self retain]; // NSWindowController releases us once
|
||||
[[self windowController] setWindow:target];
|
||||
@@ -166,6 +235,7 @@ static int numFullscreenWindows = 0;
|
||||
// window.
|
||||
[view removeFromSuperviewWithoutNeedingDisplay];
|
||||
[[target contentView] addSubview:view];
|
||||
|
||||
[view setFrameOrigin:oldPosition];
|
||||
[self close];
|
||||
|
||||
@@ -228,6 +298,15 @@ static int numFullscreenWindows = 0;
|
||||
[super performClose:sender];
|
||||
}
|
||||
|
||||
- (BOOL)validateMenuItem:(NSMenuItem *)item
|
||||
{
|
||||
if ([item action] == @selector(vimMenuItemAction:)
|
||||
|| [item action] == @selector(performClose:))
|
||||
return [item tag];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end // MMFullscreenWindow
|
||||
|
||||
|
||||
|
||||
@@ -258,6 +258,16 @@ static NSString *MMWideCharacterAttributeName = @"MMWideChar";
|
||||
|| col+cells > maxColumns || !string || !(fg && bg && sp))
|
||||
return;
|
||||
|
||||
BOOL hasControlChars = [string rangeOfCharacterFromSet:
|
||||
[NSCharacterSet controlCharacterSet]].location != NSNotFound;
|
||||
if (hasControlChars) {
|
||||
// HACK! If a string for some reason contains control characters, then
|
||||
// draw blanks instead (otherwise charRangeForRow::: fails).
|
||||
NSRange subRange = { 0, cells };
|
||||
flags &= ~DRAW_WIDE;
|
||||
string = [[emptyRowString string] substringWithRange:subRange];
|
||||
}
|
||||
|
||||
// Find range of characters in text storage to replace.
|
||||
int acol = col;
|
||||
int acells = cells;
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
|
||||
@interface MMTextView : NSTextView {
|
||||
BOOL shouldDrawInsertionPoint;
|
||||
NSEvent *lastMouseDownEvent;
|
||||
NSTrackingRectTag trackingRectTag;
|
||||
BOOL isDragging;
|
||||
BOOL isAutoscrolling;
|
||||
@@ -28,17 +27,20 @@
|
||||
NSTextField *markedTextField;
|
||||
int preEditRow;
|
||||
int preEditColumn;
|
||||
int mouseShape;
|
||||
BOOL antialias;
|
||||
NSRect *invertRects;
|
||||
int numInvertRects;
|
||||
}
|
||||
|
||||
- (id)initWithFrame:(NSRect)frame;
|
||||
|
||||
- (NSEvent *)lastMouseDownEvent;
|
||||
- (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;
|
||||
- (void)setAntialias:(BOOL)antialias;
|
||||
|
||||
//
|
||||
// MMTextStorage methods
|
||||
|
||||
+258
-46
@@ -22,6 +22,7 @@
|
||||
#import "MMWindowController.h"
|
||||
#import "MMVimController.h"
|
||||
#import "MMTypesetter.h"
|
||||
#import "MMAppController.h"
|
||||
#import "MacVim.h"
|
||||
|
||||
|
||||
@@ -46,14 +47,23 @@ enum {
|
||||
|
||||
|
||||
@interface MMTextView (Private)
|
||||
- (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;
|
||||
- (MMVimController *)vimController;
|
||||
- (void)startDragTimerWithInterval:(NSTimeInterval)t;
|
||||
- (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
|
||||
|
||||
|
||||
@@ -110,6 +120,9 @@ enum {
|
||||
return nil;
|
||||
}
|
||||
|
||||
// NOTE: If the default changes to 'NO' then the intialization of
|
||||
// p_antialias in option.c must change as well.
|
||||
antialias = YES;
|
||||
return self;
|
||||
}
|
||||
|
||||
@@ -123,13 +136,13 @@ enum {
|
||||
markedTextField = nil;
|
||||
}
|
||||
|
||||
[lastMouseDownEvent release]; lastMouseDownEvent = nil;
|
||||
[super dealloc];
|
||||
}
|
||||
if (invertRects) {
|
||||
free(invertRects);
|
||||
invertRects = NULL;
|
||||
numInvertRects = 0;
|
||||
}
|
||||
|
||||
- (NSEvent *)lastMouseDownEvent
|
||||
{
|
||||
return lastMouseDownEvent;
|
||||
[super dealloc];
|
||||
}
|
||||
|
||||
- (BOOL)shouldDrawInsertionPoint
|
||||
@@ -152,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) {
|
||||
@@ -299,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);
|
||||
@@ -327,6 +336,17 @@ enum {
|
||||
#endif
|
||||
}
|
||||
|
||||
- (void)setMouseShape:(int)shape
|
||||
{
|
||||
mouseShape = shape;
|
||||
[self setCursor];
|
||||
}
|
||||
|
||||
- (void)setAntialias:(BOOL)state
|
||||
{
|
||||
antialias = state;
|
||||
}
|
||||
|
||||
- (NSFont *)font
|
||||
{
|
||||
return [(MMTextStorage*)[self textStorage] font];
|
||||
@@ -435,8 +455,29 @@ enum {
|
||||
|
||||
- (void)drawRect:(NSRect)rect
|
||||
{
|
||||
NSGraphicsContext *context = [NSGraphicsContext currentContext];
|
||||
[context setShouldAntialias:antialias];
|
||||
|
||||
[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];
|
||||
|
||||
@@ -450,7 +491,11 @@ enum {
|
||||
ipRect.origin.y += ipRect.size.height - frac;
|
||||
ipRect.size.height = frac;
|
||||
} else if (MMInsertionPointVertical == insertionPointShape) {
|
||||
int frac = ([ts cellSize].width* insertionPointFraction + 99)/100;
|
||||
int frac = ([ts cellSize].width * insertionPointFraction + 99)/100;
|
||||
ipRect.size.width = frac;
|
||||
} else if (MMInsertionPointVerticalRight == insertionPointShape) {
|
||||
int frac = ([ts cellSize].width * insertionPointFraction + 99)/100;
|
||||
ipRect.origin.x += ipRect.size.width - frac;
|
||||
ipRect.size.width = frac;
|
||||
}
|
||||
|
||||
@@ -548,8 +593,7 @@ enum {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: Support 'mousehide' (check p_mh)
|
||||
[NSCursor setHiddenUntilMouseMoves:YES];
|
||||
[self hideMouseCursor];
|
||||
|
||||
// NOTE: 'string' is either an NSString or an NSAttributedString. Since we
|
||||
// do not support attributes, simply pass the corresponding NSString in the
|
||||
@@ -622,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! 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.
|
||||
//
|
||||
// Will this hack work for all languages / keyboard layouts?
|
||||
if ([event keyCode] == 50)
|
||||
return NO;
|
||||
|
||||
// HACK! On Leopard Ctrl-key events end up here instead of keyDown:.
|
||||
if (flags & NSControlKeyMask) {
|
||||
[self keyDown:event];
|
||||
@@ -805,17 +847,18 @@ enum {
|
||||
if (![self convertPoint:pt toRow:&row column:&col])
|
||||
return;
|
||||
|
||||
lastMouseDownEvent = [event copy];
|
||||
|
||||
int button = [event buttonNumber];
|
||||
int flags = [event modifierFlags];
|
||||
int count = [event clickCount];
|
||||
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;
|
||||
}
|
||||
@@ -910,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])
|
||||
@@ -928,6 +976,8 @@ enum {
|
||||
[data appendBytes:&col length:sizeof(int)];
|
||||
|
||||
[[self vimController] sendMessage:MouseMovedMsgID data:data];
|
||||
|
||||
//NSLog(@"Moved %d %d\n", col, row);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -938,8 +988,9 @@ enum {
|
||||
// NOTE: This event is received even when the window is not key; thus we
|
||||
// have to take care not to enable mouse moved events unless our window is
|
||||
// key.
|
||||
if ([[self window] isKeyWindow])
|
||||
if ([[self window] isKeyWindow]) {
|
||||
[[self window] setAcceptsMouseMovedEvents:YES];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)mouseExited:(NSEvent *)event
|
||||
@@ -1093,6 +1144,54 @@ enum {
|
||||
// The font panel is updated whenever the font is set.
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// NOTE: The menu items cut/copy/paste/undo/redo/select all/... must be bound
|
||||
// to the same actions as in IB otherwise they will not work with dialogs. All
|
||||
// we do here is forward these actions to the Vim process.
|
||||
//
|
||||
- (IBAction)cut:(id)sender
|
||||
{
|
||||
[[self windowController] vimMenuItemAction:sender];
|
||||
}
|
||||
|
||||
- (IBAction)copy:(id)sender
|
||||
{
|
||||
[[self windowController] vimMenuItemAction:sender];
|
||||
}
|
||||
|
||||
- (IBAction)paste:(id)sender
|
||||
{
|
||||
[[self windowController] vimMenuItemAction:sender];
|
||||
}
|
||||
|
||||
- (IBAction)undo:(id)sender
|
||||
{
|
||||
[[self windowController] vimMenuItemAction:sender];
|
||||
}
|
||||
|
||||
- (IBAction)redo:(id)sender
|
||||
{
|
||||
[[self windowController] vimMenuItemAction:sender];
|
||||
}
|
||||
|
||||
- (IBAction)selectAll:(id)sender
|
||||
{
|
||||
[[self windowController] vimMenuItemAction:sender];
|
||||
}
|
||||
|
||||
- (BOOL)validateMenuItem:(NSMenuItem *)item
|
||||
{
|
||||
if ([item action] == @selector(cut:)
|
||||
|| [item action] == @selector(copy:)
|
||||
|| [item action] == @selector(paste:)
|
||||
|| [item action] == @selector(undo:)
|
||||
|| [item action] == @selector(redo:)
|
||||
|| [item action] == @selector(selectAll:))
|
||||
return [item tag];
|
||||
|
||||
return YES;
|
||||
}
|
||||
@end // MMTextView
|
||||
|
||||
|
||||
@@ -1100,6 +1199,47 @@ enum {
|
||||
|
||||
@implementation MMTextView (Private)
|
||||
|
||||
- (void)setCursor
|
||||
{
|
||||
static NSCursor *customIbeamCursor = nil;
|
||||
|
||||
if (!customIbeamCursor) {
|
||||
// Use a custom Ibeam cursor that has better contrast against dark
|
||||
// backgrounds.
|
||||
// TODO: Is the hotspot ok?
|
||||
NSImage *ibeamImage = [NSImage imageNamed:@"ibeam"];
|
||||
if (ibeamImage) {
|
||||
NSSize size = [ibeamImage size];
|
||||
NSPoint hotSpot = { size.width*.5f, size.height*.5f };
|
||||
|
||||
customIbeamCursor = [[NSCursor alloc]
|
||||
initWithImage:ibeamImage hotSpot:hotSpot];
|
||||
}
|
||||
if (!customIbeamCursor) {
|
||||
NSLog(@"WARNING: Failed to load custom Ibeam cursor");
|
||||
customIbeamCursor = [NSCursor IBeamCursor];
|
||||
}
|
||||
}
|
||||
|
||||
// This switch should match mshape_names[] in misc2.c.
|
||||
//
|
||||
// TODO: Add missing cursor shapes.
|
||||
switch (mouseShape) {
|
||||
case 2: [customIbeamCursor set]; break;
|
||||
case 3: case 4: [[NSCursor resizeUpDownCursor] set]; break;
|
||||
case 5: case 6: [[NSCursor resizeLeftRightCursor] set]; break;
|
||||
case 9: [[NSCursor crosshairCursor] set]; break;
|
||||
case 10: [[NSCursor pointingHandCursor] set]; break;
|
||||
case 11: [[NSCursor openHandCursor] set]; break;
|
||||
default:
|
||||
[[NSCursor arrowCursor] set]; break;
|
||||
}
|
||||
|
||||
// Shape 1 indicates that the mouse cursor should be hidden.
|
||||
if (1 == mouseShape)
|
||||
[NSCursor setHiddenUntilMouseMoves:YES];
|
||||
}
|
||||
|
||||
- (BOOL)convertPoint:(NSPoint)point toRow:(int *)row column:(int *)column
|
||||
{
|
||||
MMTextStorage *ts = (MMTextStorage*)[self textStorage];
|
||||
@@ -1131,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];
|
||||
@@ -1192,13 +1349,17 @@ enum {
|
||||
[self sendKeyDown:bytes length:len modifiers:mods];
|
||||
}
|
||||
|
||||
- (MMVimController *)vimController
|
||||
- (MMWindowController *)windowController
|
||||
{
|
||||
id windowController = [[self window] windowController];
|
||||
if ([windowController isKindOfClass:[MMWindowController class]])
|
||||
return (MMWindowController*)windowController;
|
||||
return nil;
|
||||
}
|
||||
|
||||
// TODO: Make sure 'windowController' is a MMWindowController before type
|
||||
// casting.
|
||||
return [(MMWindowController*)windowController vimController];
|
||||
- (MMVimController *)vimController
|
||||
{
|
||||
return [[self windowController] vimController];
|
||||
}
|
||||
|
||||
- (void)startDragTimerWithInterval:(NSTimeInterval)t
|
||||
@@ -1260,12 +1421,63 @@ enum {
|
||||
[data appendBytes:&len length:sizeof(int)];
|
||||
[data appendBytes:chars length:len];
|
||||
|
||||
// TODO: Support 'mousehide' (check p_mh)
|
||||
[NSCursor setHiddenUntilMouseMoves:YES];
|
||||
[self hideMouseCursor];
|
||||
|
||||
//NSLog(@"%s len=%d chars=0x%x", _cmd, len, chars[0]);
|
||||
[[self vimController] sendMessage:KeyDownMsgID data:data];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)hideMouseCursor
|
||||
{
|
||||
// Check 'mousehide' option
|
||||
id mh = [[[self vimController] vimState] objectForKey:@"p_mh"];
|
||||
if (mh && ![mh boolValue])
|
||||
[NSCursor setHiddenUntilMouseMoves:NO];
|
||||
else
|
||||
[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,19 +23,14 @@
|
||||
id backendProxy;
|
||||
BOOL inProcessCommandQueue;
|
||||
NSMutableArray *sendQueue;
|
||||
NSMutableArray *mainMenuItems;
|
||||
NSMutableArray *receiveQueue;
|
||||
NSMenu *mainMenu;
|
||||
NSMutableArray *popupMenuItems;
|
||||
BOOL shouldUpdateMainMenu;
|
||||
NSToolbar *toolbar;
|
||||
NSMutableDictionary *toolbarItemDict;
|
||||
int pid;
|
||||
NSString *serverName;
|
||||
#ifdef MM_RESEND_LAST_FAILURE
|
||||
NSTimer *resendTimer;
|
||||
int resendMsgid;
|
||||
NSData *resendData;
|
||||
#endif
|
||||
NSMenu *lastMenuSearched;
|
||||
NSDictionary *vimState;
|
||||
}
|
||||
|
||||
- (id)initWithBackend:(id)backend pid:(int)processIdentifier;
|
||||
@@ -48,6 +39,8 @@
|
||||
- (void)setServerName:(NSString *)name;
|
||||
- (NSString *)serverName;
|
||||
- (MMWindowController *)windowController;
|
||||
- (NSDictionary *)vimState;
|
||||
- (NSMenu *)mainMenu;
|
||||
- (void)cleanup;
|
||||
- (void)dropFiles:(NSArray *)filenames forceOpen:(BOOL)force;
|
||||
- (void)dropString:(NSString *)string;
|
||||
@@ -58,5 +51,4 @@
|
||||
timeout:(NSTimeInterval)timeout;
|
||||
- (void)addVimInput:(NSString *)string;
|
||||
- (NSString *)evaluateVimExpression:(NSString *)expr;
|
||||
- (void)updateMainMenu;
|
||||
@end
|
||||
|
||||
+571
-406
File diff suppressed because it is too large
Load Diff
@@ -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;
|
||||
|
||||
@@ -129,4 +129,13 @@
|
||||
[super performClose:sender];
|
||||
}
|
||||
|
||||
- (BOOL)validateMenuItem:(NSMenuItem *)item
|
||||
{
|
||||
if ([item action] == @selector(vimMenuItemAction:)
|
||||
|| [item action] == @selector(performClose:))
|
||||
return [item tag];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
@end // MMWindow
|
||||
|
||||
@@ -51,7 +51,6 @@
|
||||
- (void)setFont:(NSFont *)font;
|
||||
- (void)setWideFont:(NSFont *)font;
|
||||
- (void)processCommandQueueDidFinish;
|
||||
- (void)popupMenu:(NSMenu *)menu atRow:(int)row column:(int)col;
|
||||
- (void)showTabBar:(BOOL)on;
|
||||
- (void)showToolbar:(BOOL)on size:(int)size mode:(int)mode;
|
||||
- (void)setMouseShape:(int)shape;
|
||||
@@ -59,7 +58,7 @@
|
||||
- (void)liveResizeWillStart;
|
||||
- (void)liveResizeDidEnd;
|
||||
|
||||
- (void)enterFullscreen;
|
||||
- (void)enterFullscreen:(int)fuoptions backgroundColor:(NSColor *)back;
|
||||
- (void)leaveFullscreen;
|
||||
- (void)setBuffersModified:(BOOL)mod;
|
||||
|
||||
@@ -68,5 +67,9 @@
|
||||
- (IBAction)performClose:(id)sender;
|
||||
- (IBAction)findNext:(id)sender;
|
||||
- (IBAction)findPrevious:(id)sender;
|
||||
- (IBAction)vimMenuItemAction:(id)sender;
|
||||
- (IBAction)vimToolbarItemAction:(id)sender;
|
||||
- (IBAction)fontSizeUp:(id)sender;
|
||||
- (IBAction)fontSizeDown:(id)sender;
|
||||
|
||||
@end
|
||||
|
||||
@@ -76,7 +76,6 @@
|
||||
- (NSSize)constrainContentSizeToScreenSize:(NSSize)contentSize;
|
||||
- (void)updateResizeConstraints;
|
||||
- (NSTabViewItem *)addNewTabViewItem;
|
||||
- (IBAction)vimMenuItemAction:(id)sender;
|
||||
- (BOOL)askBackendForStarRegister:(NSPasteboard *)pb;
|
||||
- (void)hideTablineSeparator:(BOOL)hide;
|
||||
- (void)doFindNext:(BOOL)next;
|
||||
@@ -264,7 +263,7 @@
|
||||
|
||||
- (void)openWindow
|
||||
{
|
||||
[[NSApp delegate] windowControllerWillOpen:self];
|
||||
[[MMAppController sharedInstance] windowControllerWillOpen:self];
|
||||
|
||||
[self addNewTabViewItem];
|
||||
|
||||
@@ -290,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
|
||||
@@ -367,7 +367,9 @@
|
||||
// NOTE: This is called when the transparency changes so set the opacity
|
||||
// flag on the window here (should be faster if the window is opaque).
|
||||
BOOL isOpaque = [back alphaComponent] == 1.0f;
|
||||
[[self window] setOpaque:isOpaque];
|
||||
[decoratedWindow setOpaque:isOpaque];
|
||||
if (fullscreenEnabled)
|
||||
[fullscreenWindow setOpaque:isOpaque];
|
||||
|
||||
[vimView setDefaultColorsBackground:back foreground:fore];
|
||||
}
|
||||
@@ -386,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
|
||||
@@ -410,33 +415,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void)popupMenu:(NSMenu *)menu atRow:(int)row column:(int)col
|
||||
{
|
||||
if (!setupDone) return;
|
||||
|
||||
NSEvent *event;
|
||||
if (row >= 0 && col >= 0) {
|
||||
// TODO: Let textView convert (row,col) to NSPoint.
|
||||
NSSize cellSize = [[vimView textView] cellSize];
|
||||
NSPoint pt = { (col+1)*cellSize.width, (row+1)*cellSize.height };
|
||||
pt = [[vimView textView] convertPoint:pt toView:nil];
|
||||
|
||||
event = [NSEvent mouseEventWithType:NSRightMouseDown
|
||||
location:pt
|
||||
modifierFlags:0
|
||||
timestamp:0
|
||||
windowNumber:[[self window] windowNumber]
|
||||
context:nil
|
||||
eventNumber:0
|
||||
clickCount:0
|
||||
pressure:1.0];
|
||||
} else {
|
||||
event = [[vimView textView] lastMouseDownEvent];
|
||||
}
|
||||
|
||||
[NSMenu popUpContextMenu:menu withEvent:event forView:[vimView textView]];
|
||||
}
|
||||
|
||||
- (void)showTabBar:(BOOL)on
|
||||
{
|
||||
[[vimView tabBarControl] setHidden:!on];
|
||||
@@ -487,43 +465,7 @@
|
||||
|
||||
- (void)setMouseShape:(int)shape
|
||||
{
|
||||
static NSCursor *customIbeamCursor = nil;
|
||||
|
||||
if (!customIbeamCursor) {
|
||||
// Use a custom Ibeam cursor that has better contrast against dark
|
||||
// backgrounds.
|
||||
// TODO: Is the hotspot ok?
|
||||
NSImage *ibeamImage = [NSImage imageNamed:@"ibeam"];
|
||||
if (ibeamImage) {
|
||||
NSSize size = [ibeamImage size];
|
||||
NSPoint hotSpot = { size.width*.5f, size.height*.5f };
|
||||
|
||||
customIbeamCursor = [[NSCursor alloc]
|
||||
initWithImage:ibeamImage hotSpot:hotSpot];
|
||||
}
|
||||
if (!customIbeamCursor) {
|
||||
NSLog(@"WARNING: Failed to load custom Ibeam cursor");
|
||||
customIbeamCursor = [NSCursor IBeamCursor];
|
||||
}
|
||||
}
|
||||
|
||||
// This switch should match mshape_names[] in misc2.c.
|
||||
//
|
||||
// TODO: Add missing cursor shapes.
|
||||
switch (shape) {
|
||||
case 2: [customIbeamCursor set]; break;
|
||||
case 3: case 4: [[NSCursor resizeUpDownCursor] set]; break;
|
||||
case 5: case 6: [[NSCursor resizeLeftRightCursor] set]; break;
|
||||
case 9: [[NSCursor crosshairCursor] set]; break;
|
||||
case 10: [[NSCursor pointingHandCursor] set]; break;
|
||||
case 11: [[NSCursor openHandCursor] set]; break;
|
||||
default:
|
||||
[[NSCursor arrowCursor] set]; break;
|
||||
}
|
||||
|
||||
// Shape 1 indicates that the mouse cursor should be hidden.
|
||||
if (1 == shape)
|
||||
[NSCursor setHiddenUntilMouseMoves:YES];
|
||||
[[vimView textView] setMouseShape:shape];
|
||||
}
|
||||
|
||||
- (void)adjustLinespace:(int)linespace
|
||||
@@ -580,13 +522,13 @@
|
||||
}
|
||||
}
|
||||
|
||||
- (void)enterFullscreen
|
||||
- (void)enterFullscreen:(int)fuoptions backgroundColor:(NSColor *)back
|
||||
{
|
||||
if (fullscreenEnabled) return;
|
||||
|
||||
fullscreenWindow = [[MMFullscreenWindow alloc]
|
||||
initWithWindow:decoratedWindow view:vimView];
|
||||
[fullscreenWindow enterFullscreen];
|
||||
initWithWindow:decoratedWindow view:vimView backgroundColor:back];
|
||||
[fullscreenWindow enterFullscreen:fuoptions];
|
||||
[fullscreenWindow setDelegate:self];
|
||||
fullscreenEnabled = YES;
|
||||
|
||||
@@ -629,11 +571,12 @@
|
||||
|
||||
- (IBAction)performClose:(id)sender
|
||||
{
|
||||
// NOTE: File->Close is bound to this action message instead binding it
|
||||
// directly to the below vim input so that File->Close also works for
|
||||
// auxiliary windows such as the About dialog. (If we were to bind the
|
||||
// below, then <D-w> will not close e.g. the About dialog.)
|
||||
[vimController addVimInput:@"<C-\\><C-N>:conf q<CR>"];
|
||||
// NOTE: With the introduction of :macmenu it is possible to bind
|
||||
// File.Close to ":conf q" but at the same time have it send off the
|
||||
// performClose: action. For this reason we no longer need the CloseMsgID
|
||||
// message. However, we still need File.Close to send performClose:
|
||||
// otherwise Cmd-w will not work on dialogs.
|
||||
[self vimMenuItemAction:sender];
|
||||
}
|
||||
|
||||
- (IBAction)findNext:(id)sender
|
||||
@@ -646,12 +589,64 @@
|
||||
[self doFindNext:NO];
|
||||
}
|
||||
|
||||
- (IBAction)vimMenuItemAction:(id)sender
|
||||
{
|
||||
if (![sender isKindOfClass:[NSMenuItem class]]) return;
|
||||
|
||||
// TODO: Make into category on NSMenuItem which returns descriptor.
|
||||
NSMenuItem *item = (NSMenuItem*)sender;
|
||||
NSMutableArray *desc = [NSMutableArray arrayWithObject:[item title]];
|
||||
|
||||
NSMenu *menu = [item menu];
|
||||
while (menu) {
|
||||
[desc insertObject:[menu title] atIndex:0];
|
||||
menu = [menu supermenu];
|
||||
}
|
||||
|
||||
// The "MainMenu" item is part of the Cocoa menu and should not be part of
|
||||
// the descriptor.
|
||||
if ([[desc objectAtIndex:0] isEqual:@"MainMenu"])
|
||||
[desc removeObjectAtIndex:0];
|
||||
|
||||
NSDictionary *attrs = [NSDictionary dictionaryWithObject:desc
|
||||
forKey:@"descriptor"];
|
||||
[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:
|
||||
[NSNumber numberWithInt:NSSizeUpFontAction]];
|
||||
}
|
||||
|
||||
- (IBAction)fontSizeDown:(id)sender
|
||||
{
|
||||
[[NSFontManager sharedFontManager] modifyFont:
|
||||
[NSNumber numberWithInt:NSSizeDownFontAction]];
|
||||
}
|
||||
|
||||
- (BOOL)validateMenuItem:(NSMenuItem *)item
|
||||
{
|
||||
if ([item action] == @selector(vimMenuItemAction:)
|
||||
|| [item action] == @selector(performClose:))
|
||||
return [item tag];
|
||||
|
||||
return YES;
|
||||
}
|
||||
|
||||
// -- NSWindow delegate ------------------------------------------------------
|
||||
|
||||
- (void)windowDidBecomeMain:(NSNotification *)notification
|
||||
{
|
||||
[vimController updateMainMenu];
|
||||
[[MMAppController sharedInstance] setMainMenu:[vimController mainMenu]];
|
||||
[vimController sendMessage:GotFocusMsgID data:nil];
|
||||
|
||||
if ([vimView textView]) {
|
||||
@@ -714,12 +709,22 @@
|
||||
BOOL zoomBoth = [[NSUserDefaults standardUserDefaults]
|
||||
boolForKey:MMZoomBothKey];
|
||||
|
||||
if ((zoomBoth && !cmdLeftClick) || (!zoomBoth && cmdLeftClick))
|
||||
return frame;
|
||||
if (!((zoomBoth && !cmdLeftClick) || (!zoomBoth && cmdLeftClick))) {
|
||||
// Zoom in horizontal direction only.
|
||||
NSRect currentFrame = [win frame];
|
||||
frame.size.width = currentFrame.size.width;
|
||||
frame.origin.x = currentFrame.origin.x;
|
||||
}
|
||||
|
||||
NSRect currentFrame = [win frame];
|
||||
frame.size.width = currentFrame.size.width;
|
||||
frame.origin.x = currentFrame.origin.x;
|
||||
// HACK! The window frame is often higher than the 'defaultFrame' (the fact
|
||||
// that 'defaultFrame' doesn't cover the entire area up to the menu bar
|
||||
// seems like a Cocoa bug). To ensure that the window doesn't move
|
||||
// downwards when the zoom button is clicked we check for this situation
|
||||
// and return a frame whose max Y coordinate is no lower than the current
|
||||
// max Y coordinate.
|
||||
float delta = NSMaxY([win frame]) - NSMaxY(frame);
|
||||
if (delta > 0)
|
||||
frame.origin.y += delta;
|
||||
|
||||
return frame;
|
||||
}
|
||||
@@ -807,16 +812,6 @@
|
||||
return [vimView addNewTabViewItem];
|
||||
}
|
||||
|
||||
- (IBAction)vimMenuItemAction:(id)sender
|
||||
{
|
||||
int tag = [sender tag];
|
||||
|
||||
NSMutableData *data = [NSMutableData data];
|
||||
[data appendBytes:&tag length:sizeof(int)];
|
||||
|
||||
[vimController sendMessage:ExecuteMenuMsgID data:data];
|
||||
}
|
||||
|
||||
- (BOOL)askBackendForStarRegister:(NSPasteboard *)pb
|
||||
{
|
||||
// TODO: Can this be done with evaluateExpression: instead?
|
||||
|
||||
+33
-2
@@ -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
|
||||
@@ -160,6 +165,9 @@ enum {
|
||||
ODBEditMsgID,
|
||||
XcodeModMsgID,
|
||||
LiveResizeMsgID,
|
||||
EnableAntialiasMsgID,
|
||||
DisableAntialiasMsgID,
|
||||
SetVimStateMsgID,
|
||||
};
|
||||
|
||||
|
||||
@@ -173,6 +181,7 @@ enum {
|
||||
InsertLinesDrawType,
|
||||
DrawCursorDrawType,
|
||||
SetCursorPosDrawType,
|
||||
DrawInvertedRectDrawType,
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -180,6 +189,7 @@ enum {
|
||||
MMInsertionPointHorizontal,
|
||||
MMInsertionPointVertical,
|
||||
MMInsertionPointHollow,
|
||||
MMInsertionPointVerticalRight,
|
||||
};
|
||||
|
||||
|
||||
@@ -224,6 +234,7 @@ extern NSString *MMZoomBothKey;
|
||||
extern NSString *MMCurrentPreferencePaneKey;
|
||||
extern NSString *MMLoginShellCommandKey;
|
||||
extern NSString *MMLoginShellArgumentKey;
|
||||
extern NSString *MMDialogsTrackPwdKey;
|
||||
|
||||
// Enum for MMUntitledWindowKey
|
||||
enum {
|
||||
@@ -235,6 +246,12 @@ enum {
|
||||
|
||||
|
||||
|
||||
|
||||
// Vim pasteboard type (holds motion type + string)
|
||||
extern NSString *VimPBoardType;
|
||||
|
||||
|
||||
|
||||
// Loads all fonts in the Resouces folder of the app bundle and returns a font
|
||||
// container reference (which should be used to deactivate the loaded fonts).
|
||||
ATSFontContainerRef loadFonts();
|
||||
@@ -268,6 +285,21 @@ NSString *buildSearchTextCommand(NSString *searchText);
|
||||
|
||||
|
||||
|
||||
@interface NSDocumentController (MMExtras)
|
||||
- (void)noteNewRecentFilePath:(NSString *)path;
|
||||
@end
|
||||
|
||||
|
||||
|
||||
|
||||
@interface NSDictionary (MMExtras)
|
||||
+ (id)dictionaryWithData:(NSData *)data;
|
||||
- (NSData *)dictionaryAsData;
|
||||
@end
|
||||
|
||||
|
||||
|
||||
|
||||
// ODB Editor Suite Constants (taken from ODBEditorSuite.h)
|
||||
#define keyFileSender 'FSnd'
|
||||
#define keyFileSenderToken 'FTok'
|
||||
@@ -281,4 +313,3 @@ NSString *buildSearchTextCommand(NSString *searchText);
|
||||
|
||||
// MacVim Apple Event Constants
|
||||
#define keyMMUntitledWindow 'MMuw'
|
||||
|
||||
|
||||
@@ -73,6 +73,9 @@ char *MessageStrings[] =
|
||||
"ODBEditMsgID",
|
||||
"XcodeModMsgID",
|
||||
"LiveResizeMsgID",
|
||||
"EnableAntialiasMsgID",
|
||||
"DisableAntialiasMsgID",
|
||||
"SetVimStateMsgID",
|
||||
};
|
||||
|
||||
|
||||
@@ -104,6 +107,13 @@ NSString *MMZoomBothKey = @"MMZoomBoth";
|
||||
NSString *MMCurrentPreferencePaneKey = @"MMCurrentPreferencePane";
|
||||
NSString *MMLoginShellCommandKey = @"MMLoginShellCommand";
|
||||
NSString *MMLoginShellArgumentKey = @"MMLoginShellArgument";
|
||||
NSString *MMDialogsTrackPwdKey = @"MMDialogsTrackPwd";
|
||||
|
||||
|
||||
|
||||
|
||||
// Vim pasteboard type (holds motion type + string)
|
||||
NSString *VimPBoardType = @"VimPBoardType";
|
||||
|
||||
|
||||
|
||||
@@ -285,3 +295,40 @@ buildSearchTextCommand(NSString *searchText)
|
||||
|
||||
@end // NSColor (MMExtras)
|
||||
|
||||
|
||||
|
||||
|
||||
@implementation NSDocumentController (MMExtras)
|
||||
|
||||
- (void)noteNewRecentFilePath:(NSString *)path
|
||||
{
|
||||
NSURL *url = [NSURL fileURLWithPath:path];
|
||||
if (url)
|
||||
[self noteNewRecentDocumentURL:url];
|
||||
}
|
||||
|
||||
@end // NSDocumentController (MMExtras)
|
||||
|
||||
|
||||
|
||||
|
||||
@implementation NSDictionary (MMExtras)
|
||||
|
||||
+ (id)dictionaryWithData:(NSData *)data
|
||||
{
|
||||
id plist = [NSPropertyListSerialization
|
||||
propertyListFromData:data
|
||||
mutabilityOption:NSPropertyListImmutable
|
||||
format:NULL
|
||||
errorDescription:NULL];
|
||||
|
||||
return [plist isKindOfClass:[NSDictionary class]] ? plist : nil;
|
||||
}
|
||||
|
||||
- (NSData *)dictionaryAsData
|
||||
{
|
||||
return [NSPropertyListSerialization dataFromPropertyList:self
|
||||
format:NSPropertyListBinaryFormat_v1_0 errorDescription:NULL];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
@@ -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 = 23;
|
||||
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 = 23;
|
||||
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 = 23;
|
||||
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)
|
||||
@@ -131,7 +131,6 @@
|
||||
8D5B49AF048680CD000E48DA /* Resources */,
|
||||
8D5B49B1048680CD000E48DA /* Sources */,
|
||||
8D5B49B3048680CD000E48DA /* Frameworks */,
|
||||
17ECD3290A3A1A6A009A4BA0 /* ShellScript */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -172,22 +171,6 @@
|
||||
};
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
17ECD3290A3A1A6A009A4BA0 /* ShellScript */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
shellPath = /bin/sh;
|
||||
shellScript = "if [[ -d ~/Oak/Release/Edit\\ in\\ TextMate.bundle && -d ~/Source/TextMate/resources/Edit\\ in\\ TextMate ]]; then\n cp -pR ~/Oak/Release/Edit\\ in\\ TextMate.bundle ~/Source/TextMate/resources/Edit\\ in\\ TextMate\n touch ~/Source/TextMate/resources/Edit\\ in\\ TextMate\nfi";
|
||||
};
|
||||
/* End PBXShellScriptBuildPhase section */
|
||||
|
||||
/* Begin PBXSourcesBuildPhase section */
|
||||
8D5B49B1048680CD000E48DA /* Sources */ = {
|
||||
isa = PBXSourcesBuildPhase;
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<key>CFBundleSignature</key>
|
||||
<string>????</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1.1</string>
|
||||
<string>1.2</string>
|
||||
<key>NSPrincipalClass</key>
|
||||
<string>EditInODBEditor</string>
|
||||
</dict>
|
||||
|
||||
@@ -275,10 +275,10 @@ struct PBX_SelectionRange
|
||||
@"<Unknown>", @"ODBEditorName",
|
||||
nil];
|
||||
|
||||
[defaults registerDefaults:appDefaults];
|
||||
[defaults registerDefaults:appDefaults];
|
||||
|
||||
ODBEditorBundleIdentifier = [defaults stringForKey:@"ODBEditorBundleIdentifier"] ?: @"";
|
||||
ODBEditorName = [defaults stringForKey:@"ODBEditorName"] ?: @"<Unknown>";
|
||||
ODBEditorBundleIdentifier = [[defaults stringForKey:@"ODBEditorBundleIdentifier"] retain] ?: @"";
|
||||
ODBEditorName = [[defaults stringForKey:@"ODBEditorName"] retain] ?: @"<Unknown>";
|
||||
if([defaults boolForKey:@"DisableEditInODBEditorMenuItem"] == NO
|
||||
&& ![ODBEditorBundleIdentifier isEqualToString:@""]
|
||||
&& ![ODBEditorBundleIdentifier isEqualToString:mainBundleIdentifier])
|
||||
|
||||
+388
-168
@@ -32,7 +32,15 @@ static float MMMaxFontSize = 100.0f;
|
||||
|
||||
|
||||
static NSFont *gui_macvim_font_with_name(char_u *name);
|
||||
static BOOL gui_macvim_is_valid_action(NSString *action);
|
||||
static int specialKeyToNSKey(int key);
|
||||
static int vimModMaskToEventModifierFlags(int mods);
|
||||
|
||||
NSArray *descriptor_for_menu(vimmenu_T *menu);
|
||||
vimmenu_T *menu_for_descriptor(NSArray *desc);
|
||||
|
||||
@interface NSString (VimStrings)
|
||||
+ (id)stringWithVimString:(char_u *)s;
|
||||
@end
|
||||
|
||||
|
||||
|
||||
@@ -418,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 ---------------------------------------------------------------
|
||||
|
||||
@@ -480,44 +499,75 @@ clip_mch_own_selection(VimClipboard *cbd)
|
||||
clip_mch_request_selection(VimClipboard *cbd)
|
||||
{
|
||||
NSPasteboard *pb = [NSPasteboard generalPasteboard];
|
||||
NSString *pbType = [pb availableTypeFromArray:
|
||||
[NSArray arrayWithObject:NSStringPboardType]];
|
||||
if (pbType) {
|
||||
NSMutableString *string =
|
||||
NSArray *supportedTypes = [NSArray arrayWithObjects:VimPBoardType,
|
||||
NSStringPboardType, nil];
|
||||
NSString *bestType = [pb availableTypeFromArray:supportedTypes];
|
||||
if (!bestType) return;
|
||||
|
||||
int motion_type = MCHAR;
|
||||
NSString *string = nil;
|
||||
|
||||
if ([bestType isEqual:VimPBoardType]) {
|
||||
// This type should consist of an array with two objects:
|
||||
// 1. motion type (NSNumber)
|
||||
// 2. text (NSString)
|
||||
// If this is not the case we fall back on using NSStringPboardType.
|
||||
id plist = [pb propertyListForType:VimPBoardType];
|
||||
if ([plist isKindOfClass:[NSArray class]] && [plist count] == 2) {
|
||||
id obj = [plist objectAtIndex:1];
|
||||
if ([obj isKindOfClass:[NSString class]]) {
|
||||
motion_type = [[plist objectAtIndex:0] intValue];
|
||||
string = obj;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!string) {
|
||||
// Use NSStringPboardType. The motion type is set to line-wise if the
|
||||
// string contains at least one EOL character, otherwise it is set to
|
||||
// character-wise (block-wise is never used).
|
||||
NSMutableString *mstring =
|
||||
[[pb stringForType:NSStringPboardType] mutableCopy];
|
||||
if (!mstring) return;
|
||||
|
||||
// Replace unrecognized end-of-line sequences with \x0a (line feed).
|
||||
NSRange range = { 0, [string length] };
|
||||
unsigned n = [string replaceOccurrencesOfString:@"\x0d\x0a"
|
||||
NSRange range = { 0, [mstring length] };
|
||||
unsigned n = [mstring replaceOccurrencesOfString:@"\x0d\x0a"
|
||||
withString:@"\x0a" options:0
|
||||
range:range];
|
||||
if (0 == n) {
|
||||
n = [string replaceOccurrencesOfString:@"\x0d" withString:@"\x0a"
|
||||
n = [mstring replaceOccurrencesOfString:@"\x0d" withString:@"\x0a"
|
||||
options:0 range:range];
|
||||
}
|
||||
|
||||
// Scan for newline character to decide whether the string should be
|
||||
// pasted linewise or characterwise.
|
||||
int type = MCHAR;
|
||||
if (0 < n || NSNotFound != [string rangeOfString:@"\n"].location)
|
||||
type = MLINE;
|
||||
// pasted line-wise or character-wise.
|
||||
motion_type = MCHAR;
|
||||
if (0 < n || NSNotFound != [mstring rangeOfString:@"\n"].location)
|
||||
motion_type = MLINE;
|
||||
|
||||
char_u *str = (char_u*)[string UTF8String];
|
||||
int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
|
||||
|
||||
#ifdef FEAT_MBYTE
|
||||
if (input_conv.vc_type != CONV_NONE)
|
||||
str = string_convert(&input_conv, str, &len);
|
||||
#endif
|
||||
|
||||
if (str)
|
||||
clip_yank_selection(type, str, len, cbd);
|
||||
|
||||
#ifdef FEAT_MBYTE
|
||||
if (input_conv.vc_type != CONV_NONE)
|
||||
vim_free(str);
|
||||
#endif
|
||||
string = mstring;
|
||||
}
|
||||
|
||||
if (!(MCHAR == motion_type || MLINE == motion_type || MBLOCK == motion_type
|
||||
|| MAUTO == motion_type))
|
||||
motion_type = MCHAR;
|
||||
|
||||
char_u *str = (char_u*)[string UTF8String];
|
||||
int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
|
||||
|
||||
#ifdef FEAT_MBYTE
|
||||
if (input_conv.vc_type != CONV_NONE)
|
||||
str = string_convert(&input_conv, str, &len);
|
||||
#endif
|
||||
|
||||
if (str)
|
||||
clip_yank_selection(motion_type, str, len, cbd);
|
||||
|
||||
#ifdef FEAT_MBYTE
|
||||
if (input_conv.vc_type != CONV_NONE)
|
||||
vim_free(str);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -534,8 +584,8 @@ clip_mch_set_selection(VimClipboard *cbd)
|
||||
|
||||
// Get the text to put on the pasteboard.
|
||||
long_u llen = 0; char_u *str = 0;
|
||||
int type = clip_convert_selection(&str, &llen, cbd);
|
||||
if (type < 0)
|
||||
int motion_type = clip_convert_selection(&str, &llen, cbd);
|
||||
if (motion_type < 0)
|
||||
return;
|
||||
|
||||
// TODO: Avoid overflow.
|
||||
@@ -554,9 +604,16 @@ clip_mch_set_selection(VimClipboard *cbd)
|
||||
NSString *string = [[NSString alloc]
|
||||
initWithBytes:str length:len encoding:NSUTF8StringEncoding];
|
||||
|
||||
// See clip_mch_request_selection() for info on pasteboard types.
|
||||
NSPasteboard *pb = [NSPasteboard generalPasteboard];
|
||||
[pb declareTypes:[NSArray arrayWithObject:NSStringPboardType]
|
||||
owner:nil];
|
||||
NSArray *supportedTypes = [NSArray arrayWithObjects:VimPBoardType,
|
||||
NSStringPboardType, nil];
|
||||
[pb declareTypes:supportedTypes owner:nil];
|
||||
|
||||
NSNumber *motion = [NSNumber numberWithInt:motion_type];
|
||||
NSArray *plist = [NSArray arrayWithObjects:motion, string, nil];
|
||||
[pb setPropertyList:plist forType:VimPBoardType];
|
||||
|
||||
[pb setString:string forType:NSStringPboardType];
|
||||
|
||||
[string release];
|
||||
@@ -570,34 +627,61 @@ clip_mch_set_selection(VimClipboard *cbd)
|
||||
|
||||
|
||||
/*
|
||||
* Add a sub menu to the menu bar.
|
||||
* A menu descriptor represents the "address" of a menu as an array of strings.
|
||||
* E.g. the menu "File->Close" has descriptor { "File", "Close" }.
|
||||
*/
|
||||
NSArray *
|
||||
descriptor_for_menu(vimmenu_T *menu)
|
||||
{
|
||||
if (!menu) return nil;
|
||||
|
||||
NSMutableArray *desc = [NSMutableArray array];
|
||||
while (menu) {
|
||||
NSString *name = [NSString stringWithVimString:menu->dname];
|
||||
[desc insertObject:name atIndex:0];
|
||||
menu = menu->parent;
|
||||
}
|
||||
|
||||
return desc;
|
||||
}
|
||||
|
||||
vimmenu_T *
|
||||
menu_for_descriptor(NSArray *desc)
|
||||
{
|
||||
if (!(desc && [desc count] > 0)) return NULL;
|
||||
|
||||
vimmenu_T *menu = root_menu;
|
||||
int i, count = [desc count];
|
||||
|
||||
for (i = 0; i < count; ++i) {
|
||||
NSString *component = [desc objectAtIndex:i];
|
||||
while (menu) {
|
||||
NSString *name = [NSString stringWithVimString:menu->dname];
|
||||
if ([component isEqual:name]) {
|
||||
if (i+1 == count)
|
||||
return menu; // Matched all components, so return menu
|
||||
menu = menu->children;
|
||||
break;
|
||||
}
|
||||
menu = menu->next;
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add a submenu to the menu bar, toolbar, or a popup menu.
|
||||
*/
|
||||
void
|
||||
gui_mch_add_menu(vimmenu_T *menu, int idx)
|
||||
{
|
||||
// HACK! If menu has no parent, then we set the parent tag to the type of
|
||||
// menu it is. This will not mix up tag and type because pointers can not
|
||||
// take values close to zero (and the tag is simply the value of the
|
||||
// pointer).
|
||||
int parent = (int)menu->parent;
|
||||
if (!parent) {
|
||||
parent = menu_is_popup(menu->name) ? MenuPopupType :
|
||||
menu_is_toolbar(menu->name) ? MenuToolbarType :
|
||||
MenuMenubarType;
|
||||
}
|
||||
|
||||
char_u *dname = menu->dname;
|
||||
#ifdef FEAT_MBYTE
|
||||
dname = CONVERT_TO_UTF8(dname);
|
||||
#endif
|
||||
|
||||
[[MMBackend sharedInstance]
|
||||
addMenuWithTag:(int)menu parent:parent name:(char*)dname
|
||||
atIndex:idx];
|
||||
|
||||
#ifdef FEAT_MBYTE
|
||||
CONVERT_TO_UTF8_FREE(dname);
|
||||
#endif
|
||||
NSArray *desc = descriptor_for_menu(menu);
|
||||
[[MMBackend sharedInstance] queueMessage:AddMenuMsgID properties:
|
||||
[NSDictionary dictionaryWithObjectsAndKeys:
|
||||
desc, @"descriptor",
|
||||
[NSNumber numberWithInt:idx], @"index",
|
||||
nil]];
|
||||
}
|
||||
|
||||
|
||||
@@ -607,60 +691,37 @@ 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 *name = menu_is_separator(menu->name) ? NULL : (char*)menu->dname;
|
||||
char_u *name = menu->dname;
|
||||
char_u *tip = menu->strings[MENU_INDEX_TIP]
|
||||
? menu->strings[MENU_INDEX_TIP] : menu->actext;
|
||||
char_u *map_str = menu->strings[MENU_INDEX_NORMAL];
|
||||
NSArray *desc = descriptor_for_menu(menu);
|
||||
NSString *keyEquivalent = menu->mac_key
|
||||
? [NSString stringWithFormat:@"%C", specialKeyToNSKey(menu->mac_key)]
|
||||
: [NSString string];
|
||||
int modifierMask = vimModMaskToEventModifierFlags(menu->mac_mods);
|
||||
char_u *icon = NULL;
|
||||
|
||||
#ifdef FEAT_MBYTE
|
||||
icon = CONVERT_TO_UTF8(icon);
|
||||
name = CONVERT_TO_UTF8(name);
|
||||
tip = CONVERT_TO_UTF8(tip);
|
||||
map_str = CONVERT_TO_UTF8(map_str);
|
||||
#endif
|
||||
if (menu_is_toolbar(menu->parent->name)) {
|
||||
char_u fname[MAXPATHL];
|
||||
|
||||
// HACK! Check if menu is mapped to ':macaction actionName:'; if so, pass
|
||||
// the action along so that MacVim can bind the menu item to this action.
|
||||
// This means that if a menu item maps to an action in normal mode, then
|
||||
// all other modes will also use the same action.
|
||||
NSString *action = nil;
|
||||
if (map_str) {
|
||||
NSString *mapping = [NSString stringWithCString:(char*)map_str
|
||||
encoding:NSUTF8StringEncoding];
|
||||
NSArray *parts = [mapping componentsSeparatedByString:@" "];
|
||||
if ([parts count] >=2
|
||||
&& [[parts objectAtIndex:0] hasPrefix:@":maca"]) {
|
||||
action = [parts objectAtIndex:1];
|
||||
action = [action stringByTrimmingCharactersInSet:
|
||||
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
|
||||
if (!gui_macvim_is_valid_action(action))
|
||||
action = nil;
|
||||
}
|
||||
// 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]
|
||||
addMenuItemWithTag:(int)menu
|
||||
parent:(int)menu->parent
|
||||
name:(char*)name
|
||||
tip:(char*)tip
|
||||
icon:(char*)icon
|
||||
keyEquivalent:menu->mac_key
|
||||
modifiers:menu->mac_mods
|
||||
action:action
|
||||
atIndex:idx];
|
||||
|
||||
#ifdef FEAT_MBYTE
|
||||
CONVERT_TO_UTF8_FREE(icon);
|
||||
CONVERT_TO_UTF8_FREE(name);
|
||||
CONVERT_TO_UTF8_FREE(tip);
|
||||
CONVERT_TO_UTF8_FREE(map_str);
|
||||
#endif
|
||||
[[MMBackend sharedInstance] queueMessage:AddMenuItemMsgID properties:
|
||||
[NSDictionary dictionaryWithObjectsAndKeys:
|
||||
desc, @"descriptor",
|
||||
[NSNumber numberWithInt:idx], @"index",
|
||||
[NSString stringWithVimString:tip], @"tip",
|
||||
[NSString stringWithVimString:icon], @"icon",
|
||||
keyEquivalent, @"keyEquivalent",
|
||||
[NSNumber numberWithInt:modifierMask], @"modifierMask",
|
||||
[NSString stringWithVimString:menu->mac_action], @"action",
|
||||
[NSNumber numberWithBool:menu->mac_alternate], @"isAlternate",
|
||||
nil]];
|
||||
}
|
||||
|
||||
|
||||
@@ -670,7 +731,9 @@ gui_mch_add_menu_item(vimmenu_T *menu, int idx)
|
||||
void
|
||||
gui_mch_destroy_menu(vimmenu_T *menu)
|
||||
{
|
||||
[[MMBackend sharedInstance] removeMenuItemWithTag:(int)menu];
|
||||
NSArray *desc = descriptor_for_menu(menu);
|
||||
[[MMBackend sharedInstance] queueMessage:RemoveMenuItemMsgID properties:
|
||||
[NSDictionary dictionaryWithObject:desc forKey:@"descriptor"]];
|
||||
}
|
||||
|
||||
|
||||
@@ -683,12 +746,17 @@ gui_mch_menu_grey(vimmenu_T *menu, int grey)
|
||||
/* Only update menu if the 'grey' state has changed to avoid having to pass
|
||||
* lots of unnecessary data to MacVim. (Skipping this test makes MacVim
|
||||
* pause noticably on mode changes. */
|
||||
if (menu->was_grey != grey)
|
||||
{
|
||||
menu->was_grey = grey;
|
||||
[[MMBackend sharedInstance]
|
||||
enableMenuItemWithTag:(int)menu state:!grey];
|
||||
}
|
||||
NSArray *desc = descriptor_for_menu(menu);
|
||||
if (menu->was_grey == grey)
|
||||
return;
|
||||
|
||||
menu->was_grey = grey;
|
||||
|
||||
[[MMBackend sharedInstance] queueMessage:EnableMenuItemMsgID properties:
|
||||
[NSDictionary dictionaryWithObjectsAndKeys:
|
||||
desc, @"descriptor",
|
||||
[NSNumber numberWithInt:!grey], @"enable",
|
||||
nil]];
|
||||
}
|
||||
|
||||
|
||||
@@ -710,18 +778,9 @@ gui_mch_menu_hidden(vimmenu_T *menu, int hidden)
|
||||
void
|
||||
gui_mch_show_popupmenu(vimmenu_T *menu)
|
||||
{
|
||||
char_u *name = menu->name;
|
||||
#ifdef FEAT_MBYTE
|
||||
name = CONVERT_TO_UTF8(name);
|
||||
#endif
|
||||
|
||||
[[MMBackend sharedInstance] showPopupMenuWithName:(char*)name
|
||||
atMouseLocation:YES];
|
||||
|
||||
#ifdef FEAT_MBYTE
|
||||
CONVERT_TO_UTF8_FREE(name);
|
||||
#endif
|
||||
|
||||
NSArray *desc = descriptor_for_menu(menu);
|
||||
[[MMBackend sharedInstance] queueMessage:ShowPopupMenuMsgID properties:
|
||||
[NSDictionary dictionaryWithObject:desc forKey:@"descriptor"]];
|
||||
}
|
||||
|
||||
|
||||
@@ -731,16 +790,19 @@ gui_mch_show_popupmenu(vimmenu_T *menu)
|
||||
void
|
||||
gui_make_popup(char_u *path_name, int mouse_pos)
|
||||
{
|
||||
#ifdef FEAT_MBYTE
|
||||
path_name = CONVERT_TO_UTF8(path_name);
|
||||
#endif
|
||||
vimmenu_T *menu = gui_find_menu(path_name);
|
||||
if (!(menu && menu->children)) return;
|
||||
|
||||
[[MMBackend sharedInstance] showPopupMenuWithName:(char*)path_name
|
||||
atMouseLocation:mouse_pos];
|
||||
NSArray *desc = descriptor_for_menu(menu);
|
||||
NSDictionary *p = (mouse_pos || NULL == curwin)
|
||||
? [NSDictionary dictionaryWithObject:desc forKey:@"descriptor"]
|
||||
: [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
desc, @"descriptor",
|
||||
[NSNumber numberWithInt:curwin->w_wrow], @"row",
|
||||
[NSNumber numberWithInt:curwin->w_wcol], @"column",
|
||||
nil];
|
||||
|
||||
#ifdef FEAT_MBYTE
|
||||
CONVERT_TO_UTF8_FREE(path_name);
|
||||
#endif
|
||||
[[MMBackend sharedInstance] queueMessage:ShowPopupMenuMsgID properties:p];
|
||||
}
|
||||
|
||||
|
||||
@@ -1029,11 +1091,24 @@ gui_mch_draw_part_cursor(int w, int h, guicolor_T color)
|
||||
// font dimensions. Thus these parameters are useless. Instead we look at
|
||||
// the shape_table to determine the shape and size of the cursor (just like
|
||||
// gui_update_cursor() does).
|
||||
|
||||
#ifdef FEAT_RIGHTLEFT
|
||||
// If 'rl' is set the insert mode cursor must be drawn on the right-hand
|
||||
// side of a text cell.
|
||||
int rl = curwin ? curwin->w_p_rl : FALSE;
|
||||
#else
|
||||
int rl = FALSE;
|
||||
#endif
|
||||
int idx = get_shape_idx(FALSE);
|
||||
int shape = MMInsertionPointBlock;
|
||||
switch (shape_table[idx].shape) {
|
||||
case SHAPE_HOR: shape = MMInsertionPointHorizontal; break;
|
||||
case SHAPE_VER: shape = MMInsertionPointVertical; break;
|
||||
case SHAPE_HOR:
|
||||
shape = MMInsertionPointHorizontal;
|
||||
break;
|
||||
case SHAPE_VER:
|
||||
shape = rl ? MMInsertionPointVerticalRight
|
||||
: MMInsertionPointVertical;
|
||||
break;
|
||||
}
|
||||
|
||||
return [[MMBackend sharedInstance]
|
||||
@@ -1165,12 +1240,12 @@ ex_macaction(eap)
|
||||
arg = CONVERT_TO_UTF8(arg);
|
||||
#endif
|
||||
|
||||
NSString *name = [NSString stringWithCString:(char*)arg
|
||||
encoding:NSUTF8StringEncoding];
|
||||
if (gui_macvim_is_valid_action(name)) {
|
||||
NSDictionary *actionDict = [[MMBackend sharedInstance] actionDict];
|
||||
NSString *name = [NSString stringWithUTF8String:(char*)arg];
|
||||
if (actionDict && [actionDict objectForKey:name] != nil) {
|
||||
[[MMBackend sharedInstance] executeActionWithName:name];
|
||||
} else {
|
||||
EMSG2(_("E???: \"%s\" is not a valid action"), eap->arg);
|
||||
EMSG2(_("E???: Invalid action: %s"), eap->arg);
|
||||
}
|
||||
|
||||
#ifdef FEAT_MBYTE
|
||||
@@ -1229,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);
|
||||
@@ -1262,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);
|
||||
@@ -1391,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.
|
||||
@@ -1475,32 +1547,11 @@ gui_mch_toggle_tearoffs(int enable)
|
||||
}
|
||||
|
||||
|
||||
static BOOL
|
||||
gui_macvim_is_valid_action(NSString *action)
|
||||
{
|
||||
static NSDictionary *actionDict = nil;
|
||||
|
||||
if (!actionDict) {
|
||||
NSBundle *mainBundle = [NSBundle mainBundle];
|
||||
NSString *path = [mainBundle pathForResource:@"Actions"
|
||||
ofType:@"plist"];
|
||||
if (path) {
|
||||
actionDict = [[NSDictionary alloc] initWithContentsOfFile:path];
|
||||
} else {
|
||||
// Allocate bogus dictionary so that error only pops up once.
|
||||
actionDict = [NSDictionary new];
|
||||
EMSG(_("E???: Failed to load action dictionary"));
|
||||
}
|
||||
}
|
||||
|
||||
return [actionDict objectForKey:action] != nil;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gui_mch_enter_fullscreen()
|
||||
gui_mch_enter_fullscreen(int fuoptions_flags, guicolor_T bg)
|
||||
{
|
||||
[[MMBackend sharedInstance] enterFullscreen];
|
||||
[[MMBackend sharedInstance] enterFullscreen:fuoptions_flags background:bg];
|
||||
}
|
||||
|
||||
|
||||
@@ -1542,6 +1593,13 @@ gui_macvim_add_to_find_pboard(char_u *pat)
|
||||
[pb setString:s forType:NSStringPboardType];
|
||||
}
|
||||
|
||||
void
|
||||
gui_macvim_set_antialias(int antialias)
|
||||
{
|
||||
[[MMBackend sharedInstance] setAntialias:antialias];
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1827,3 +1885,165 @@ odb_end(void)
|
||||
}
|
||||
|
||||
#endif // FEAT_ODB_EDITOR
|
||||
|
||||
|
||||
char_u *
|
||||
get_macaction_name(expand_T *xp, int idx)
|
||||
{
|
||||
static char_u *str = NULL;
|
||||
NSDictionary *actionDict = [[MMBackend sharedInstance] actionDict];
|
||||
|
||||
if (nil == actionDict || idx < 0 || idx >= [actionDict count])
|
||||
return NULL;
|
||||
|
||||
NSString *string = [[actionDict allKeys] objectAtIndex:idx];
|
||||
if (!string)
|
||||
return NULL;
|
||||
|
||||
char_u *plainStr = (char_u*)[string UTF8String];
|
||||
|
||||
#ifdef FEAT_MBYTE
|
||||
if (str) {
|
||||
vim_free(str);
|
||||
str = NULL;
|
||||
}
|
||||
if (input_conv.vc_type != CONV_NONE) {
|
||||
int len = [string lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
|
||||
str = string_convert(&input_conv, plainStr, &len);
|
||||
plainStr = str;
|
||||
}
|
||||
#endif
|
||||
|
||||
return plainStr;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
is_valid_macaction(char_u *action)
|
||||
{
|
||||
int isValid = NO;
|
||||
NSDictionary *actionDict = [[MMBackend sharedInstance] actionDict];
|
||||
if (actionDict) {
|
||||
#ifdef FEAT_MBYTE
|
||||
action = CONVERT_TO_UTF8(action);
|
||||
#endif
|
||||
NSString *string = [NSString stringWithUTF8String:(char*)action];
|
||||
isValid = (nil != [actionDict objectForKey:string]);
|
||||
#ifdef FEAT_MBYTE
|
||||
CONVERT_TO_UTF8_FREE(action);
|
||||
#endif
|
||||
}
|
||||
|
||||
return isValid;
|
||||
}
|
||||
|
||||
static int specialKeyToNSKey(int key)
|
||||
{
|
||||
if (!IS_SPECIAL(key))
|
||||
return key;
|
||||
|
||||
static struct {
|
||||
int special;
|
||||
int nskey;
|
||||
} sp2ns[] = {
|
||||
{ K_UP, NSUpArrowFunctionKey },
|
||||
{ K_DOWN, NSDownArrowFunctionKey },
|
||||
{ K_LEFT, NSLeftArrowFunctionKey },
|
||||
{ K_RIGHT, NSRightArrowFunctionKey },
|
||||
{ K_F1, NSF1FunctionKey },
|
||||
{ K_F2, NSF2FunctionKey },
|
||||
{ K_F3, NSF3FunctionKey },
|
||||
{ K_F4, NSF4FunctionKey },
|
||||
{ K_F5, NSF5FunctionKey },
|
||||
{ K_F6, NSF6FunctionKey },
|
||||
{ K_F7, NSF7FunctionKey },
|
||||
{ K_F8, NSF8FunctionKey },
|
||||
{ K_F9, NSF9FunctionKey },
|
||||
{ K_F10, NSF10FunctionKey },
|
||||
{ K_F11, NSF11FunctionKey },
|
||||
{ K_F12, NSF12FunctionKey },
|
||||
{ K_F13, NSF13FunctionKey },
|
||||
{ K_F14, NSF14FunctionKey },
|
||||
{ K_F15, NSF15FunctionKey },
|
||||
{ K_F16, NSF16FunctionKey },
|
||||
{ K_F17, NSF17FunctionKey },
|
||||
{ K_F18, NSF18FunctionKey },
|
||||
{ K_F19, NSF19FunctionKey },
|
||||
{ K_F20, NSF20FunctionKey },
|
||||
{ K_F21, NSF21FunctionKey },
|
||||
{ K_F22, NSF22FunctionKey },
|
||||
{ K_F23, NSF23FunctionKey },
|
||||
{ K_F24, NSF24FunctionKey },
|
||||
{ K_F25, NSF25FunctionKey },
|
||||
{ K_F26, NSF26FunctionKey },
|
||||
{ K_F27, NSF27FunctionKey },
|
||||
{ K_F28, NSF28FunctionKey },
|
||||
{ K_F29, NSF29FunctionKey },
|
||||
{ K_F30, NSF30FunctionKey },
|
||||
{ K_F31, NSF31FunctionKey },
|
||||
{ K_F32, NSF32FunctionKey },
|
||||
{ K_F33, NSF33FunctionKey },
|
||||
{ K_F34, NSF34FunctionKey },
|
||||
{ K_F35, NSF35FunctionKey },
|
||||
{ K_DEL, NSBackspaceCharacter },
|
||||
{ K_BS, NSDeleteCharacter },
|
||||
{ K_HOME, NSHomeFunctionKey },
|
||||
{ K_END, NSEndFunctionKey },
|
||||
{ K_PAGEUP, NSPageUpFunctionKey },
|
||||
{ K_PAGEDOWN, NSPageDownFunctionKey }
|
||||
};
|
||||
|
||||
int i;
|
||||
for (i = 0; i < sizeof(sp2ns)/sizeof(sp2ns[0]); ++i) {
|
||||
if (sp2ns[i].special == key)
|
||||
return sp2ns[i].nskey;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vimModMaskToEventModifierFlags(int mods)
|
||||
{
|
||||
int flags = 0;
|
||||
|
||||
if (mods & MOD_MASK_SHIFT)
|
||||
flags |= NSShiftKeyMask;
|
||||
if (mods & MOD_MASK_CTRL)
|
||||
flags |= NSControlKeyMask;
|
||||
if (mods & MOD_MASK_ALT)
|
||||
flags |= NSAlternateKeyMask;
|
||||
if (mods & MOD_MASK_CMD)
|
||||
flags |= NSCommandKeyMask;
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@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
|
||||
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 != nil ? string : [NSString string];
|
||||
}
|
||||
@end
|
||||
|
||||
+73
-54
@@ -1,7 +1,7 @@
|
||||
" System gvimrc file for MacVim
|
||||
"
|
||||
" Maintainer: Bjorn Winckler <bjorn.winckler@gmail.com>
|
||||
" Last Change: Thu Mar 6 2008
|
||||
" Last Change: Sun May 19 2008
|
||||
"
|
||||
" This is a work in progress. If you feel so inclined, please help me improve
|
||||
" this file.
|
||||
@@ -42,13 +42,15 @@ aunmenu File.-SEP4-
|
||||
aunmenu File.Exit
|
||||
aunmenu File.Save-Exit
|
||||
|
||||
an <silent> 10.290 File.New\ Window :maca newWindow:<CR>
|
||||
an <silent> 10.290 File.New\ Window <Nop>
|
||||
an 10.295 File.New\ Tab :tabnew<CR>
|
||||
an <silent> 10.310 File.&Open\.\.\. :maca fileOpen:<CR>
|
||||
an <silent> 10.310 File.Open\.\.\. <Nop>
|
||||
an <silent> 10.325 File.Open\ Recent <Nop>
|
||||
an 10.328 File.-SEP0- <Nop>
|
||||
an <silent> 10.330 File.Close\ Window<Tab>:qa :confirm qa<CR>
|
||||
an <silent> 10.331 File.Close :maca performClose:<CR>
|
||||
"an 10.331 File.Close\ Tab :tabclose<CR>
|
||||
an <silent> 10.330 File.Close\ Window<Tab>:qa :conf qa<CR>
|
||||
an <silent> 10.332 File.Close :conf q<CR>
|
||||
an <silent> 10.341 File.Save\ All :browse conf wa<CR>
|
||||
an 10.350 File.Save\ As\.\.\.<Tab>:sav :browse confirm saveas<CR>
|
||||
|
||||
|
||||
" Edit menu
|
||||
@@ -57,8 +59,8 @@ aunmenu Edit.Find
|
||||
aunmenu Edit.Find\ and\ Replace
|
||||
|
||||
an 20.410.10 Edit.Find.Find\.\.\.<Tab>/ /
|
||||
an 20.410.20 Edit.Find.Find\ Next :maca findNext:<CR>
|
||||
an 20.410.30 Edit.Find.Find\ Previous :maca findPrevious:<CR>
|
||||
an 20.410.20 Edit.Find.Find\ Next <Nop>
|
||||
an 20.410.30 Edit.Find.Find\ Previous <Nop>
|
||||
vmenu 20.410.35 Edit.Find.Use\ Selection\ for\ Find y:let @/=@"<CR>n
|
||||
an 20.410.40 Edit.Find.-SEP1- <Nop>
|
||||
an 20.410.50 Edit.Find.Find\ and\ Replace\.\.\.<Tab>:%s :%s/
|
||||
@@ -66,27 +68,34 @@ vunmenu Edit.Find.Find\ and\ Replace\.\.\.<Tab>:%s
|
||||
vnoremenu Edit.Find.Find\ and\ Replace\.\.\.<Tab>:s :s/
|
||||
|
||||
an 20.460 Edit.-SEP4- <Nop>
|
||||
an 20.465.10 Edit.Font.Show\ Fonts :maca orderFrontFontPanel:<CR>
|
||||
an 20.465.10 Edit.Font.Show\ Fonts <Nop>
|
||||
an 20.465.20 Edit.Font.-SEP5- <Nop>
|
||||
an 20.465.30 Edit.Font.Bigger :maca fontSizeUp:<CR>
|
||||
an 20.465.40 Edit.Font.Smaller :maca fontSizeDown:<CR>
|
||||
an 20.470 Edit.Special\ Characters\.\.\. :maca orderFrontCharacterPalette:<CR>
|
||||
an 20.465.30 Edit.Font.Bigger <Nop>
|
||||
an 20.465.40 Edit.Font.Smaller <Nop>
|
||||
an 20.470 Edit.Special\ Characters\.\.\. <Nop>
|
||||
|
||||
|
||||
" Window menu (should be next to Help so give it a high priority)
|
||||
aunmenu Window
|
||||
|
||||
an <silent> 9900.300 Window.Minimize :maca performMiniaturize:<CR>
|
||||
an <silent> 9900.310 Window.Zoom :maca performZoom:<CR>
|
||||
an <silent> 9900.300 Window.Minimize <Nop>
|
||||
an <silent> 9900.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 9900.330 Window.-SEP1- <Nop>
|
||||
" TODO! Grey out if no tabs are visible.
|
||||
an <silent> 9900.340 Window.Previous\ Tab :tabprevious<CR>
|
||||
an <silent> 9900.350 Window.Next\ Tab :tabnext<CR>
|
||||
an 9900.360 Window.-SEP2- <Nop>
|
||||
an <silent> 9900.370 Window.Bring\ All\ To\ Front :maca arrangeInFront:<CR>
|
||||
an <silent> 9900.370 Window.Bring\ All\ To\ Front <Nop>
|
||||
|
||||
|
||||
" Help menu
|
||||
an 9999.1 Help.MacVim\ Help :h gui_mac<CR>
|
||||
an <silent> 9999.2 Help.MacVim\ Website <Nop>
|
||||
an 9999.3 Help.-sep0- <Nop>
|
||||
|
||||
|
||||
"
|
||||
" Toolbar
|
||||
@@ -183,51 +192,61 @@ endif " exists("macvim_hig_shift_movement")
|
||||
|
||||
|
||||
"
|
||||
" Menu key equivalents (these should always have the 'D' modifier set)
|
||||
" Set up menu key equivalents (these should always have the 'D' modifier set),
|
||||
" action bindings, and alternate items.
|
||||
"
|
||||
" Note: menu items which should execute an action are bound to <Nop>; the
|
||||
" action message is specified here via the :macmenu command.
|
||||
"
|
||||
|
||||
macmenukey File.New\ Window <D-n>
|
||||
macmenukey File.New\ Tab <D-t>
|
||||
macm File.New\ Window key=<D-n> action=newWindow:
|
||||
macm File.New\ Tab key=<D-t>
|
||||
macm File.Open\.\.\. key=<D-o> action=fileOpen:
|
||||
macm File.Open\ Tab\.\.\. key=<D-T>
|
||||
macm File.Open\ Recent action=recentFilesDummy:
|
||||
macm File.Close\ Window key=<D-W>
|
||||
macm File.Close key=<D-w> action=performClose:
|
||||
macm File.Save key=<D-s>
|
||||
macm File.Save\ All key=<D-M-s> alt=YES
|
||||
macm File.Save\ As\.\.\. key=<D-S>
|
||||
macm File.Print key=<D-p>
|
||||
|
||||
macmenukey File.Open\.\.\. <D-o>
|
||||
macmenukey File.Open\ Tab\.\.\. <D-T>
|
||||
macmenukey File.Close\ Window <D-W>
|
||||
"macmenukey File.Close\ Tab <D-w>
|
||||
macmenukey File.Close <D-w>
|
||||
macmenukey File.Save <D-s>
|
||||
macmenukey File.Save\ As\.\.\. <D-S>
|
||||
macmenukey File.Print <D-p>
|
||||
macm Edit.Undo key=<D-z> action=undo:
|
||||
macm Edit.Redo key=<D-Z> action=redo:
|
||||
macm Edit.Cut key=<D-x> action=cut:
|
||||
macm Edit.Copy key=<D-c> action=copy:
|
||||
macm Edit.Paste key=<D-v> action=paste:
|
||||
macm Edit.Select\ All key=<D-a> action=selectAll:
|
||||
macm Edit.Find.Find\.\.\. key=<D-f>
|
||||
macm Edit.Find.Find\ Next key=<D-g> action=findNext:
|
||||
macm Edit.Find.Find\ Previous key=<D-G> action=findPrevious:
|
||||
macm Edit.Find.Use\ Selection\ for\ Find key=<D-e>
|
||||
macm Edit.Special\ Characters\.\.\. key=<D-M-t>
|
||||
macm Edit.Font.Show\ Fonts action=orderFrontFontPanel:
|
||||
macm Edit.Font.Bigger key=<D-=> action=fontSizeUp:
|
||||
macm Edit.Font.Smaller key=<D--> action=fontSizeDown:
|
||||
macm Edit.Special\ Characters\.\.\. action=orderFrontCharacterPalette:
|
||||
|
||||
macmenukey Edit.Undo <D-z>
|
||||
macmenukey Edit.Redo <D-Z>
|
||||
macmenukey Edit.Cut <D-x>
|
||||
macmenukey Edit.Copy <D-c>
|
||||
macmenukey Edit.Paste <D-v>
|
||||
macmenukey Edit.Select\ All <D-a>
|
||||
macmenukey Edit.Find.Find\.\.\. <D-f>
|
||||
macmenukey Edit.Find.Find\ Next <D-g>
|
||||
macmenukey Edit.Find.Find\ Previous <D-G>
|
||||
macmenukey Edit.Find.Use\ Selection\ for\ Find <D-e>
|
||||
macmenukey Edit.Special\ Characters\.\.\. <D-M-t>
|
||||
macmenukey Edit.Font.Bigger <D-=>
|
||||
macmenukey Edit.Font.Smaller <D-->
|
||||
macm Tools.Spelling.To\ Next\ error key=<D-;>
|
||||
macm Tools.Spelling.Suggest\ Corrections key=<D-:>
|
||||
macm Tools.Make key=<D-b>
|
||||
macm Tools.List\ Errors key=<D-l>
|
||||
macm Tools.List\ Messages key=<D-L>
|
||||
macm Tools.Next\ Error key=<D-C-Right>
|
||||
macm Tools.Previous\ Error key=<D-C-Left>
|
||||
macm Tools.Older\ List key=<D-C-Up>
|
||||
macm Tools.Newer\ List key=<D-C-Down>
|
||||
|
||||
macmenukey Tools.Spelling.To\ Next\ error <D-;>
|
||||
macmenukey Tools.Spelling.Suggest\ Corrections <D-:>
|
||||
macmenukey Tools.Make <D-b>
|
||||
macmenukey Tools.List\ Errors <D-l>
|
||||
macmenukey Tools.List\ Messages <D-L>
|
||||
macmenukey Tools.Next\ Error <D-C-Right>
|
||||
macmenukey Tools.Previous\ Error <D-C-Left>
|
||||
macmenukey Tools.Older\ List <D-C-Up>
|
||||
macmenukey Tools.Newer\ List <D-C-Down>
|
||||
|
||||
macmenukey Window.Minimize <D-m>
|
||||
macmenukey Window.Zoom <D-C-z>
|
||||
macmenukey Window.Toggle\ Full\ Screen\ Mode <D-F>
|
||||
macmenukey Window.Previous\ Tab <D-{>
|
||||
macmenukey Window.Next\ Tab <D-}>
|
||||
macm Window.Minimize key=<D-m> action=performMiniaturize:
|
||||
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.Previous\ Tab key=<D-{>
|
||||
macm Window.Next\ Tab key=<D-}>
|
||||
macm Window.Bring\ All\ To\ Front action=arrangeInFront:
|
||||
|
||||
macm Help.MacVim\ Website action=openWebsite:
|
||||
|
||||
" Restore the previous value of 'cpoptions'.
|
||||
let &cpo = s:cpo_save
|
||||
|
||||
@@ -40,6 +40,265 @@
|
||||
Sparkle supports updates in zip, tar, tbz, tgz, or dmg format.
|
||||
-->
|
||||
|
||||
<item>
|
||||
<title>Snapshot 32 released</title>
|
||||
<description><![CDATA[
|
||||
<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> 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>
|
||||
<li> insert mode cursor honors the 'rightleft' option </li>
|
||||
<li> no more "freezes" during :shell </li>
|
||||
<li> no beeping on Cmd-q </li>
|
||||
<li> Cmd-w works in full-screen again </li>
|
||||
<li> window dimensions properly restored when leaving full-screen when
|
||||
"maxvert" is in 'fuoptions' </li>
|
||||
<li> support for 'mousehide' option </li>
|
||||
<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, 8 Jun 2008 16:43 CET</pubDate>
|
||||
<enclosure type="application/octet-stream"
|
||||
url="http://macvim.googlecode.com/files/MacVim-snapshot-30.tbz"
|
||||
length="8137308"
|
||||
sparkle:version="30"
|
||||
sparkle:shortVersionString="7.1"
|
||||
/>
|
||||
</item>
|
||||
|
||||
|
||||
<item>
|
||||
<title>Snapshot 28 released</title>
|
||||
<description><![CDATA[
|
||||
<h1>MacVim snapshot 28 released</h1>
|
||||
<p><em>The ":macmenukey" command is now deprecated. Please update your .gvimrc
|
||||
file to use the ":macmenu" command instead (if you use ":macmenukey").</em></p>
|
||||
|
||||
<p> Changes since snapshot 27:
|
||||
<ul>
|
||||
<li> Added the ":macmenu" commmand (see ":h macmenu") and deprecated
|
||||
":macmenukey"</li>
|
||||
<li> Cmd-w now works even when mappings to <-\> are present </li>
|
||||
<li> Added "File.Save All" menu item (Cmd-Alt-s) </li>
|
||||
<li> The Logitech Control Center no longer causes any problems </li>
|
||||
<li> "Edit" menu items now work better with open and save dialogs </li>
|
||||
<li> The 'backspace' option now includes "indent,eol,start" by default </li>
|
||||
<li> Open and save dialogs track the present working directory </li>
|
||||
</ul>
|
||||
</p>
|
||||
]]></description>
|
||||
<pubDate>Sun, 25 May 2008 19:40 CET</pubDate>
|
||||
<enclosure type="application/octet-stream"
|
||||
url="http://macvim.googlecode.com/files/MacVim-snapshot-28.tbz"
|
||||
length="8124499"
|
||||
sparkle:version="28"
|
||||
sparkle:shortVersionString="7.1"
|
||||
/>
|
||||
</item>
|
||||
|
||||
|
||||
<item>
|
||||
<title>Snapshot 27 released</title>
|
||||
<description><![CDATA[
|
||||
<h1>MacVim snapshot 27 released</h1>
|
||||
<p> This is the first snapshot compiled on the new Mac I bought with money
|
||||
donated from MacVim users! There were problems with compiling universal
|
||||
binaries with Ruby and Perl support on PPC/Tiger so I was hoping to be able
|
||||
to include these now that I have Intel/Leopard. The good news is that Ruby
|
||||
support is now included, but Perl still is problematic and I had to drop
|
||||
TCL support. I will try to get these working in a future snapshot.
|
||||
</p>
|
||||
|
||||
<p> Here is the list of changes since snapshot 26:
|
||||
<ul>
|
||||
<li> 'fuoptions' now support setting the background color while in
|
||||
full-screen mode, check ":h 'fuopt'" (patch by Enno Lübbers) </li>
|
||||
<li> <D-w> shows confirmation dialog when buffer is modified </li>
|
||||
<li> setting 'antialias' from gvimrc now works </li>
|
||||
<li> zooming a window no longer causes it to move downwards </li>
|
||||
<li> the File menu now contains a "Recent Files" submenu; note that only
|
||||
files opened from Finder or with the ":browse" command are added to this
|
||||
list, and not files opened with e.g. ":e" (patch by Nico Weber) </li>
|
||||
<li> includes latest Vim patches and runtime files </li>
|
||||
</ul>
|
||||
</p>
|
||||
]]></description>
|
||||
<pubDate>Mon, 12 May 2008 22:05 CET</pubDate>
|
||||
<enclosure type="application/octet-stream"
|
||||
url="http://macvim.googlecode.com/files/MacVim-snapshot-27-fixed.tbz"
|
||||
length="8102568"
|
||||
sparkle:version="27"
|
||||
sparkle:shortVersionString="7.1"
|
||||
/>
|
||||
</item>
|
||||
|
||||
|
||||
<item>
|
||||
<title>Snapshot 26 released</title>
|
||||
<description><![CDATA[
|
||||
<h1>MacVim snapshot 26 released</h1>
|
||||
<p> This snapshot contains a fix to the bug which caused the first window to
|
||||
open in the wrong position as well as an initial version of the new MacVim
|
||||
icon. </p>
|
||||
|
||||
]]></description>
|
||||
<pubDate>Fri, 11 Apr 2008 20:37 CET</pubDate>
|
||||
<enclosure type="application/octet-stream"
|
||||
url="http://macvim.googlecode.com/files/MacVim-snapshot-26.tbz"
|
||||
length="8147362"
|
||||
sparkle:version="26"
|
||||
sparkle:shortVersionString="7.1"
|
||||
/>
|
||||
</item>
|
||||
|
||||
|
||||
<item>
|
||||
<title>Snapshot 25 released</title>
|
||||
<description><![CDATA[
|
||||
<h1>MacVim snapshot 25 released</h1>
|
||||
|
||||
<p> This snapshot adds support for two new options: 'antialias' and
|
||||
'fuoptions'. The former lets you turn text antialiasing on or off (it's
|
||||
on by default), the latter can be used to make the view maximize when
|
||||
full-screen is entered. See the built-in help for more information (:h
|
||||
'anti' and :h 'fuopt'). </p>
|
||||
|
||||
<p> Another minor addition is that <C-c> and <C-v> work with
|
||||
block-wise selections (do note that <C-v> behaves like "P", not "p").
|
||||
Also, <D-w> now works in ex-mode and in a command-line window. </p>
|
||||
|
||||
<p> Here is the list of changes since snapshot 24:
|
||||
<ul>
|
||||
<li> support 'antialias' option (Jjgod Jiang) </li>
|
||||
<li> add option 'fuoptions' to control resizing when full-screen is entered
|
||||
(Nico Weber) </li>
|
||||
<li> fixed bug where transparency setting was lost after leaving full-screen
|
||||
(Nico Weber) </li>
|
||||
<li> help menu contains MacVim help and website link </li>
|
||||
<li> <D-w> now works in ex-mode and in command-line window </li>
|
||||
<li> :macaction command supports command-line completion (Nico Weber) </li>
|
||||
<li> copy/paste respects block selections (requested by George Harker) </li>
|
||||
<li> window no longer cascades from preferences panel </li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
]]></description>
|
||||
<pubDate>Fri, 06 Apr 2008 19:11 CET</pubDate>
|
||||
<enclosure type="application/octet-stream"
|
||||
url="http://macvim.googlecode.com/files/MacVim-snapshot-25.tbz"
|
||||
length="8042440"
|
||||
sparkle:version="25"
|
||||
sparkle:shortVersionString="7.1"
|
||||
/>
|
||||
</item>
|
||||
|
||||
|
||||
<item>
|
||||
<title>Snapshot 24 released</title>
|
||||
<description><![CDATA[
|
||||
<h1>MacVim snapshot 24 released</h1>
|
||||
|
||||
<p><em> The input manager bundled with snapshot 23 contained a bug which could
|
||||
lead to other apps crashing on startup. If you have installed the input
|
||||
manager, then you are strongly advised to update now and install the new input
|
||||
manager (via the Integration preference pane). </em></p>
|
||||
|
||||
<p> Changes since snapshot 23:
|
||||
<ul>
|
||||
<li> The mouse cursor has higher contrast in insert mode (when bg=dark). </li>
|
||||
<li> The layout of the Integration preference pane has been updated. </li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
]]></description>
|
||||
<pubDate>Fri, 14 Mar 2008 20:44 CET</pubDate>
|
||||
<enclosure type="application/octet-stream"
|
||||
url="http://macvim.googlecode.com/files/MacVim-snapshot-24.tbz"
|
||||
length="8036815"
|
||||
sparkle:version="24"
|
||||
sparkle:shortVersionString="7.1"
|
||||
/>
|
||||
</item>
|
||||
|
||||
|
||||
<item>
|
||||
<title>Snapshot 23 released</title>
|
||||
<description><![CDATA[
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
#!/bin/sh
|
||||
|
||||
export MACOSX_DEPLOYMENT_TARGET=10.4
|
||||
|
||||
# Increment build number
|
||||
/Developer/Tools/agvtool next-version -all > /dev/null
|
||||
/Developer/usr/bin/agvtool next-version -all > /dev/null
|
||||
|
||||
# Get current build number
|
||||
BUILDNUM=`/Developer/Tools/agvtool what-version -terse`
|
||||
BUILDNUM=`/Developer/usr/bin/agvtool what-version -terse`
|
||||
DEST=~/Desktop/MacVim-snapshot-$BUILDNUM
|
||||
|
||||
echo '****************************************************'
|
||||
@@ -16,8 +18,8 @@ echo ''
|
||||
echo 'BUILDING VIM BINARY'
|
||||
echo ' running configure...'
|
||||
cd .. && ./configure --enable-gui=macvim --with-mac-arch=both \
|
||||
--with-features=huge --enable-pythoninterp --enable-tclinterp \
|
||||
--enable-cscope \
|
||||
--with-features=huge --enable-pythoninterp \
|
||||
--enable-cscope --enable-rubyinterp \
|
||||
--with-compiledby="Bjorn Winckler <bjorn.winckler@gmail.com>" > /dev/null
|
||||
|
||||
echo ' cleaning...'
|
||||
|
||||
Binary file not shown.
+5
-1
@@ -1,6 +1,10 @@
|
||||
" System vimrc file for MacVim
|
||||
"
|
||||
" Maintainer: Bjorn Winckler <bjorn.winckler@gmail.com>
|
||||
" Last Change: Sat Aug 11 14:26:41 CEST 2007
|
||||
" Last Change: Sun May 25 2008
|
||||
|
||||
set nocompatible
|
||||
|
||||
" The default for 'backspace' is very confusing to new users, so change it to a
|
||||
" more sensible value. Add "set backspace&" to your ~/.vimrc to reset it.
|
||||
set backspace+=indent,eol,start
|
||||
|
||||
+18
-12
@@ -1,6 +1,7 @@
|
||||
# Makefile for Vim on Win32 (Windows NT/2000/XP/2003 and Windows 95/98/Me)
|
||||
# and Win64, using the Microsoft Visual C++ compilers. Known to work with
|
||||
# VC5, VC6 (VS98), VC7.0 (VS2002), VC7.1 (VS2003), and VC8 (VS2005).
|
||||
# VC5, VC6 (VS98), VC7.0 (VS2002), VC7.1 (VS2003), VC8 (VS2005),
|
||||
# and VC9 (VS2008).
|
||||
#
|
||||
# To build using other Windows compilers, see INSTALLpc.txt
|
||||
#
|
||||
@@ -285,7 +286,8 @@ XPM_INC = -I $(XPM)\include
|
||||
# need shell32.lib for ExtractIcon()
|
||||
# gdi32.lib and comdlg32.lib for printing support
|
||||
# ole32.lib and uuid.lib are needed for FEAT_SHORTCUT
|
||||
CON_LIB = advapi32.lib shell32.lib gdi32.lib comdlg32.lib ole32.lib uuid.lib
|
||||
CON_LIB = oldnames.lib kernel32.lib advapi32.lib shell32.lib gdi32.lib \
|
||||
comdlg32.lib ole32.lib uuid.lib /machine:$(CPU) /nodefaultlib
|
||||
!if "$(DELAYLOAD)" == "yes"
|
||||
CON_LIB = $(CON_LIB) /DELAYLOAD:comdlg32.dll /DELAYLOAD:ole32.dll DelayImp.lib
|
||||
!endif
|
||||
@@ -331,6 +333,7 @@ MSVCVER = 5.0
|
||||
!endif
|
||||
!if "$(_NMAKE_VER)" == "6.00.8168.0"
|
||||
MSVCVER = 6.0
|
||||
CPU = ix86
|
||||
!endif
|
||||
!if "$(_NMAKE_VER)" == "7.00.9466"
|
||||
MSVCVER = 7.0
|
||||
@@ -344,6 +347,9 @@ MSVCVER = 8.0
|
||||
!if "$(_NMAKE_VER)" == "8.00.50727.762"
|
||||
MSVCVER = 8.0
|
||||
!endif
|
||||
!if "$(_NMAKE_VER)" == "9.00.20706.01"
|
||||
MSVCVER = 9.0
|
||||
!endif
|
||||
!endif
|
||||
|
||||
# Abort bulding VIM if version of VC is unrecognised.
|
||||
@@ -352,13 +358,13 @@ MSVCVER = 8.0
|
||||
!message Cannot determine Visual C version being used. If you are using the
|
||||
!message Windows SDK then you must have the environment variable MSVCVER set to
|
||||
!message your version of the VC compiler. If you are not using the Express
|
||||
!message version of Visual C you van either set MSVCVER or update this makefile
|
||||
!message to handle the new value for _NMAKE_VER.
|
||||
!message version of Visual C, you can either set MSVCVER or update this makefile
|
||||
!message to handle the new value for _NMAKE_VER, "$(_NMAKE_VER)".
|
||||
!error Make aborted.
|
||||
!endif
|
||||
|
||||
# Convert processor ID to MVC-compatible number
|
||||
!if "$(MSVCVER)" != "8.0"
|
||||
!if ("$(MSVCVER)" != "8.0") && ("$(MSVCVER)" != "9.0")
|
||||
!if "$(CPUNR)" == "i386"
|
||||
CPUARG = /G3
|
||||
!elseif "$(CPUNR)" == "i486"
|
||||
@@ -373,7 +379,7 @@ CPUARG = /G7 /arch:SSE2
|
||||
CPUARG =
|
||||
!endif
|
||||
!else
|
||||
# VC8 only allows specifying SSE architecture
|
||||
# VC8/9 only allows specifying SSE architecture
|
||||
!if "$(CPUNR)" == "pentium4"
|
||||
CPUARG = /arch:SSE2
|
||||
!endif
|
||||
@@ -391,7 +397,7 @@ OPTFLAG = /O2
|
||||
!else # MAXSPEED
|
||||
OPTFLAG = /Ox
|
||||
!endif
|
||||
!if "$(MSVCVER)" == "8.0"
|
||||
!if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0")
|
||||
# Use link time code generation if not worried about size
|
||||
!if "$(OPTIMIZE)" != "SPACE"
|
||||
OPTFLAG = $(OPTFLAG) /GL
|
||||
@@ -404,11 +410,11 @@ CFLAGS = $(CFLAGS) /MD
|
||||
LIBC = msvcrt.lib
|
||||
! else
|
||||
LIBC = libcmt.lib
|
||||
CFLAGS = $(CFLAGS) /MT
|
||||
CFLAGS = $(CFLAGS) /Zl /MT
|
||||
! endif
|
||||
!else # DEBUG
|
||||
VIM = vimd
|
||||
! if "$(CPU)" == "i386"
|
||||
! if ("$(CPU)" == "i386") || ("$(CPU)" == "ix86")
|
||||
DEBUGINFO = /ZI
|
||||
! endif
|
||||
CFLAGS = $(CFLAGS) -D_DEBUG -DDEBUG /Od
|
||||
@@ -424,7 +430,7 @@ CFLAGS = $(CFLAGS) /MDd
|
||||
LIBC = $(LIBC) msvcrtd.lib
|
||||
! else
|
||||
LIBC = $(LIBC) libcmtd.lib
|
||||
CFLAGS = $(CFLAGS) /MTd
|
||||
CFLAGS = $(CFLAGS) /Zl /MTd
|
||||
! endif
|
||||
!endif # DEBUG
|
||||
|
||||
@@ -534,7 +540,7 @@ GUI_OBJ = \
|
||||
$(OUTDIR)\gui_w32.obj \
|
||||
$(OUTDIR)\os_w32exe.obj
|
||||
GUI_LIB = \
|
||||
oldnames.lib kernel32.lib gdi32.lib version.lib $(IME_LIB) \
|
||||
gdi32.lib version.lib $(IME_LIB) \
|
||||
winspool.lib comctl32.lib advapi32.lib shell32.lib \
|
||||
/machine:$(CPU) /nodefaultlib
|
||||
!else
|
||||
@@ -757,7 +763,7 @@ LINKARGS2 = $(CON_LIB) $(GUI_LIB) $(LIBC) $(OLE_LIB) user32.lib $(SNIFF_LIB) \
|
||||
|
||||
# Report link time code generation progress if used.
|
||||
!ifdef NODEBUG
|
||||
!if "$(MSVCVER)" == "8.0"
|
||||
!if ("$(MSVCVER)" == "8.0") || ("$(MSVCVER)" == "9.0")
|
||||
!if "$(OPTIMIZE)" != "SPACE"
|
||||
LINKARGS1 = $(LINKARGS1) /LTCG:STATUS
|
||||
!endif
|
||||
|
||||
+29
-17
@@ -545,7 +545,7 @@ LINT_OPTIONS = -beprxzF
|
||||
# For unknown reasons adding "-lc" fixes a linking problem with GCC. That's
|
||||
# probably a bug in the "-pg" implementation.
|
||||
# Need to recompile everything after changing this: "make clean" "make".
|
||||
#PROFILE_CFLAGS = -pg -g
|
||||
#PROFILE_CFLAGS = -pg -g -DWE_ARE_PROFILING
|
||||
#PROFILE_LIBS = -pg
|
||||
#PROFILE_LIBS = -pg -lc
|
||||
|
||||
@@ -780,6 +780,8 @@ LINT_OPTIONS = -beprxzF
|
||||
# 1) make config
|
||||
# 2) edit auto/config.mk, add -n32 to LDFLAGS
|
||||
# 3) make
|
||||
#
|
||||
#Alternatively: use -o32 instead of -n32.
|
||||
###
|
||||
|
||||
### (C) On SCO Unix v3.2.5 (and probably other versions) the termcap library,
|
||||
@@ -1074,7 +1076,7 @@ PRINTSOURCE = ../runtime/print
|
||||
# default vi editor, it will create a link from vi to Vim when doing
|
||||
# "make install". An existing file will be overwritten!
|
||||
# When not using it, some make programs can't handle an undefined $(LINKIT).
|
||||
#LINKIT = -ln -f -s $(BINDIR)/$(VIMTARGET) /usr/bin/vi
|
||||
#LINKIT = ln -f -s $(DEST_BIN)/$(VIMTARGET) $(DESTDIR)/usr/bin/vi
|
||||
LINKIT = @echo >/dev/null
|
||||
|
||||
###
|
||||
@@ -1111,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
|
||||
@@ -1128,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
|
||||
@@ -1158,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
|
||||
@@ -1176,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
|
||||
@@ -1201,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
|
||||
@@ -1217,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
|
||||
@@ -1306,6 +1308,9 @@ LINT_EXTRA = -DUSE_SNIFF -DHANGUL_INPUT -D"__attribute__(x)="
|
||||
|
||||
DEPEND_CFLAGS = -DPROTO -DDEPEND -DFEAT_GUI $(LINT_CFLAGS)
|
||||
|
||||
# If you have problems with flags that cproto doesn't support, and you are
|
||||
# using GNU make, you can try using the other line to filter out arguments.
|
||||
#PFLAGS = $(PROTO_FLAGS) -DPROTO $(filter -D% -I%, $(LINT_CFLAGS))
|
||||
PFLAGS = $(PROTO_FLAGS) -DPROTO $(LINT_CFLAGS)
|
||||
|
||||
ALL_LIB_DIRS = $(GUI_LIBS_DIR) $(X_LIBS_DIR)
|
||||
@@ -1752,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
|
||||
@@ -1761,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; \
|
||||
@@ -1884,6 +1891,10 @@ 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
|
||||
|
||||
installtutor: $(DEST_RT) $(DEST_TUTOR)
|
||||
-$(INSTALL_DATA) $(TUTORSOURCE)/README* $(TUTORSOURCE)/tutor* $(DEST_TUTOR)
|
||||
chmod $(HELPMOD) $(DEST_TUTOR)/*
|
||||
@@ -2091,6 +2102,7 @@ installmanlinks:
|
||||
uninstall: uninstall_runtime
|
||||
-rm -f $(DEST_BIN)/$(VIMTARGET)
|
||||
-rm -f $(DEST_BIN)/vimtutor
|
||||
-rm -f $(DEST_BIN)/gvimtutor
|
||||
-rm -f $(DEST_BIN)/$(EXTARGET) $(DEST_BIN)/$(VIEWTARGET)
|
||||
-rm -f $(DEST_BIN)/$(GVIMTARGET) $(DEST_BIN)/$(GVIEWTARGET)
|
||||
-rm -f $(DEST_BIN)/$(RVIMTARGET) $(DEST_BIN)/$(RVIEWTARGET)
|
||||
@@ -2187,7 +2199,7 @@ SHADOWDIR = shadow
|
||||
|
||||
shadow: runtime pixmaps
|
||||
mkdir $(SHADOWDIR)
|
||||
cd $(SHADOWDIR); ln -s ../*.[ch] ../*.in ../*.sh ../*.xs ../*.xbm ../toolcheck ../proto ../vimtutor ../mkinstalldirs .
|
||||
cd $(SHADOWDIR); ln -s ../*.[ch] ../*.in ../*.sh ../*.xs ../*.xbm ../toolcheck ../proto ../po ../vimtutor ../gvimtutor ../mkinstalldirs .
|
||||
mkdir $(SHADOWDIR)/auto
|
||||
cd $(SHADOWDIR)/auto; ln -s ../../auto/configure .
|
||||
cd $(SHADOWDIR); rm -f auto/link.sed
|
||||
@@ -2206,7 +2218,7 @@ shadow: runtime pixmaps
|
||||
cd $(SHADOWDIR)/testdir; ln -s ../../testdir/Makefile \
|
||||
../../testdir/vimrc.unix \
|
||||
../../testdir/*.in \
|
||||
../../testdir/unix.vim \
|
||||
../../testdir/*.vim \
|
||||
../../testdir/*.ok .
|
||||
|
||||
# Link needed for doing "make install" in a shadow directory.
|
||||
|
||||
Vendored
+89
@@ -845,6 +845,7 @@ Optional Features:
|
||||
--disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
|
||||
--enable-FEATURE[=ARG] include FEATURE [ARG=yes]
|
||||
--disable-darwin Disable Darwin (Mac OS X) support.
|
||||
--disable-selinux Don't check for SELinux support.
|
||||
--disable-xsmp Disable XSMP session management
|
||||
--disable-xsmp-interact Disable XSMP interaction
|
||||
--enable-mzschemeinterp Include MzScheme interpreter.
|
||||
@@ -3611,6 +3612,94 @@ echo "${ECHO_T}no" >&6
|
||||
esac
|
||||
fi
|
||||
|
||||
echo "$as_me:$LINENO: checking --disable-selinux argument" >&5
|
||||
echo $ECHO_N "checking --disable-selinux argument... $ECHO_C" >&6
|
||||
# Check whether --enable-selinux or --disable-selinux was given.
|
||||
if test "${enable_selinux+set}" = set; then
|
||||
enableval="$enable_selinux"
|
||||
|
||||
else
|
||||
enable_selinux="yes"
|
||||
fi;
|
||||
if test "$enable_selinux" = "yes"; then
|
||||
echo "$as_me:$LINENO: result: no" >&5
|
||||
echo "${ECHO_T}no" >&6
|
||||
echo "$as_me:$LINENO: checking for is_selinux_enabled in -lselinux" >&5
|
||||
echo $ECHO_N "checking for is_selinux_enabled in -lselinux... $ECHO_C" >&6
|
||||
if test "${ac_cv_lib_selinux_is_selinux_enabled+set}" = set; then
|
||||
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||
else
|
||||
ac_check_lib_save_LIBS=$LIBS
|
||||
LIBS="-lselinux $LIBS"
|
||||
cat >conftest.$ac_ext <<_ACEOF
|
||||
/* confdefs.h. */
|
||||
_ACEOF
|
||||
cat confdefs.h >>conftest.$ac_ext
|
||||
cat >>conftest.$ac_ext <<_ACEOF
|
||||
/* end confdefs.h. */
|
||||
|
||||
/* Override any gcc2 internal prototype to avoid an error. */
|
||||
#ifdef __cplusplus
|
||||
extern "C"
|
||||
#endif
|
||||
/* We use char because int might match the return type of a gcc2
|
||||
builtin and then its argument prototype would still apply. */
|
||||
char is_selinux_enabled ();
|
||||
int
|
||||
main ()
|
||||
{
|
||||
is_selinux_enabled ();
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
_ACEOF
|
||||
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
|
||||
(eval $ac_link) 2>conftest.er1
|
||||
ac_status=$?
|
||||
grep -v '^ *+' conftest.er1 >conftest.err
|
||||
rm -f conftest.er1
|
||||
cat conftest.err >&5
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); } &&
|
||||
{ ac_try='test -z "$ac_c_werror_flag"
|
||||
|| test ! -s conftest.err'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; } &&
|
||||
{ ac_try='test -s conftest$ac_exeext'
|
||||
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||
(eval $ac_try) 2>&5
|
||||
ac_status=$?
|
||||
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||
(exit $ac_status); }; }; then
|
||||
ac_cv_lib_selinux_is_selinux_enabled=yes
|
||||
else
|
||||
echo "$as_me: failed program was:" >&5
|
||||
sed 's/^/| /' conftest.$ac_ext >&5
|
||||
|
||||
ac_cv_lib_selinux_is_selinux_enabled=no
|
||||
fi
|
||||
rm -f conftest.err conftest.$ac_objext \
|
||||
conftest$ac_exeext conftest.$ac_ext
|
||||
LIBS=$ac_check_lib_save_LIBS
|
||||
fi
|
||||
echo "$as_me:$LINENO: result: $ac_cv_lib_selinux_is_selinux_enabled" >&5
|
||||
echo "${ECHO_T}$ac_cv_lib_selinux_is_selinux_enabled" >&6
|
||||
if test $ac_cv_lib_selinux_is_selinux_enabled = yes; then
|
||||
LIBS="$LIBS -lselinux"
|
||||
cat >>confdefs.h <<\_ACEOF
|
||||
#define HAVE_SELINUX 1
|
||||
_ACEOF
|
||||
|
||||
fi
|
||||
|
||||
else
|
||||
echo "$as_me:$LINENO: result: yes" >&5
|
||||
echo "${ECHO_T}yes" >&6
|
||||
fi
|
||||
|
||||
|
||||
echo "$as_me:$LINENO: checking --with-features argument" >&5
|
||||
|
||||
+4
-3
@@ -4922,7 +4922,7 @@ chk_modeline(lnum, flags)
|
||||
return retval;
|
||||
}
|
||||
|
||||
#ifdef FEAT_VIMINFO
|
||||
#if defined(FEAT_VIMINFO) || defined(PROTO)
|
||||
int
|
||||
read_viminfo_bufferlist(virp, writing)
|
||||
vir_T *virp;
|
||||
@@ -5043,13 +5043,14 @@ buf_spname(buf)
|
||||
#if defined(FEAT_QUICKFIX) && defined(FEAT_WINDOWS)
|
||||
if (bt_quickfix(buf))
|
||||
{
|
||||
win_T *win;
|
||||
win_T *win = NULL;
|
||||
tabpage_T *tp;
|
||||
|
||||
/*
|
||||
* For location list window, w_llist_ref points to the location list.
|
||||
* For quickfix window, w_llist_ref is NULL.
|
||||
*/
|
||||
FOR_ALL_WINDOWS(win)
|
||||
FOR_ALL_TAB_WINDOWS(tp, win)
|
||||
if (win->w_buffer == buf)
|
||||
break;
|
||||
if (win != NULL && win->w_llist_ref != NULL)
|
||||
|
||||
@@ -155,6 +155,7 @@
|
||||
#undef HAVE_READLINK
|
||||
#undef HAVE_RENAME
|
||||
#undef HAVE_SELECT
|
||||
#undef HAVE_SELINUX
|
||||
#undef HAVE_SETENV
|
||||
#undef HAVE_SETPGID
|
||||
#undef HAVE_SETSID
|
||||
|
||||
@@ -308,6 +308,19 @@ case `uname` in
|
||||
esac
|
||||
fi
|
||||
|
||||
dnl Link with -lselinux for SELinux stuff; if not found
|
||||
AC_MSG_CHECKING(--disable-selinux argument)
|
||||
AC_ARG_ENABLE(selinux,
|
||||
[ --disable-selinux Don't check for SELinux support.],
|
||||
, enable_selinux="yes")
|
||||
if test "$enable_selinux" = "yes"; then
|
||||
AC_MSG_RESULT(no)
|
||||
AC_CHECK_LIB(selinux, is_selinux_enabled,
|
||||
[LIBS="$LIBS -lselinux"
|
||||
AC_DEFINE(HAVE_SELINUX)])
|
||||
else
|
||||
AC_MSG_RESULT(yes)
|
||||
fi
|
||||
|
||||
dnl Check user requested features.
|
||||
|
||||
|
||||
+1
-1
@@ -1365,7 +1365,7 @@ install_registry(void)
|
||||
|
||||
printf("Creating \"Edit with Vim\" popup menu entry\n");
|
||||
|
||||
fprintf(fd, "HKEY_CLASSES_ROOT\\CLSID\\%s\n", vim_ext_clsid);
|
||||
fprintf(fd, "[HKEY_CLASSES_ROOT\\CLSID\\%s]\n", vim_ext_clsid);
|
||||
fprintf(fd, "@=\"%s\"\n", vim_ext_name);
|
||||
fprintf(fd, "[HKEY_CLASSES_ROOT\\CLSID\\%s\\InProcServer32]\n",
|
||||
vim_ext_clsid);
|
||||
|
||||
+2
-2
@@ -5491,7 +5491,7 @@ insertchar(c, flags, second_indent)
|
||||
#if defined(FEAT_EVAL)
|
||||
int do_internal = TRUE;
|
||||
|
||||
if (*curbuf->b_p_fex != NUL)
|
||||
if (*curbuf->b_p_fex != NUL && (flags & INSCHAR_NO_FEX) == 0)
|
||||
{
|
||||
do_internal = (fex_format(curwin->w_cursor.lnum, 1L, c) != 0);
|
||||
/* It may be required to save for undo again, e.g. when setline()
|
||||
@@ -6057,7 +6057,7 @@ auto_format(trailblank, prev_line)
|
||||
* be adjusted for the text formatting.
|
||||
*/
|
||||
saved_cursor = pos;
|
||||
format_lines((linenr_T)-1);
|
||||
format_lines((linenr_T)-1, FALSE);
|
||||
curwin->w_cursor = saved_cursor;
|
||||
saved_cursor.lnum = 0;
|
||||
|
||||
|
||||
+141
-82
@@ -507,6 +507,7 @@ static void f_filewritable __ARGS((typval_T *argvars, typval_T *rettv));
|
||||
static void f_filter __ARGS((typval_T *argvars, typval_T *rettv));
|
||||
static void f_finddir __ARGS((typval_T *argvars, typval_T *rettv));
|
||||
static void f_findfile __ARGS((typval_T *argvars, typval_T *rettv));
|
||||
static void f_fnameescape __ARGS((typval_T *argvars, typval_T *rettv));
|
||||
static void f_fnamemodify __ARGS((typval_T *argvars, typval_T *rettv));
|
||||
static void f_foldclosed __ARGS((typval_T *argvars, typval_T *rettv));
|
||||
static void f_foldclosedend __ARGS((typval_T *argvars, typval_T *rettv));
|
||||
@@ -7107,6 +7108,7 @@ static struct fst
|
||||
{"filter", 2, 2, f_filter},
|
||||
{"finddir", 1, 3, f_finddir},
|
||||
{"findfile", 1, 3, f_findfile},
|
||||
{"fnameescape", 1, 1, f_fnameescape},
|
||||
{"fnamemodify", 2, 2, f_fnamemodify},
|
||||
{"foldclosed", 1, 1, f_foldclosed},
|
||||
{"foldclosedend", 1, 1, f_foldclosedend},
|
||||
@@ -9464,6 +9466,19 @@ f_findfile(argvars, rettv)
|
||||
findfilendir(argvars, rettv, FINDFILE_FILE);
|
||||
}
|
||||
|
||||
/*
|
||||
* "fnameescape({string})" function
|
||||
*/
|
||||
static void
|
||||
f_fnameescape(argvars, rettv)
|
||||
typval_T *argvars;
|
||||
typval_T *rettv;
|
||||
{
|
||||
rettv->vval.v_string = vim_strsave_fnameescape(
|
||||
get_tv_string(&argvars[0]), FALSE);
|
||||
rettv->v_type = VAR_STRING;
|
||||
}
|
||||
|
||||
/*
|
||||
* "fnamemodify({fname}, {mods})" function
|
||||
*/
|
||||
@@ -13974,6 +13989,7 @@ f_reverse(argvars, rettv)
|
||||
rettv->vval.v_list = l;
|
||||
rettv->v_type = VAR_LIST;
|
||||
++l->lv_refcount;
|
||||
l->lv_idx = l->lv_len - l->lv_idx - 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14682,6 +14698,8 @@ f_setline(argvars, rettv)
|
||||
appended_lines_mark(lcount, added);
|
||||
}
|
||||
|
||||
static void set_qf_ll_list __ARGS((win_T *wp, typval_T *list_arg, typval_T *action_arg, typval_T *rettv));
|
||||
|
||||
/*
|
||||
* Used by "setqflist()" and "setloclist()" functions
|
||||
*/
|
||||
@@ -15220,7 +15238,7 @@ f_sort(argvars, rettv)
|
||||
if (!item_compare_func_err)
|
||||
{
|
||||
/* Clear the List and append the items in the sorted order. */
|
||||
l->lv_first = l->lv_last = NULL;
|
||||
l->lv_first = l->lv_last = l->lv_idx_item = NULL;
|
||||
l->lv_len = 0;
|
||||
for (i = 0; i < len; ++i)
|
||||
list_append(l, ptrs[i]);
|
||||
@@ -16909,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)
|
||||
@@ -21070,8 +21096,12 @@ static int shortpath_for_invalid_fname __ARGS((char_u **fname, char_u **bufp, in
|
||||
static int shortpath_for_partial __ARGS((char_u **fnamep, char_u **bufp, int *fnamelen));
|
||||
|
||||
/*
|
||||
* Get the short pathname of a file.
|
||||
* Returns 1 on success. *fnamelen is 0 for nonexistent path.
|
||||
* Get the short path (8.3) for the filename in "fnamep".
|
||||
* Only works for a valid file name.
|
||||
* When the path gets longer "fnamep" is changed and the allocated buffer
|
||||
* is put in "bufp".
|
||||
* *fnamelen is the length of "fnamep" and set to 0 for a nonexistent path.
|
||||
* Returns OK on success, FAIL on failure.
|
||||
*/
|
||||
static int
|
||||
get_short_pathname(fnamep, bufp, fnamelen)
|
||||
@@ -21079,36 +21109,44 @@ get_short_pathname(fnamep, bufp, fnamelen)
|
||||
char_u **bufp;
|
||||
int *fnamelen;
|
||||
{
|
||||
int l,len;
|
||||
int l, len;
|
||||
char_u *newbuf;
|
||||
|
||||
len = *fnamelen;
|
||||
|
||||
l = GetShortPathName(*fnamep, *fnamep, len);
|
||||
if (l > len - 1)
|
||||
{
|
||||
/* If that doesn't work (not enough space), then save the string
|
||||
* and try again with a new buffer big enough
|
||||
*/
|
||||
* and try again with a new buffer big enough. */
|
||||
newbuf = vim_strnsave(*fnamep, l);
|
||||
if (newbuf == NULL)
|
||||
return 0;
|
||||
return FAIL;
|
||||
|
||||
vim_free(*bufp);
|
||||
*fnamep = *bufp = newbuf;
|
||||
|
||||
l = GetShortPathName(*fnamep,*fnamep,l+1);
|
||||
|
||||
/* Really should always succeed, as the buffer is big enough */
|
||||
/* Really should always succeed, as the buffer is big enough. */
|
||||
l = GetShortPathName(*fnamep, *fnamep, l+1);
|
||||
}
|
||||
|
||||
*fnamelen = l;
|
||||
return 1;
|
||||
return OK;
|
||||
}
|
||||
|
||||
/*
|
||||
* Create a short path name. Returns the length of the buffer it needs.
|
||||
* Doesn't copy over the end of the buffer passed in.
|
||||
* Get the short path (8.3) for the filename in "fname". The converted
|
||||
* path is returned in "bufp".
|
||||
*
|
||||
* Some of the directories specified in "fname" may not exist. This function
|
||||
* will shorten the existing directories at the beginning of the path and then
|
||||
* append the remaining non-existing path.
|
||||
*
|
||||
* fname - Pointer to the filename to shorten. On return, contains the
|
||||
* pointer to the shortened pathname
|
||||
* bufp - Pointer to an allocated buffer for the filename.
|
||||
* fnamelen - Length of the filename pointed to by fname
|
||||
*
|
||||
* Returns OK on success (or nothing done) and FAIL on failure (out of memory).
|
||||
*/
|
||||
static int
|
||||
shortpath_for_invalid_fname(fname, bufp, fnamelen)
|
||||
@@ -21116,85 +21154,106 @@ shortpath_for_invalid_fname(fname, bufp, fnamelen)
|
||||
char_u **bufp;
|
||||
int *fnamelen;
|
||||
{
|
||||
char_u *s, *p, *pbuf2, *pbuf3;
|
||||
char_u *short_fname, *save_fname, *pbuf_unused;
|
||||
char_u *endp, *save_endp;
|
||||
char_u ch;
|
||||
int len, len2, plen, slen;
|
||||
int old_len, len;
|
||||
int new_len, sfx_len;
|
||||
int retval = OK;
|
||||
|
||||
/* Make a copy */
|
||||
len2 = *fnamelen;
|
||||
pbuf2 = vim_strnsave(*fname, len2);
|
||||
pbuf3 = NULL;
|
||||
old_len = *fnamelen;
|
||||
save_fname = vim_strnsave(*fname, old_len);
|
||||
pbuf_unused = NULL;
|
||||
short_fname = NULL;
|
||||
|
||||
s = pbuf2 + len2 - 1; /* Find the end */
|
||||
slen = 1;
|
||||
plen = len2;
|
||||
endp = save_fname + old_len - 1; /* Find the end of the copy */
|
||||
save_endp = endp;
|
||||
|
||||
if (after_pathsep(pbuf2, s + 1))
|
||||
/*
|
||||
* Try shortening the supplied path till it succeeds by removing one
|
||||
* directory at a time from the tail of the path.
|
||||
*/
|
||||
len = 0;
|
||||
for (;;)
|
||||
{
|
||||
--s;
|
||||
++slen;
|
||||
--plen;
|
||||
/* go back one path-separator */
|
||||
while (endp > save_fname && !after_pathsep(save_fname, endp + 1))
|
||||
--endp;
|
||||
if (endp <= save_fname)
|
||||
break; /* processed the complete path */
|
||||
|
||||
/*
|
||||
* Replace the path separator with a NUL and try to shorten the
|
||||
* resulting path.
|
||||
*/
|
||||
ch = *endp;
|
||||
*endp = 0;
|
||||
short_fname = save_fname;
|
||||
len = STRLEN(short_fname) + 1;
|
||||
if (get_short_pathname(&short_fname, &pbuf_unused, &len) == FAIL)
|
||||
{
|
||||
retval = FAIL;
|
||||
goto theend;
|
||||
}
|
||||
*endp = ch; /* preserve the string */
|
||||
|
||||
if (len > 0)
|
||||
break; /* successfully shortened the path */
|
||||
|
||||
/* failed to shorten the path. Skip the path separator */
|
||||
--endp;
|
||||
}
|
||||
|
||||
do
|
||||
if (len > 0)
|
||||
{
|
||||
/* Go back one path-separator */
|
||||
while (s > pbuf2 && !after_pathsep(pbuf2, s + 1))
|
||||
{
|
||||
--s;
|
||||
++slen;
|
||||
--plen;
|
||||
}
|
||||
if (s <= pbuf2)
|
||||
break;
|
||||
/*
|
||||
* Succeeded in shortening the path. Now concatenate the shortened
|
||||
* path with the remaining path at the tail.
|
||||
*/
|
||||
|
||||
/* Remember the character that is about to be splatted */
|
||||
ch = *s;
|
||||
*s = 0; /* get_short_pathname requires a null-terminated string */
|
||||
/* Compute the length of the new path. */
|
||||
sfx_len = (int)(save_endp - endp) + 1;
|
||||
new_len = len + sfx_len;
|
||||
|
||||
/* Try it in situ */
|
||||
p = pbuf2;
|
||||
if (!get_short_pathname(&p, &pbuf3, &plen))
|
||||
{
|
||||
vim_free(pbuf2);
|
||||
return -1;
|
||||
}
|
||||
*s = ch; /* Preserve the string */
|
||||
} while (plen == 0);
|
||||
|
||||
if (plen > 0)
|
||||
{
|
||||
/* Remember the length of the new string. */
|
||||
*fnamelen = len = plen + slen;
|
||||
*fnamelen = new_len;
|
||||
vim_free(*bufp);
|
||||
if (len > len2)
|
||||
if (new_len > old_len)
|
||||
{
|
||||
/* If there's not enough space in the currently allocated string,
|
||||
* then copy it to a buffer big enough.
|
||||
*/
|
||||
*fname= *bufp = vim_strnsave(p, len);
|
||||
/* There is not enough space in the currently allocated string,
|
||||
* copy it to a buffer big enough. */
|
||||
*fname = *bufp = vim_strnsave(short_fname, new_len);
|
||||
if (*fname == NULL)
|
||||
return -1;
|
||||
{
|
||||
retval = FAIL;
|
||||
goto theend;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Transfer pbuf2 to being the main buffer (it's big enough) */
|
||||
*fname = *bufp = pbuf2;
|
||||
if (p != pbuf2)
|
||||
strncpy(*fname, p, plen);
|
||||
pbuf2 = NULL;
|
||||
/* Transfer short_fname to the main buffer (it's big enough),
|
||||
* unless get_short_pathname() did its work in-place. */
|
||||
*fname = *bufp = save_fname;
|
||||
if (short_fname != save_fname)
|
||||
vim_strncpy(save_fname, short_fname, len);
|
||||
save_fname = NULL;
|
||||
}
|
||||
/* Concat the next bit */
|
||||
strncpy(*fname + plen, s, slen);
|
||||
(*fname)[len] = '\0';
|
||||
|
||||
/* concat the not-shortened part of the path */
|
||||
vim_strncpy(*fname + len, endp, sfx_len);
|
||||
(*fname)[new_len] = NUL;
|
||||
}
|
||||
vim_free(pbuf3);
|
||||
vim_free(pbuf2);
|
||||
return 0;
|
||||
|
||||
theend:
|
||||
vim_free(pbuf_unused);
|
||||
vim_free(save_fname);
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/*
|
||||
* Get a pathname for a partial path.
|
||||
* Returns OK for success, FAIL for failure.
|
||||
*/
|
||||
static int
|
||||
shortpath_for_partial(fnamep, bufp, fnamelen)
|
||||
@@ -21224,8 +21283,8 @@ shortpath_for_partial(fnamep, bufp, fnamelen)
|
||||
|
||||
len = tflen = (int)STRLEN(tfname);
|
||||
|
||||
if (!get_short_pathname(&tfname, &pbuf, &len))
|
||||
return -1;
|
||||
if (get_short_pathname(&tfname, &pbuf, &len) == FAIL)
|
||||
return FAIL;
|
||||
|
||||
if (len == 0)
|
||||
{
|
||||
@@ -21234,8 +21293,8 @@ shortpath_for_partial(fnamep, bufp, fnamelen)
|
||||
* there's not a lot of point in guessing what it might be.
|
||||
*/
|
||||
len = tflen;
|
||||
if (shortpath_for_invalid_fname(&tfname, &pbuf, &len) == -1)
|
||||
return -1;
|
||||
if (shortpath_for_invalid_fname(&tfname, &pbuf, &len) == FAIL)
|
||||
return FAIL;
|
||||
}
|
||||
|
||||
/* Count the paths backward to find the beginning of the desired string. */
|
||||
@@ -21259,7 +21318,7 @@ shortpath_for_partial(fnamep, bufp, fnamelen)
|
||||
if (p >= tfname)
|
||||
*p = '~';
|
||||
else
|
||||
return -1;
|
||||
return FAIL;
|
||||
}
|
||||
else
|
||||
++p;
|
||||
@@ -21270,7 +21329,7 @@ shortpath_for_partial(fnamep, bufp, fnamelen)
|
||||
*bufp = pbuf;
|
||||
*fnamep = p;
|
||||
|
||||
return 0;
|
||||
return OK;
|
||||
}
|
||||
#endif /* WIN3264 */
|
||||
|
||||
@@ -21278,7 +21337,7 @@ shortpath_for_partial(fnamep, bufp, fnamelen)
|
||||
* Adjust a filename, according to a string of modifiers.
|
||||
* *fnamep must be NUL terminated when called. When returning, the length is
|
||||
* determined by *fnamelen.
|
||||
* Returns valid flags.
|
||||
* Returns VALID_ flags or -1 for failure.
|
||||
* When there is an error, *fnamep is set to NULL.
|
||||
*/
|
||||
int
|
||||
@@ -21490,7 +21549,7 @@ repeat:
|
||||
*/
|
||||
if (!has_fullname && !vim_isAbsName(*fnamep))
|
||||
{
|
||||
if (shortpath_for_partial(fnamep, bufp, fnamelen) == -1)
|
||||
if (shortpath_for_partial(fnamep, bufp, fnamelen) == FAIL)
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
@@ -21500,7 +21559,7 @@ repeat:
|
||||
/* Simple case, already have the full-name
|
||||
* Nearly always shorter, so try first time. */
|
||||
l = *fnamelen;
|
||||
if (!get_short_pathname(fnamep, bufp, &l))
|
||||
if (get_short_pathname(fnamep, bufp, &l) == FAIL)
|
||||
return -1;
|
||||
|
||||
if (l == 0)
|
||||
@@ -21508,7 +21567,7 @@ repeat:
|
||||
/* Couldn't find the filename.. search the paths.
|
||||
*/
|
||||
l = *fnamelen;
|
||||
if (shortpath_for_invalid_fname(fnamep, bufp, &l ) == -1)
|
||||
if (shortpath_for_invalid_fname(fnamep, bufp, &l) == FAIL)
|
||||
return -1;
|
||||
}
|
||||
*fnamelen = l;
|
||||
|
||||
+5
-1
@@ -1160,6 +1160,7 @@ do_filter(line1, line2, eap, cmd, do_in, do_out)
|
||||
if (!do_out)
|
||||
msg_putchar('\n');
|
||||
|
||||
/* Create the shell command in allocated memory. */
|
||||
cmd_buf = make_filter_cmd(cmd, itmp, otmp);
|
||||
if (cmd_buf == NULL)
|
||||
goto filterend;
|
||||
@@ -1180,7 +1181,10 @@ do_filter(line1, line2, eap, cmd, do_in, do_out)
|
||||
if (do_out)
|
||||
{
|
||||
if (u_save((linenr_T)(line2), (linenr_T)(line2 + 1)) == FAIL)
|
||||
{
|
||||
vim_free(cmd_buf);
|
||||
goto error;
|
||||
}
|
||||
redraw_curbuf_later(VALID);
|
||||
}
|
||||
read_linecount = curbuf->b_ml.ml_line_count;
|
||||
@@ -4471,7 +4475,7 @@ do_sub(eap)
|
||||
/*
|
||||
* The new text is build up step by step, to avoid too much
|
||||
* copying. There are these pieces:
|
||||
* sub_firstline The old text, unmodifed.
|
||||
* sub_firstline The old text, unmodified.
|
||||
* copycol Column in the old text where we started
|
||||
* looking for a match; from here old text still
|
||||
* needs to be copied to the new text.
|
||||
|
||||
+2
-2
@@ -597,8 +597,8 @@ EX(CMD_match, "match", ex_match,
|
||||
RANGE|NOTADR|EXTRA|CMDWIN),
|
||||
EX(CMD_macaction, "macaction", ex_macaction,
|
||||
EXTRA|NOSPC|NEEDARG),
|
||||
EX(CMD_macmenukey, "macmenukey", ex_macmenukey,
|
||||
EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
|
||||
EX(CMD_macmenu, "macmenu", ex_macmenu,
|
||||
EXTRA|TRLBAR|CMDWIN),
|
||||
EX(CMD_menu, "menu", ex_menu,
|
||||
RANGE|NOTADR|ZEROR|BANG|EXTRA|TRLBAR|NOTRLCOM|USECTRLV|CMDWIN),
|
||||
EX(CMD_menutranslate, "menutranslate", ex_menutranslate,
|
||||
|
||||
+17
-9
@@ -466,7 +466,7 @@ static void ex_folddo __ARGS((exarg_T *eap));
|
||||
|
||||
#ifndef FEAT_GUI_MACVIM
|
||||
# define ex_macaction ex_ni
|
||||
# define ex_macmenukey ex_ni
|
||||
# define ex_macmenu ex_ni
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -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;
|
||||
@@ -3015,7 +3017,7 @@ modifier_len(cmd)
|
||||
break;
|
||||
if (!isalpha(p[j]) && j >= cmdmods[i].minlen
|
||||
&& (p == cmd || cmdmods[i].has_count))
|
||||
return j + (p - cmd);
|
||||
return j + (int)(p - cmd);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -3764,7 +3766,7 @@ set_one_cmd_context(xp, buff)
|
||||
case CMD_tmenu: case CMD_tunmenu:
|
||||
case CMD_popup: case CMD_tearoff: case CMD_emenu:
|
||||
#ifdef FEAT_GUI_MACVIM
|
||||
case CMD_macmenukey:
|
||||
case CMD_macmenu:
|
||||
#endif
|
||||
return set_context_in_menu_cmd(xp, cmd, arg, forceit);
|
||||
#endif
|
||||
@@ -3792,6 +3794,14 @@ set_one_cmd_context(xp, buff)
|
||||
break;
|
||||
#endif
|
||||
|
||||
#ifdef FEAT_GUI_MACVIM
|
||||
case CMD_macaction:
|
||||
xp->xp_context = EXPAND_MACACTION;
|
||||
xp->xp_pattern = arg;
|
||||
break;
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* FEAT_CMDL_COMPL */
|
||||
|
||||
default:
|
||||
@@ -3941,8 +3951,7 @@ get_address(ptr, skip, to_other_file)
|
||||
curwin->w_cursor.col = 0;
|
||||
searchcmdlen = 0;
|
||||
if (!do_search(NULL, c, cmd, 1L,
|
||||
SEARCH_HIS + SEARCH_MSG + SEARCH_START,
|
||||
NULL))
|
||||
SEARCH_HIS | SEARCH_MSG, NULL))
|
||||
{
|
||||
curwin->w_cursor = pos;
|
||||
cmd = NULL;
|
||||
@@ -3989,8 +3998,7 @@ get_address(ptr, skip, to_other_file)
|
||||
pos.col = 0;
|
||||
if (searchit(curwin, curbuf, &pos,
|
||||
*cmd == '?' ? BACKWARD : FORWARD,
|
||||
(char_u *)"", 1L,
|
||||
SEARCH_MSG + SEARCH_START,
|
||||
(char_u *)"", 1L, SEARCH_MSG,
|
||||
i, (linenr_T)0, NULL) != FAIL)
|
||||
lnum = pos.lnum;
|
||||
else
|
||||
@@ -9313,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;
|
||||
|
||||
+41
-25
@@ -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
|
||||
@@ -3657,20 +3655,9 @@ ExpandEscape(xp, str, numfiles, files, options)
|
||||
}
|
||||
}
|
||||
#ifdef BACKSLASH_IN_FILENAME
|
||||
{
|
||||
char_u buf[20];
|
||||
int j = 0;
|
||||
|
||||
/* Don't escape '[' and '{' if they are in 'isfname'. */
|
||||
for (p = PATH_ESC_CHARS; *p != NUL; ++p)
|
||||
if ((*p != '[' && *p != '{') || !vim_isfilec(*p))
|
||||
buf[j++] = *p;
|
||||
buf[j] = NUL;
|
||||
p = vim_strsave_escaped(files[i], buf);
|
||||
}
|
||||
p = vim_strsave_fnameescape(files[i], FALSE);
|
||||
#else
|
||||
p = vim_strsave_escaped(files[i],
|
||||
xp->xp_shell ? SHELL_ESC_CHARS : PATH_ESC_CHARS);
|
||||
p = vim_strsave_fnameescape(files[i], xp->xp_shell);
|
||||
#endif
|
||||
if (p != NULL)
|
||||
{
|
||||
@@ -3709,6 +3696,32 @@ ExpandEscape(xp, str, numfiles, files, options)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Escape special characters in "fname" for when used as a file name argument
|
||||
* after a Vim command, or, when "shell" is non-zero, a shell command.
|
||||
* Returns the result in allocated memory.
|
||||
*/
|
||||
char_u *
|
||||
vim_strsave_fnameescape(fname, shell)
|
||||
char_u *fname;
|
||||
int shell;
|
||||
{
|
||||
#ifdef BACKSLASH_IN_FILENAME
|
||||
char_u buf[20];
|
||||
int j = 0;
|
||||
char_u *p;
|
||||
|
||||
/* Don't escape '[' and '{' if they are in 'isfname'. */
|
||||
for (p = PATH_ESC_CHARS; *p != NUL; ++p)
|
||||
if ((*p != '[' && *p != '{') || !vim_isfilec(*p))
|
||||
buf[j++] = *p;
|
||||
buf[j] = NUL;
|
||||
return vim_strsave_escaped(fname, buf);
|
||||
#else
|
||||
return vim_strsave_escaped(fname, shell ? SHELL_ESC_CHARS : PATH_ESC_CHARS);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* Put a backslash before the file name in "pp", which is in allocated memory.
|
||||
*/
|
||||
@@ -4449,6 +4462,9 @@ ExpandFromContext(xp, pat, num_file, file, options)
|
||||
{EXPAND_LANGUAGE, get_lang_arg, TRUE},
|
||||
#endif
|
||||
{EXPAND_ENV_VARS, get_env_name, TRUE},
|
||||
#ifdef FEAT_GUI_MACVIM
|
||||
{EXPAND_MACACTION, get_macaction_name, FALSE},
|
||||
#endif
|
||||
};
|
||||
int i;
|
||||
|
||||
@@ -6099,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))
|
||||
{
|
||||
|
||||
@@ -1296,3 +1296,10 @@
|
||||
#ifdef FEAT_GUI_MACVIM
|
||||
#define FEAT_GUI_SCROLL_WHEEL_FORCE
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Support for enabling/disabling antialiased text.
|
||||
*/
|
||||
#if defined(FEAT_GUI) && defined(MACOS_X)
|
||||
#define FEAT_ANTIALIAS
|
||||
#endif
|
||||
|
||||
+93
-45
@@ -1288,12 +1288,49 @@ retry:
|
||||
#ifdef FEAT_MBYTE
|
||||
else if (conv_restlen > 0)
|
||||
{
|
||||
/* Reached end-of-file but some trailing bytes could
|
||||
* not be converted. Truncated file? */
|
||||
if (conv_error == 0)
|
||||
conv_error = linecnt;
|
||||
if (bad_char_behavior != BAD_DROP)
|
||||
/*
|
||||
* Reached end-of-file but some trailing bytes could
|
||||
* not be converted. Truncated file?
|
||||
*/
|
||||
|
||||
/* When we did a conversion report an error. */
|
||||
if (fio_flags != 0
|
||||
# ifdef USE_ICONV
|
||||
|| iconv_fd != (iconv_t)-1
|
||||
# endif
|
||||
)
|
||||
{
|
||||
if (conv_error == 0)
|
||||
conv_error = curbuf->b_ml.ml_line_count
|
||||
- linecnt + 1;
|
||||
}
|
||||
/* Remember the first linenr with an illegal byte */
|
||||
else if (illegal_byte == 0)
|
||||
illegal_byte = curbuf->b_ml.ml_line_count
|
||||
- linecnt + 1;
|
||||
if (bad_char_behavior == BAD_DROP)
|
||||
{
|
||||
*(ptr - conv_restlen) = NUL;
|
||||
conv_restlen = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Replace the trailing bytes with the replacement
|
||||
* character if we were converting; if we weren't,
|
||||
* leave the UTF8 checking code to do it, as it
|
||||
* works slightly differently. */
|
||||
if (bad_char_behavior != BAD_KEEP && (fio_flags != 0
|
||||
# ifdef USE_ICONV
|
||||
|| iconv_fd != (iconv_t)-1
|
||||
# endif
|
||||
))
|
||||
{
|
||||
while (conv_restlen > 0)
|
||||
{
|
||||
*(--ptr) = bad_char_behavior;
|
||||
--conv_restlen;
|
||||
}
|
||||
}
|
||||
fio_flags = 0; /* don't convert this */
|
||||
# ifdef USE_ICONV
|
||||
if (iconv_fd != (iconv_t)-1)
|
||||
@@ -1302,20 +1339,6 @@ retry:
|
||||
iconv_fd = (iconv_t)-1;
|
||||
}
|
||||
# endif
|
||||
if (bad_char_behavior == BAD_KEEP)
|
||||
{
|
||||
/* Keep the trailing bytes as-is. */
|
||||
size = conv_restlen;
|
||||
ptr -= conv_restlen;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Replace the trailing bytes with the
|
||||
* replacement character. */
|
||||
size = 1;
|
||||
*--ptr = bad_char_behavior;
|
||||
}
|
||||
conv_restlen = 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@@ -1397,6 +1420,11 @@ retry:
|
||||
goto retry;
|
||||
}
|
||||
}
|
||||
|
||||
/* Include not converted bytes. */
|
||||
ptr -= conv_restlen;
|
||||
size += conv_restlen;
|
||||
conv_restlen = 0;
|
||||
#endif
|
||||
/*
|
||||
* Break here for a read error or end-of-file.
|
||||
@@ -1406,11 +1434,6 @@ retry:
|
||||
|
||||
#ifdef FEAT_MBYTE
|
||||
|
||||
/* Include not converted bytes. */
|
||||
ptr -= conv_restlen;
|
||||
size += conv_restlen;
|
||||
conv_restlen = 0;
|
||||
|
||||
# ifdef USE_ICONV
|
||||
if (iconv_fd != (iconv_t)-1)
|
||||
{
|
||||
@@ -1872,12 +1895,12 @@ retry:
|
||||
size = (long)((ptr + real_size) - dest);
|
||||
ptr = dest;
|
||||
}
|
||||
else if (enc_utf8 && conv_error == 0 && !curbuf->b_p_bin)
|
||||
else if (enc_utf8 && !curbuf->b_p_bin)
|
||||
{
|
||||
/* Reading UTF-8: Check if the bytes are valid UTF-8.
|
||||
* Need to start before "ptr" when part of the character was
|
||||
* read in the previous read() call. */
|
||||
for (p = ptr - utf_head_off(buffer, ptr); ; ++p)
|
||||
int incomplete_tail = FALSE;
|
||||
|
||||
/* Reading UTF-8: Check if the bytes are valid UTF-8. */
|
||||
for (p = ptr; ; ++p)
|
||||
{
|
||||
int todo = (int)((ptr + size) - p);
|
||||
int l;
|
||||
@@ -1891,43 +1914,56 @@ retry:
|
||||
* read() will get the next bytes, we'll check it
|
||||
* then. */
|
||||
l = utf_ptr2len_len(p, todo);
|
||||
if (l > todo)
|
||||
if (l > todo && !incomplete_tail)
|
||||
{
|
||||
/* Incomplete byte sequence, the next read()
|
||||
* should get them and check the bytes. */
|
||||
p += todo;
|
||||
break;
|
||||
/* Avoid retrying with a different encoding when
|
||||
* a truncated file is more likely, or attempting
|
||||
* to read the rest of an incomplete sequence when
|
||||
* we have already done so. */
|
||||
if (p > ptr || filesize > 0)
|
||||
incomplete_tail = TRUE;
|
||||
/* Incomplete byte sequence, move it to conv_rest[]
|
||||
* and try to read the rest of it, unless we've
|
||||
* already done so. */
|
||||
if (p > ptr)
|
||||
{
|
||||
conv_restlen = todo;
|
||||
mch_memmove(conv_rest, p, conv_restlen);
|
||||
size -= conv_restlen;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (l == 1)
|
||||
if (l == 1 || l > todo)
|
||||
{
|
||||
/* Illegal byte. If we can try another encoding
|
||||
* do that. */
|
||||
if (can_retry)
|
||||
* do that, unless at EOF where a truncated
|
||||
* file is more likely than a conversion error. */
|
||||
if (can_retry && !incomplete_tail)
|
||||
break;
|
||||
|
||||
/* Remember the first linenr with an illegal byte */
|
||||
if (illegal_byte == 0)
|
||||
illegal_byte = readfile_linenr(linecnt, ptr, p);
|
||||
# ifdef USE_ICONV
|
||||
/* When we did a conversion report an error. */
|
||||
if (iconv_fd != (iconv_t)-1 && conv_error == 0)
|
||||
conv_error = readfile_linenr(linecnt, ptr, p);
|
||||
# endif
|
||||
/* Remember the first linenr with an illegal byte */
|
||||
if (conv_error == 0 && illegal_byte == 0)
|
||||
illegal_byte = readfile_linenr(linecnt, ptr, p);
|
||||
|
||||
/* Drop, keep or replace the bad byte. */
|
||||
if (bad_char_behavior == BAD_DROP)
|
||||
{
|
||||
mch_memmove(p, p+1, todo - 1);
|
||||
mch_memmove(p, p + 1, todo - 1);
|
||||
--p;
|
||||
--size;
|
||||
}
|
||||
else if (bad_char_behavior != BAD_KEEP)
|
||||
*p = bad_char_behavior;
|
||||
}
|
||||
p += l - 1;
|
||||
else
|
||||
p += l - 1;
|
||||
}
|
||||
}
|
||||
if (p < ptr + size)
|
||||
if (p < ptr + size && !incomplete_tail)
|
||||
{
|
||||
/* Detected a UTF-8 error. */
|
||||
rewind_retry:
|
||||
@@ -3651,6 +3687,9 @@ buf_write(buf, fname, sfname, start, end, eap, append, forceit,
|
||||
)
|
||||
mch_setperm(backup,
|
||||
(perm & 0707) | ((perm & 07) << 3));
|
||||
# ifdef HAVE_SELINUX
|
||||
mch_copy_sec(fname, backup);
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
@@ -3686,6 +3725,9 @@ buf_write(buf, fname, sfname, start, end, eap, append, forceit,
|
||||
#endif
|
||||
#ifdef HAVE_ACL
|
||||
mch_set_acl(backup, acl);
|
||||
#endif
|
||||
#ifdef HAVE_SELINUX
|
||||
mch_copy_sec(fname, backup);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
@@ -4309,6 +4351,12 @@ restore_backup:
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SELINUX
|
||||
/* Probably need to set the security context. */
|
||||
if (!backup_copy)
|
||||
mch_copy_sec(backup, wfname);
|
||||
#endif
|
||||
|
||||
#ifdef UNIX
|
||||
/* When creating a new file, set its owner/group to that of the original
|
||||
* file. Get the new device and inode number. */
|
||||
@@ -9244,7 +9292,7 @@ aucmd_prepbuf(aco, buf)
|
||||
aco_save_T *aco; /* structure to save values in */
|
||||
buf_T *buf; /* new curbuf */
|
||||
{
|
||||
aco->save_buf = buf;
|
||||
aco->save_buf = curbuf;
|
||||
curbuf = buf;
|
||||
curwin->w_buffer = buf;
|
||||
}
|
||||
|
||||
+1
-1
@@ -1263,7 +1263,7 @@ EXTERN int echo_wid_arg INIT(= FALSE); /* --echo-wid argument */
|
||||
* The value of the --windowid argument.
|
||||
* For embedding gvim inside another application.
|
||||
*/
|
||||
EXTERN int win_socket_id INIT(= 0);
|
||||
EXTERN long_u win_socket_id INIT(= 0);
|
||||
#endif
|
||||
|
||||
#if defined(FEAT_CLIENTSERVER) || defined(FEAT_EVAL)
|
||||
|
||||
@@ -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.
|
||||
*/
|
||||
@@ -4955,6 +4956,15 @@ gui_update_screen()
|
||||
{
|
||||
update_topline();
|
||||
validate_cursor();
|
||||
#ifdef FEAT_AUTOCMD
|
||||
/* Trigger CursorMoved if the cursor moved. */
|
||||
if (!finish_op && has_cursormoved()
|
||||
&& !equalpos(last_cursormoved, curwin->w_cursor))
|
||||
{
|
||||
apply_autocmds(EVENT_CURSORMOVED, NULL, NULL, FALSE, curbuf);
|
||||
last_cursormoved = curwin->w_cursor;
|
||||
}
|
||||
#endif
|
||||
update_screen(0); /* may need to update the screen */
|
||||
setcursor();
|
||||
out_flush(); /* make sure output has been written */
|
||||
|
||||
@@ -495,7 +495,7 @@ typedef struct Gui
|
||||
#endif
|
||||
|
||||
#ifdef FEAT_GUI_SCROLL_WHEEL_FORCE
|
||||
int scroll_wheel_force;
|
||||
int scroll_wheel_force;
|
||||
#endif
|
||||
} gui_T;
|
||||
|
||||
|
||||
+667
-231
File diff suppressed because it is too large
Load Diff
+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);
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
# Start GUI Vim on a copy of the tutor file.
|
||||
|
||||
# Usage: gvimtutor [xx]
|
||||
# See vimtutor for usage.
|
||||
|
||||
exec `dirname $0`/vimtutor -g "$@"
|
||||
+95
-16
@@ -1400,7 +1400,7 @@ cs_lookup_cmd(eap)
|
||||
return NULL;
|
||||
|
||||
/* Store length of eap->arg before it gets modified by strtok(). */
|
||||
eap_arg_len = STRLEN(eap->arg);
|
||||
eap_arg_len = (int)STRLEN(eap->arg);
|
||||
|
||||
if ((stok = strtok((char *)(eap->arg), (const char *)" ")) == NULL)
|
||||
return NULL;
|
||||
@@ -2096,6 +2096,18 @@ cs_read_prompt(i)
|
||||
return CSCOPE_SUCCESS;
|
||||
}
|
||||
|
||||
#if defined(UNIX) && defined(SIGALRM)
|
||||
/*
|
||||
* Used to catch and ignore SIGALRM below.
|
||||
*/
|
||||
/* ARGSUSED */
|
||||
static RETSIGTYPE
|
||||
sig_handler SIGDEFARG(sigarg)
|
||||
{
|
||||
/* do nothing */
|
||||
SIGRETURN;
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* PRIVATE: cs_release_csp
|
||||
@@ -2108,9 +2120,6 @@ cs_release_csp(i, freefnpp)
|
||||
int i;
|
||||
int freefnpp;
|
||||
{
|
||||
#if defined(UNIX)
|
||||
int pstat;
|
||||
#else
|
||||
/*
|
||||
* Trying to exit normally (not sure whether it is fit to UNIX cscope
|
||||
*/
|
||||
@@ -2119,6 +2128,88 @@ cs_release_csp(i, freefnpp)
|
||||
(void)fputs("q\n", csinfo[i].to_fp);
|
||||
(void)fflush(csinfo[i].to_fp);
|
||||
}
|
||||
#if defined(UNIX)
|
||||
{
|
||||
int waitpid_errno;
|
||||
int pstat;
|
||||
pid_t pid;
|
||||
|
||||
# if defined(HAVE_SIGACTION)
|
||||
struct sigaction sa, old;
|
||||
|
||||
/* Use sigaction() to limit the waiting time to two seconds. */
|
||||
sigemptyset(&sa.sa_mask);
|
||||
sa.sa_handler = sig_handler;
|
||||
sa.sa_flags = SA_NODEFER;
|
||||
sigaction(SIGALRM, &sa, &old);
|
||||
alarm(2); /* 2 sec timeout */
|
||||
|
||||
/* Block until cscope exits or until timer expires */
|
||||
pid = waitpid(csinfo[i].pid, &pstat, 0);
|
||||
waitpid_errno = errno;
|
||||
|
||||
/* cancel pending alarm if still there and restore signal */
|
||||
alarm(0);
|
||||
sigaction(SIGALRM, &old, NULL);
|
||||
# else
|
||||
int waited;
|
||||
|
||||
/* Can't use sigaction(), loop for two seconds. First yield the CPU
|
||||
* to give cscope a chance to exit quickly. */
|
||||
sleep(0);
|
||||
for (waited = 0; waited < 40; ++waited)
|
||||
{
|
||||
pid = waitpid(csinfo[i].pid, &pstat, WNOHANG);
|
||||
waitpid_errno = errno;
|
||||
if (pid != 0)
|
||||
break; /* break unless the process is still running */
|
||||
mch_delay(50L, FALSE); /* sleep 50 ms */
|
||||
}
|
||||
# endif
|
||||
/*
|
||||
* If the cscope process is still running: kill it.
|
||||
* Safety check: If the PID would be zero here, the entire X session
|
||||
* would be killed. -1 and 1 are dangerous as well.
|
||||
*/
|
||||
if (pid < 0 && csinfo[i].pid > 1)
|
||||
{
|
||||
# ifdef ECHILD
|
||||
int alive = TRUE;
|
||||
|
||||
if (waitpid_errno == ECHILD)
|
||||
{
|
||||
/*
|
||||
* When using 'vim -g', vim is forked and cscope process is
|
||||
* no longer a child process but a sibling. So waitpid()
|
||||
* fails with errno being ECHILD (No child processes).
|
||||
* Don't send SIGKILL to cscope immediately but wait
|
||||
* (polling) for it to exit normally as result of sending
|
||||
* the "q" command, hence giving it a chance to clean up
|
||||
* its temporary files.
|
||||
*/
|
||||
int waited;
|
||||
|
||||
sleep(0);
|
||||
for (waited = 0; waited < 40; ++waited)
|
||||
{
|
||||
/* Check whether cscope process is still alive */
|
||||
if (kill(csinfo[i].pid, 0) != 0)
|
||||
{
|
||||
alive = FALSE; /* cscope process no longer exists */
|
||||
break;
|
||||
}
|
||||
mch_delay(50L, FALSE); /* sleep 50ms */
|
||||
}
|
||||
}
|
||||
if (alive)
|
||||
# endif
|
||||
{
|
||||
kill(csinfo[i].pid, SIGKILL);
|
||||
(void)waitpid(csinfo[i].pid, &pstat, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
#else /* !UNIX */
|
||||
if (csinfo[i].hProc != NULL)
|
||||
{
|
||||
/* Give cscope a chance to exit normally */
|
||||
@@ -2133,18 +2224,6 @@ cs_release_csp(i, freefnpp)
|
||||
if (csinfo[i].to_fp != NULL)
|
||||
(void)fclose(csinfo[i].to_fp);
|
||||
|
||||
/*
|
||||
* Safety check: If the PID would be zero here, the entire X session would
|
||||
* be killed. -1 and 1 are dangerous as well.
|
||||
*/
|
||||
#if defined(UNIX)
|
||||
if (csinfo[i].pid > 1)
|
||||
{
|
||||
kill(csinfo[i].pid, SIGTERM);
|
||||
(void)waitpid(csinfo[i].pid, &pstat, 0);
|
||||
}
|
||||
#endif
|
||||
|
||||
if (freefnpp)
|
||||
{
|
||||
vim_free(csinfo[i].fname);
|
||||
|
||||
+9
-3
@@ -34,6 +34,12 @@ extern HWND s_hwnd;
|
||||
extern HWND vim_parent_hwnd;
|
||||
}
|
||||
|
||||
#if _MSC_VER < 1300
|
||||
/* Work around old versions of basetsd.h which wrongly declares
|
||||
* UINT_PTR as unsigned long */
|
||||
# define UINT_PTR UINT
|
||||
#endif
|
||||
|
||||
#include "if_ole.h" // Interface definitions
|
||||
#include "iid_ole.c" // UUID definitions (compile here)
|
||||
|
||||
@@ -107,7 +113,7 @@ public:
|
||||
STDMETHOD(SendKeys)(BSTR keys);
|
||||
STDMETHOD(Eval)(BSTR expr, BSTR *result);
|
||||
STDMETHOD(SetForeground)(void);
|
||||
STDMETHOD(GetHwnd)(UINT *result);
|
||||
STDMETHOD(GetHwnd)(UINT_PTR *result);
|
||||
|
||||
private:
|
||||
// Constructor is private - create using CVim::Create()
|
||||
@@ -288,9 +294,9 @@ CVim::Invoke(
|
||||
}
|
||||
|
||||
STDMETHODIMP
|
||||
CVim::GetHwnd(UINT *result)
|
||||
CVim::GetHwnd(UINT_PTR *result)
|
||||
{
|
||||
*result = (UINT) s_hwnd;
|
||||
*result = (UINT_PTR)s_hwnd;
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -79,7 +79,7 @@ EXTERN_C const IID IID_IVim;
|
||||
virtual HRESULT STDMETHODCALLTYPE SetForeground( void) = 0;
|
||||
|
||||
virtual HRESULT STDMETHODCALLTYPE GetHwnd(
|
||||
/* [retval][out] */ UINT __RPC_FAR *result) = 0;
|
||||
/* [retval][out] */ UINT_PTR __RPC_FAR *result) = 0;
|
||||
|
||||
};
|
||||
|
||||
@@ -143,7 +143,7 @@ EXTERN_C const IID IID_IVim;
|
||||
|
||||
HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetHwnd )(
|
||||
IVim __RPC_FAR * This,
|
||||
/* [retval][out] */ UINT __RPC_FAR *result);
|
||||
/* [retval][out] */ UINT_PTR __RPC_FAR *result);
|
||||
|
||||
END_INTERFACE
|
||||
} IVimVtbl;
|
||||
@@ -236,7 +236,7 @@ void __RPC_STUB IVim_SetForeground_Stub(
|
||||
|
||||
HRESULT STDMETHODCALLTYPE IVim_GetHwnd_Proxy(
|
||||
IVim __RPC_FAR * This,
|
||||
/* [retval][out] */ UINT __RPC_FAR *result);
|
||||
/* [retval][out] */ UINT_PTR __RPC_FAR *result);
|
||||
|
||||
|
||||
void __RPC_STUB IVim_GetHwnd_Stub(
|
||||
|
||||
+1
-1
@@ -20,7 +20,7 @@ interface IVim : IDispatch
|
||||
HRESULT SendKeys([in]BSTR keys);
|
||||
HRESULT Eval([in]BSTR expr, [out, retval]BSTR* result);
|
||||
HRESULT SetForeground(void);
|
||||
HRESULT GetHwnd([out, retval]UINT* result);
|
||||
HRESULT GetHwnd([out, retval]UINT_PTR* result);
|
||||
};
|
||||
|
||||
// Component and type library definitions
|
||||
|
||||
+201
-161
@@ -38,6 +38,8 @@
|
||||
# undef HAVE_STDARG_H /* Python's config.h defines it as well. */
|
||||
#endif
|
||||
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
|
||||
#include <Python.h>
|
||||
#if defined(MACOS) && !defined(MACOS_X_UNIX)
|
||||
# include "macglue.h"
|
||||
@@ -48,11 +50,29 @@
|
||||
|
||||
#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
|
||||
# define PyInt Py_ssize_t
|
||||
# define PyInquiry lenfunc
|
||||
# define PyIntArgFunc ssizeargfunc
|
||||
# define PyIntIntArgFunc ssizessizeargfunc
|
||||
# define PyIntObjArgProc ssizeobjargproc
|
||||
# define PyIntIntObjArgProc ssizessizeobjargproc
|
||||
# define Py_ssize_t_fmt "n"
|
||||
#else
|
||||
# define PyInt int
|
||||
# define PyInquiry inquiry
|
||||
# define PyIntArgFunc intargfunc
|
||||
# define PyIntIntArgFunc intintargfunc
|
||||
# define PyIntObjArgProc intobjargproc
|
||||
# define PyIntIntObjArgProc intintobjargproc
|
||||
# define Py_ssize_t_fmt "i"
|
||||
#endif
|
||||
|
||||
/* Parser flags */
|
||||
@@ -67,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
|
||||
*/
|
||||
@@ -150,11 +179,11 @@ static void (*dll_PyGILState_Release)(PyGILState_STATE);
|
||||
static long(*dll_PyInt_AsLong)(PyObject *);
|
||||
static PyObject*(*dll_PyInt_FromLong)(long);
|
||||
static PyTypeObject* dll_PyInt_Type;
|
||||
static PyObject*(*dll_PyList_GetItem)(PyObject *, int);
|
||||
static PyObject*(*dll_PyList_GetItem)(PyObject *, PyInt);
|
||||
static PyObject*(*dll_PyList_Append)(PyObject *, PyObject *);
|
||||
static PyObject*(*dll_PyList_New)(int size);
|
||||
static int(*dll_PyList_SetItem)(PyObject *, int, PyObject *);
|
||||
static int(*dll_PyList_Size)(PyObject *);
|
||||
static PyObject*(*dll_PyList_New)(PyInt size);
|
||||
static int(*dll_PyList_SetItem)(PyObject *, PyInt, PyObject *);
|
||||
static PyInt(*dll_PyList_Size)(PyObject *);
|
||||
static PyTypeObject* dll_PyList_Type;
|
||||
static PyObject*(*dll_PyImport_ImportModule)(const char *);
|
||||
static PyObject*(*dll_PyDict_New)(void);
|
||||
@@ -163,8 +192,8 @@ static PyObject*(*dll_PyModule_GetDict)(PyObject *);
|
||||
static int(*dll_PyRun_SimpleString)(char *);
|
||||
static char*(*dll_PyString_AsString)(PyObject *);
|
||||
static PyObject*(*dll_PyString_FromString)(const char *);
|
||||
static PyObject*(*dll_PyString_FromStringAndSize)(const char *, int);
|
||||
static int(*dll_PyString_Size)(PyObject *);
|
||||
static PyObject*(*dll_PyString_FromStringAndSize)(const char *, PyInt);
|
||||
static PyInt(*dll_PyString_Size)(PyObject *);
|
||||
static PyTypeObject* dll_PyString_Type;
|
||||
static int(*dll_PySys_SetObject)(char *, PyObject *);
|
||||
static int(*dll_PySys_SetArgv)(int, char **);
|
||||
@@ -251,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},
|
||||
@@ -321,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;
|
||||
}
|
||||
@@ -356,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);
|
||||
@@ -366,12 +398,12 @@ static int PythonMod_Init(void);
|
||||
/* Utility functions for the vim/python interface
|
||||
* ----------------------------------------------
|
||||
*/
|
||||
static PyObject *GetBufferLine(buf_T *, int);
|
||||
static PyObject *GetBufferLineList(buf_T *, int, 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 *, int, int, 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 *);
|
||||
@@ -672,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
|
||||
*/
|
||||
@@ -773,8 +805,8 @@ OutputWrite(PyObject *self, PyObject *args)
|
||||
static PyObject *
|
||||
OutputWritelines(PyObject *self, PyObject *args)
|
||||
{
|
||||
int n;
|
||||
int i;
|
||||
PyInt n;
|
||||
PyInt i;
|
||||
PyObject *list;
|
||||
int error = ((OutputObject *)(self))->error;
|
||||
|
||||
@@ -794,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"));
|
||||
@@ -818,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)
|
||||
@@ -866,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;
|
||||
|
||||
@@ -877,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);
|
||||
|
||||
@@ -986,11 +1018,11 @@ static void BufferDestructor(PyObject *);
|
||||
static PyObject *BufferGetattr(PyObject *, char *);
|
||||
static PyObject *BufferRepr(PyObject *);
|
||||
|
||||
static int BufferLength(PyObject *);
|
||||
static PyObject *BufferItem(PyObject *, int);
|
||||
static PyObject *BufferSlice(PyObject *, int, int);
|
||||
static int BufferAssItem(PyObject *, int, PyObject *);
|
||||
static int BufferAssSlice(PyObject *, int, int, PyObject *);
|
||||
static PyInt BufferLength(PyObject *);
|
||||
static PyObject *BufferItem(PyObject *, PyInt);
|
||||
static PyObject *BufferSlice(PyObject *, PyInt, PyInt);
|
||||
static PyInt BufferAssItem(PyObject *, PyInt, PyObject *);
|
||||
static PyInt BufferAssSlice(PyObject *, PyInt, PyInt, PyObject *);
|
||||
|
||||
static PyObject *BufferAppend(PyObject *, PyObject *);
|
||||
static PyObject *BufferMark(PyObject *, PyObject *);
|
||||
@@ -1004,24 +1036,24 @@ 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 *);
|
||||
static PyObject *RangeRepr(PyObject *);
|
||||
|
||||
static int RangeLength(PyObject *);
|
||||
static PyObject *RangeItem(PyObject *, int);
|
||||
static PyObject *RangeSlice(PyObject *, int, int);
|
||||
static int RangeAssItem(PyObject *, int, PyObject *);
|
||||
static int RangeAssSlice(PyObject *, int, int, PyObject *);
|
||||
static PyInt RangeLength(PyObject *);
|
||||
static PyObject *RangeItem(PyObject *, PyInt);
|
||||
static PyObject *RangeSlice(PyObject *, PyInt, PyInt);
|
||||
static PyInt RangeAssItem(PyObject *, PyInt, PyObject *);
|
||||
static PyInt RangeAssSlice(PyObject *, PyInt, PyInt, PyObject *);
|
||||
|
||||
static PyObject *RangeAppend(PyObject *, PyObject *);
|
||||
|
||||
@@ -1029,15 +1061,15 @@ static PyObject *RangeAppend(PyObject *, PyObject *);
|
||||
* -------------------------------------------
|
||||
*/
|
||||
|
||||
static int WinListLength(PyObject *);
|
||||
static PyObject *WinListItem(PyObject *, int);
|
||||
static PyInt WinListLength(PyObject *);
|
||||
static PyObject *WinListItem(PyObject *, PyInt);
|
||||
|
||||
/* Buffer list type - Implementation functions
|
||||
* -------------------------------------------
|
||||
*/
|
||||
|
||||
static int BufListLength(PyObject *);
|
||||
static PyObject *BufListItem(PyObject *, int);
|
||||
static PyInt BufListLength(PyObject *);
|
||||
static PyObject *BufListItem(PyObject *, PyInt);
|
||||
|
||||
/* Current objects type - Implementation functions
|
||||
* -----------------------------------------------
|
||||
@@ -1051,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 }
|
||||
};
|
||||
|
||||
@@ -1092,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 *
|
||||
@@ -1112,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);
|
||||
@@ -1130,6 +1162,16 @@ VimToPython(typval_T *our_tv, int depth, PyObject *lookupDict)
|
||||
result = Py_BuildValue("s", buf);
|
||||
PyDict_SetItemString(lookupDict, ptrBuf, result);
|
||||
}
|
||||
#ifdef FEAT_FLOAT
|
||||
else if (our_tv->v_type == VAR_FLOAT)
|
||||
{
|
||||
char buf[NUMBUFLEN];
|
||||
|
||||
sprintf(buf, "%f", our_tv->vval.v_float);
|
||||
result = Py_BuildValue("s", buf);
|
||||
PyDict_SetItemString(lookupDict, ptrBuf, result);
|
||||
}
|
||||
#endif
|
||||
else if (our_tv->v_type == VAR_LIST)
|
||||
{
|
||||
list_T *list = our_tv->vval.v_list;
|
||||
@@ -1156,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;
|
||||
|
||||
@@ -1245,7 +1287,7 @@ CheckBuffer(BufferObject *this)
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
RBItem(BufferObject *self, int n, int start, int end)
|
||||
RBItem(BufferObject *self, PyInt n, PyInt start, PyInt end)
|
||||
{
|
||||
if (CheckBuffer(self))
|
||||
return NULL;
|
||||
@@ -1260,9 +1302,9 @@ RBItem(BufferObject *self, int n, int start, int end)
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
RBSlice(BufferObject *self, int lo, int hi, int start, int end)
|
||||
RBSlice(BufferObject *self, PyInt lo, PyInt hi, PyInt start, PyInt end)
|
||||
{
|
||||
int size;
|
||||
PyInt size;
|
||||
|
||||
if (CheckBuffer(self))
|
||||
return NULL;
|
||||
@@ -1283,10 +1325,10 @@ RBSlice(BufferObject *self, int lo, int hi, int start, int end)
|
||||
return GetBufferLineList(self->buf, lo+start, hi+start);
|
||||
}
|
||||
|
||||
static int
|
||||
RBAssItem(BufferObject *self, int n, PyObject *val, int start, int end, int *new_end)
|
||||
static PyInt
|
||||
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;
|
||||
@@ -1306,11 +1348,11 @@ RBAssItem(BufferObject *self, int n, PyObject *val, int start, int end, int *new
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
RBAssSlice(BufferObject *self, int lo, int hi, PyObject *val, int start, int end, int *new_end)
|
||||
static PyInt
|
||||
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))
|
||||
@@ -1340,19 +1382,19 @@ RBAssSlice(BufferObject *self, int lo, int hi, PyObject *val, int start, int end
|
||||
}
|
||||
|
||||
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)
|
||||
@@ -1377,20 +1419,20 @@ 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 }
|
||||
};
|
||||
|
||||
static PySequenceMethods BufferAsSeq = {
|
||||
(inquiry) BufferLength, /* sq_length, len(x) */
|
||||
(PyInquiry) BufferLength, /* sq_length, len(x) */
|
||||
(binaryfunc) 0, /* BufferConcat, */ /* sq_concat, x+y */
|
||||
(intargfunc) 0, /* BufferRepeat, */ /* sq_repeat, x*n */
|
||||
(intargfunc) BufferItem, /* sq_item, x[i] */
|
||||
(intintargfunc) BufferSlice, /* sq_slice, x[i:j] */
|
||||
(intobjargproc) BufferAssItem, /* sq_ass_item, x[i]=v */
|
||||
(intintobjargproc) BufferAssSlice, /* sq_ass_slice, x[i:j]=v */
|
||||
(PyIntArgFunc) 0, /* BufferRepeat, */ /* sq_repeat, x*n */
|
||||
(PyIntArgFunc) BufferItem, /* sq_item, x[i] */
|
||||
(PyIntIntArgFunc) BufferSlice, /* sq_slice, x[i:j] */
|
||||
(PyIntObjArgProc) BufferAssItem, /* sq_ass_item, x[i]=v */
|
||||
(PyIntIntObjArgProc) BufferAssSlice, /* sq_ass_slice, x[i:j]=v */
|
||||
};
|
||||
|
||||
static PyTypeObject BufferType = {
|
||||
@@ -1475,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
|
||||
@@ -1492,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 = "";
|
||||
@@ -1516,7 +1557,7 @@ BufferRepr(PyObject *self)
|
||||
|
||||
/******************/
|
||||
|
||||
static int
|
||||
static PyInt
|
||||
BufferLength(PyObject *self)
|
||||
{
|
||||
/* HOW DO WE SIGNAL AN ERROR FROM THIS FUNCTION? */
|
||||
@@ -1527,32 +1568,32 @@ BufferLength(PyObject *self)
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
BufferItem(PyObject *self, int n)
|
||||
BufferItem(PyObject *self, PyInt n)
|
||||
{
|
||||
return RBItem((BufferObject *)(self), n, 1,
|
||||
(int)((BufferObject *)(self))->buf->b_ml.ml_line_count);
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
BufferSlice(PyObject *self, int lo, int hi)
|
||||
BufferSlice(PyObject *self, PyInt lo, PyInt hi)
|
||||
{
|
||||
return RBSlice((BufferObject *)(self), lo, hi, 1,
|
||||
(int)((BufferObject *)(self))->buf->b_ml.ml_line_count);
|
||||
}
|
||||
|
||||
static int
|
||||
BufferAssItem(PyObject *self, int n, PyObject *val)
|
||||
static PyInt
|
||||
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);
|
||||
}
|
||||
|
||||
static int
|
||||
BufferAssSlice(PyObject *self, int lo, int hi, PyObject *val)
|
||||
static PyInt
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -1560,7 +1601,7 @@ BufferAssSlice(PyObject *self, int lo, int 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);
|
||||
}
|
||||
|
||||
@@ -1605,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);
|
||||
@@ -1622,18 +1663,18 @@ 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 }
|
||||
};
|
||||
|
||||
static PySequenceMethods RangeAsSeq = {
|
||||
(inquiry) RangeLength, /* sq_length, len(x) */
|
||||
(PyInquiry) RangeLength, /* sq_length, len(x) */
|
||||
(binaryfunc) 0, /* RangeConcat, */ /* sq_concat, x+y */
|
||||
(intargfunc) 0, /* RangeRepeat, */ /* sq_repeat, x*n */
|
||||
(intargfunc) RangeItem, /* sq_item, x[i] */
|
||||
(intintargfunc) RangeSlice, /* sq_slice, x[i:j] */
|
||||
(intobjargproc) RangeAssItem, /* sq_ass_item, x[i]=v */
|
||||
(intintobjargproc) RangeAssSlice, /* sq_ass_slice, x[i:j]=v */
|
||||
(PyIntArgFunc) 0, /* RangeRepeat, */ /* sq_repeat, x*n */
|
||||
(PyIntArgFunc) RangeItem, /* sq_item, x[i] */
|
||||
(PyIntIntArgFunc) RangeSlice, /* sq_slice, x[i:j] */
|
||||
(PyIntObjArgProc) RangeAssItem, /* sq_ass_item, x[i]=v */
|
||||
(PyIntIntObjArgProc) RangeAssSlice, /* sq_ass_slice, x[i:j]=v */
|
||||
};
|
||||
|
||||
static PyTypeObject RangeType = {
|
||||
@@ -1663,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;
|
||||
@@ -1697,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);
|
||||
}
|
||||
@@ -1712,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
|
||||
@@ -1738,7 +1779,7 @@ RangeRepr(PyObject *self)
|
||||
|
||||
/****************/
|
||||
|
||||
static int
|
||||
static PyInt
|
||||
RangeLength(PyObject *self)
|
||||
{
|
||||
/* HOW DO WE SIGNAL AN ERROR FROM THIS FUNCTION? */
|
||||
@@ -1749,7 +1790,7 @@ RangeLength(PyObject *self)
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
RangeItem(PyObject *self, int n)
|
||||
RangeItem(PyObject *self, PyInt n)
|
||||
{
|
||||
return RBItem(((RangeObject *)(self))->buf, n,
|
||||
((RangeObject *)(self))->start,
|
||||
@@ -1757,15 +1798,15 @@ RangeItem(PyObject *self, int n)
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
RangeSlice(PyObject *self, int lo, int hi)
|
||||
RangeSlice(PyObject *self, PyInt lo, PyInt hi)
|
||||
{
|
||||
return RBSlice(((RangeObject *)(self))->buf, lo, hi,
|
||||
((RangeObject *)(self))->start,
|
||||
((RangeObject *)(self))->end);
|
||||
}
|
||||
|
||||
static int
|
||||
RangeAssItem(PyObject *self, int n, PyObject *val)
|
||||
static PyInt
|
||||
RangeAssItem(PyObject *self, PyInt n, PyObject *val)
|
||||
{
|
||||
return RBAssItem(((RangeObject *)(self))->buf, n, val,
|
||||
((RangeObject *)(self))->start,
|
||||
@@ -1773,8 +1814,8 @@ RangeAssItem(PyObject *self, int n, PyObject *val)
|
||||
&((RangeObject *)(self))->end);
|
||||
}
|
||||
|
||||
static int
|
||||
RangeAssSlice(PyObject *self, int lo, int hi, PyObject *val)
|
||||
static PyInt
|
||||
RangeAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val)
|
||||
{
|
||||
return RBAssSlice(((RangeObject *)(self))->buf, lo, hi, val,
|
||||
((RangeObject *)(self))->start,
|
||||
@@ -1801,13 +1842,13 @@ typedef struct
|
||||
BufListObject;
|
||||
|
||||
static PySequenceMethods BufListAsSeq = {
|
||||
(inquiry) BufListLength, /* sq_length, len(x) */
|
||||
(PyInquiry) BufListLength, /* sq_length, len(x) */
|
||||
(binaryfunc) 0, /* sq_concat, x+y */
|
||||
(intargfunc) 0, /* sq_repeat, x*n */
|
||||
(intargfunc) BufListItem, /* sq_item, x[i] */
|
||||
(intintargfunc) 0, /* sq_slice, x[i:j] */
|
||||
(intobjargproc) 0, /* sq_ass_item, x[i]=v */
|
||||
(intintobjargproc) 0, /* sq_ass_slice, x[i:j]=v */
|
||||
(PyIntArgFunc) 0, /* sq_repeat, x*n */
|
||||
(PyIntArgFunc) BufListItem, /* sq_item, x[i] */
|
||||
(PyIntIntArgFunc) 0, /* sq_slice, x[i:j] */
|
||||
(PyIntObjArgProc) 0, /* sq_ass_item, x[i]=v */
|
||||
(PyIntIntObjArgProc) 0, /* sq_ass_slice, x[i:j]=v */
|
||||
};
|
||||
|
||||
static PyTypeObject BufListType = {
|
||||
@@ -1837,11 +1878,11 @@ static PyTypeObject BufListType = {
|
||||
*/
|
||||
|
||||
/*ARGSUSED*/
|
||||
static int
|
||||
static PyInt
|
||||
BufListLength(PyObject *self)
|
||||
{
|
||||
buf_T *b = firstbuf;
|
||||
int n = 0;
|
||||
PyInt n = 0;
|
||||
|
||||
while (b)
|
||||
{
|
||||
@@ -1854,7 +1895,7 @@ BufListLength(PyObject *self)
|
||||
|
||||
/*ARGSUSED*/
|
||||
static PyObject *
|
||||
BufListItem(PyObject *self, int n)
|
||||
BufListItem(PyObject *self, PyInt n)
|
||||
{
|
||||
buf_T *b;
|
||||
|
||||
@@ -2087,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
|
||||
@@ -2100,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);
|
||||
|
||||
@@ -2119,13 +2159,13 @@ typedef struct
|
||||
WinListObject;
|
||||
|
||||
static PySequenceMethods WinListAsSeq = {
|
||||
(inquiry) WinListLength, /* sq_length, len(x) */
|
||||
(PyInquiry) WinListLength, /* sq_length, len(x) */
|
||||
(binaryfunc) 0, /* sq_concat, x+y */
|
||||
(intargfunc) 0, /* sq_repeat, x*n */
|
||||
(intargfunc) WinListItem, /* sq_item, x[i] */
|
||||
(intintargfunc) 0, /* sq_slice, x[i:j] */
|
||||
(intobjargproc) 0, /* sq_ass_item, x[i]=v */
|
||||
(intintobjargproc) 0, /* sq_ass_slice, x[i:j]=v */
|
||||
(PyIntArgFunc) 0, /* sq_repeat, x*n */
|
||||
(PyIntArgFunc) WinListItem, /* sq_item, x[i] */
|
||||
(PyIntIntArgFunc) 0, /* sq_slice, x[i:j] */
|
||||
(PyIntObjArgProc) 0, /* sq_ass_item, x[i]=v */
|
||||
(PyIntIntObjArgProc) 0, /* sq_ass_slice, x[i:j]=v */
|
||||
};
|
||||
|
||||
static PyTypeObject WinListType = {
|
||||
@@ -2154,11 +2194,11 @@ static PyTypeObject WinListType = {
|
||||
/* Window list object - Implementation
|
||||
*/
|
||||
/*ARGSUSED*/
|
||||
static int
|
||||
static PyInt
|
||||
WinListLength(PyObject *self)
|
||||
{
|
||||
win_T *w = firstwin;
|
||||
int n = 0;
|
||||
PyInt n = 0;
|
||||
|
||||
while (w != NULL)
|
||||
{
|
||||
@@ -2171,7 +2211,7 @@ WinListLength(PyObject *self)
|
||||
|
||||
/*ARGSUSED*/
|
||||
static PyObject *
|
||||
WinListItem(PyObject *self, int n)
|
||||
WinListItem(PyObject *self, PyInt n)
|
||||
{
|
||||
win_T *w;
|
||||
|
||||
@@ -2226,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)
|
||||
@@ -2244,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;
|
||||
@@ -2316,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");
|
||||
@@ -2341,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));
|
||||
}
|
||||
@@ -2351,10 +2391,10 @@ GetBufferLine(buf_T *buf, int n)
|
||||
* including, hi. The list is returned as a Python list of string objects.
|
||||
*/
|
||||
static PyObject *
|
||||
GetBufferLineList(buf_T *buf, int lo, int hi)
|
||||
GetBufferLineList(buf_T *buf, PyInt lo, PyInt hi)
|
||||
{
|
||||
int i;
|
||||
int n = hi - lo;
|
||||
PyInt i;
|
||||
PyInt n = hi - lo;
|
||||
PyObject *list = PyList_New(n);
|
||||
|
||||
if (list == NULL)
|
||||
@@ -2394,7 +2434,7 @@ GetBufferLineList(buf_T *buf, int lo, int 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)
|
||||
{
|
||||
@@ -2426,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:
|
||||
@@ -2449,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;
|
||||
@@ -2517,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, int lo, int 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:
|
||||
@@ -2527,8 +2567,8 @@ SetBufferLineList(buf_T *buf, int lo, int hi, PyObject *list, int *len_change)
|
||||
*/
|
||||
if (list == Py_None || list == NULL)
|
||||
{
|
||||
int i;
|
||||
int n = hi - lo;
|
||||
PyInt i;
|
||||
PyInt n = (int)(hi - lo);
|
||||
buf_T *savebuf = curbuf;
|
||||
|
||||
PyErr_Clear();
|
||||
@@ -2549,7 +2589,7 @@ SetBufferLineList(buf_T *buf, int lo, int hi, PyObject *list, int *len_change)
|
||||
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;
|
||||
@@ -2564,10 +2604,10 @@ SetBufferLineList(buf_T *buf, int lo, int hi, PyObject *list, int *len_change)
|
||||
}
|
||||
else if (PyList_Check(list))
|
||||
{
|
||||
int i;
|
||||
int new_len = PyList_Size(list);
|
||||
int old_len = hi - lo;
|
||||
int extra = 0; /* lines added to text, can be negative */
|
||||
PyInt i;
|
||||
PyInt new_len = PyList_Size(list);
|
||||
PyInt old_len = hi - lo;
|
||||
PyInt extra = 0; /* lines added to text, can be negative */
|
||||
char **array;
|
||||
buf_T *savebuf;
|
||||
|
||||
@@ -2678,7 +2718,7 @@ SetBufferLineList(buf_T *buf, int lo, int hi, PyObject *list, int *len_change)
|
||||
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;
|
||||
|
||||
@@ -2706,7 +2746,7 @@ SetBufferLineList(buf_T *buf, int lo, int hi, PyObject *list, int *len_change)
|
||||
* 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.
|
||||
@@ -2745,8 +2785,8 @@ InsertBufferLines(buf_T *buf, int n, PyObject *lines, int *len_change)
|
||||
}
|
||||
else if (PyList_Check(lines))
|
||||
{
|
||||
int i;
|
||||
int size = PyList_Size(lines);
|
||||
PyInt i;
|
||||
PyInt size = PyList_Size(lines);
|
||||
char **array;
|
||||
buf_T *savebuf;
|
||||
|
||||
@@ -2831,7 +2871,7 @@ InsertBufferLines(buf_T *buf, int n, PyObject *lines, int *len_change)
|
||||
LineToString(const char *str)
|
||||
{
|
||||
PyObject *result;
|
||||
int len = strlen(str);
|
||||
PyInt len = strlen(str);
|
||||
char *p;
|
||||
|
||||
/* Allocate an Python string object, with uninitialised contents. We
|
||||
@@ -2871,8 +2911,8 @@ StringToLine(PyObject *obj)
|
||||
{
|
||||
const char *str;
|
||||
char *save;
|
||||
int len;
|
||||
int i;
|
||||
PyInt len;
|
||||
PyInt i;
|
||||
char *p;
|
||||
|
||||
if (obj == NULL || !PyString_Check(obj))
|
||||
|
||||
+4
-4
@@ -1605,15 +1605,15 @@ early_arg_scan(parmp)
|
||||
else if (STRICMP(argv[i], "--socketid") == 0)
|
||||
# endif
|
||||
{
|
||||
unsigned int id;
|
||||
int count;
|
||||
long_u id;
|
||||
int count;
|
||||
|
||||
if (i == argc - 1)
|
||||
mainerr_arg_missing((char_u *)argv[i]);
|
||||
if (STRNICMP(argv[i+1], "0x", 2) == 0)
|
||||
count = sscanf(&(argv[i + 1][2]), "%x", &id);
|
||||
count = sscanf(&(argv[i + 1][2]), SCANF_HEX_LONG_U, &id);
|
||||
else
|
||||
count = sscanf(argv[i+1], "%u", &id);
|
||||
count = sscanf(argv[i + 1], SCANF_DECIMAL_LONG_U, &id);
|
||||
if (count != 1)
|
||||
mainerr(ME_INVALID_ARG, (char_u *)argv[i]);
|
||||
else
|
||||
|
||||
+1
-1
@@ -522,7 +522,7 @@ fname2fnum(fm)
|
||||
int len;
|
||||
|
||||
expand_env((char_u *)"~/", NameBuff, MAXPATHL);
|
||||
len = STRLEN(NameBuff);
|
||||
len = (int)STRLEN(NameBuff);
|
||||
vim_strncpy(NameBuff + len, fm->fname + 2, MAXPATHL - len - 1);
|
||||
}
|
||||
else
|
||||
|
||||
+9
-6
@@ -1973,8 +1973,10 @@ utf_class(c)
|
||||
{0x205f, 0x205f, 0},
|
||||
{0x2060, 0x27ff, 1}, /* punctuation and symbols */
|
||||
{0x2070, 0x207f, 0x2070}, /* superscript */
|
||||
{0x2080, 0x208f, 0x2080}, /* subscript */
|
||||
{0x2983, 0x2998, 1},
|
||||
{0x2080, 0x2094, 0x2080}, /* subscript */
|
||||
{0x20a0, 0x27ff, 1}, /* all kinds of symbols */
|
||||
{0x2800, 0x28ff, 0x2800}, /* braille */
|
||||
{0x2900, 0x2998, 1}, /* arrows, brackets, etc. */
|
||||
{0x29d8, 0x29db, 1},
|
||||
{0x29fc, 0x29fd, 1},
|
||||
{0x3000, 0x3000, 0}, /* ideographic space */
|
||||
@@ -5518,13 +5520,13 @@ preedit_callback_setup(GdkIC *ic)
|
||||
preedit_caret_cb.callback = (XIMProc)preedit_caret_cbproc;
|
||||
preedit_done_cb.callback = (XIMProc)preedit_done_cbproc;
|
||||
preedit_attr
|
||||
= XVaCreateNestedList (0,
|
||||
= XVaCreateNestedList(0,
|
||||
XNPreeditStartCallback, &preedit_start_cb,
|
||||
XNPreeditDrawCallback, &preedit_draw_cb,
|
||||
XNPreeditCaretCallback, &preedit_caret_cb,
|
||||
XNPreeditDoneCallback, &preedit_done_cb,
|
||||
0);
|
||||
XSetICValues (xxic, XNPreeditAttributes, preedit_attr, 0);
|
||||
NULL);
|
||||
XSetICValues(xxic, XNPreeditAttributes, preedit_attr, NULL);
|
||||
XFree(preedit_attr);
|
||||
}
|
||||
|
||||
@@ -5534,7 +5536,8 @@ reset_state_setup(GdkIC *ic)
|
||||
{
|
||||
#ifdef USE_X11R6_XIM
|
||||
/* don't change the input context when we call reset */
|
||||
XSetICValues(((GdkICPrivate*)ic)->xic, XNResetState, XIMPreserveState, 0);
|
||||
XSetICValues(((GdkICPrivate *)ic)->xic, XNResetState, XIMPreserveState,
|
||||
NULL);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@@ -1346,5 +1346,10 @@ mf_do_open(mfp, fname, flags)
|
||||
mfp->mf_ffname = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
#ifdef HAVE_SELINUX
|
||||
mch_copy_sec(fname, mfp->mf_fname);
|
||||
#endif
|
||||
mch_hide(mfp->mf_fname); /* try setting the 'hidden' flag */
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user