diff --git a/runtime/doc/todo.txt b/runtime/doc/todo.txt
index 5ff1e3b..cab1148 100644
--- a/runtime/doc/todo.txt
+++ b/runtime/doc/todo.txt
@@ -1098,10 +1098,6 @@
 - Conceal feature: no update when moving to another window. (Dominique Pelle,
   2010 Jul 5)  Vince will look into it.
 Patches to possibly include:
-- 'colorcolumn': make it local to window.
-  Alternative patch. (2010 Feb 2, Gregor Uhlenheuer, update 2010 Jul 12)
-- Another patch for Javascript indenting. (Hari Kumar, 2010 Jul 11)
-  Needs a few tests.
 - Add different highlighting for a fold line depending on the fold level.
   Patch. (Noel Henson, 2009 Sep 13)
 - Patch to make synIDattr() work for GUI attributes in Vim without GUI
@@ -1116,6 +1112,8 @@
     Docs patch by Dominique Pelle, Mar 25
     Update 2009 Mar 28.
     Fix for invalid memory access. (Lech Lorens, 2009 Apr 17)
+- Another patch for Javascript indenting. (Hari Kumar, 2010 Jul 11)
+  Needs a few tests.
 - Disable setting 'encoding' from a modeline?  It usually causes problems,
   can't do any good.  (Patch from Patrick Texier, 2008 Dec 9)
 - Redraw problem when appending digraph causes line to wrap. (James Vega, 2007
diff --git a/src/os_mac.h b/src/os_mac.h
index 05b572d..cf575dd 100644
--- a/src/os_mac.h
+++ b/src/os_mac.h
@@ -299,15 +299,3 @@
 
 /* A Mac constant causing big problem to syntax highlighting */
 #define UNKNOWN_CREATOR '\?\?\?\?'
-
-/*
- * for debugging
- */
-#ifdef MACOS_X
-# ifdef _DEBUG
-#  define TRACE			Trace
-   void Trace(char *fmt, ...);
-# else
-#  define TRACE			1 ? (void)0 : printf
-# endif
-#endif
diff --git a/src/os_macosx.m b/src/os_macosx.m
index 619e86d..34a7012 100644
--- a/src/os_macosx.m
+++ b/src/os_macosx.m
@@ -19,533 +19,12 @@
 #import <Cocoa/Cocoa.h>
 
 
-NSString *VimPboardType = @"VimPboardType";
-
-
-#ifdef _DEBUG
-    void
-Trace(char* fmt, ...)
-{
-    char buf[2048];
-    va_list args;
-
-    va_start(args, fmt);
-    /* vsnprintf(buf, sizeof(buf), fmt, args);*/
-    fprintf(stderr, "%s", buf);
-    va_end(args);
-}
-#endif
-
-#ifdef MACOS_X_ICONVEMU
-/*
- * Libiconv emulation layer
- */
-
-struct _iconv_t
-{
-    TECObjectRef tec;
-    TECObjectRef tecReverse;
-    TECSnifferObjectRef sniff;
-    TextEncoding from;
-    TextEncoding to;
-};
-/* typedef struct _iconv_t *iconv_t; */
-
-
-static int last_errno = 0;
-
-/*
- * Get TextEncoding from iconv's encoding name
- */
-    static TextEncoding
-get_textencoding(const char* encodename)
-{
-    static struct {
-	const char* name;
-	TextEncoding encode;
-    } encodetable[] = {
-	/* ISO-8859 encodings family */
-	{"latin1", kTextEncodingISOLatin1},
-	{"latin2", kTextEncodingISOLatin2},
-	{"latin3", kTextEncodingISOLatin3},
-	{"latin4", kTextEncodingISOLatin4},
-	{"latin5", kTextEncodingISOLatin5},
-	{"latin6", kTextEncodingISOLatin6},
-	{"latin7", kTextEncodingISOLatin7},
-	{"latin8", kTextEncodingISOLatin8},
-	{"latin9", kTextEncodingISOLatin9},
-	{"iso-8859-1", kTextEncodingISOLatin1},
-	{"iso-8859-2", kTextEncodingISOLatin2},
-	{"iso-8859-3", kTextEncodingISOLatin3},
-	{"iso-8859-4", kTextEncodingISOLatin4},
-	{"iso-8859-5", kTextEncodingISOLatinCyrillic},
-	{"iso-8859-6", kTextEncodingISOLatinArabic},
-	{"iso-8859-7", kTextEncodingISOLatinGreek},
-	{"iso-8859-8", kTextEncodingISOLatinHebrew},
-	{"iso-8859-9", kTextEncodingISOLatin5},
-	{"iso-8859-10", kTextEncodingISOLatin6},
-	{"iso-8859-15", kTextEncodingISOLatin9},
-
-	/* Unicode encodings. */
-	/* TODO: Add other type of unicode */
-	{"ucs-2", kTextEncodingMacUnicode},
-
-	/* Japanese encoding aliases */
-	{"cp932", kTextEncodingShiftJIS},
-	{"shift-jis", kTextEncodingShiftJIS},
-	{"euc-jp", kTextEncodingEUC_JP},
-	{"iso-2022-jp", kTextEncodingISO_2022_JP},
-	{"iso-2022-jp-1", kTextEncodingISO_2022_JP_1},
-	{"iso-2022-jp-2", kTextEncodingISO_2022_JP_2},
-	{"iso-2022-jp-3", kTextEncodingISO_2022_JP_3},
-
-	/* Other aliases. These aliases in this block are just guessed. */
-	/* TODO: Must be verified. */
-	{"gb2312", kTextEncodingGB_2312_80},
-	{"cp936", kTextEncodingMacChineseSimp},
-	{"euc-cn", kTextEncodingEUC_CN},
-	{"cp950", kTextEncodingMacChineseTrad},
-	{"euc-tw", kTextEncodingEUC_TW},
-	{"cp949", kTextEncodingMacKorean},
-	{"euc-kr", kTextEncodingEUC_KR},
-
-	/*
-	 * All encodings supported by Macintosh.  You can find these values
-	 * in a file:
-	 *  /System/Library/Frameworks/CoreServices.framework/Versions/A/
-	 *    Frameworks/CarbonCore.framework/Versions/A/Headers/TextCommon.h
-	 */
-	{"MacRoman", kTextEncodingMacRoman},
-	{"MacJapanese", kTextEncodingMacJapanese},
-	{"MacChineseTrad", kTextEncodingMacChineseTrad},
-	{"MacKorean", kTextEncodingMacKorean},
-	{"MacArabic", kTextEncodingMacArabic},
-	{"MacHebrew", kTextEncodingMacHebrew},
-	{"MacGreek", kTextEncodingMacGreek},
-	{"MacCyrillic", kTextEncodingMacCyrillic},
-	{"MacDevanagari", kTextEncodingMacDevanagari},
-	{"MacGurmukhi", kTextEncodingMacGurmukhi},
-	{"MacGujarati", kTextEncodingMacGujarati},
-	{"MacOriya", kTextEncodingMacOriya},
-	{"MacBengali", kTextEncodingMacBengali},
-	{"MacTamil", kTextEncodingMacTamil},
-	{"MacTelugu", kTextEncodingMacTelugu},
-	{"MacKannada", kTextEncodingMacKannada},
-	{"MacMalayalam", kTextEncodingMacMalayalam},
-	{"MacSinhalese", kTextEncodingMacSinhalese},
-	{"MacBurmese", kTextEncodingMacBurmese},
-	{"MacKhmer", kTextEncodingMacKhmer},
-	{"MacThai", kTextEncodingMacThai},
-	{"MacLaotian", kTextEncodingMacLaotian},
-	{"MacGeorgian", kTextEncodingMacGeorgian},
-	{"MacArmenian", kTextEncodingMacArmenian},
-	{"MacChineseSimp", kTextEncodingMacChineseSimp},
-	{"MacTibetan", kTextEncodingMacTibetan},
-	{"MacMongolian", kTextEncodingMacMongolian},
-	{"MacEthiopic", kTextEncodingMacEthiopic},
-	{"MacCentralEurRoman", kTextEncodingMacCentralEurRoman},
-	{"MacVietnamese", kTextEncodingMacVietnamese},
-	{"MacExtArabic", kTextEncodingMacExtArabic},
-	{"MacSymbol", kTextEncodingMacSymbol},
-	{"MacDingbats", kTextEncodingMacDingbats},
-	{"MacTurkish", kTextEncodingMacTurkish},
-	{"MacCroatian", kTextEncodingMacCroatian},
-	{"MacIcelandic", kTextEncodingMacIcelandic},
-	{"MacRomanian", kTextEncodingMacRomanian},
-	{"MacCeltic", kTextEncodingMacCeltic},
-	{"MacGaelic", kTextEncodingMacGaelic},
-	{"MacKeyboardGlyphs", kTextEncodingMacKeyboardGlyphs},
-	{"MacTradChinese", kTextEncodingMacTradChinese},
-	{"MacRSymbol", kTextEncodingMacRSymbol},
-	{"MacSimpChinese", kTextEncodingMacSimpChinese},
-	{"MacGeez", kTextEncodingMacGeez},
-	{"MacEastEurRoman", kTextEncodingMacEastEurRoman},
-	{"MacUninterp", kTextEncodingMacUninterp},
-	{"MacUnicode", kTextEncodingMacUnicode},
-	{"MacFarsi", kTextEncodingMacFarsi},
-	{"MacUkrainian", kTextEncodingMacUkrainian},
-	{"MacInuit", kTextEncodingMacInuit},
-	{"MacVT100", kTextEncodingMacVT100},
-	{"MacHFS", kTextEncodingMacHFS},
-	{"UnicodeDefault", kTextEncodingUnicodeDefault},
-	{"UnicodeV1_1", kTextEncodingUnicodeV1_1},
-	{"ISO10646_1993", kTextEncodingISO10646_1993},
-	{"UnicodeV2_0", kTextEncodingUnicodeV2_0},
-	{"UnicodeV2_1", kTextEncodingUnicodeV2_1},
-	{"UnicodeV3_0", kTextEncodingUnicodeV3_0},
-	{"UnicodeV3_1", kTextEncodingUnicodeV3_1},
-	{"UnicodeV3_2", kTextEncodingUnicodeV3_2},
-	{"ISOLatin1", kTextEncodingISOLatin1},
-	{"ISOLatin2", kTextEncodingISOLatin2},
-	{"ISOLatin3", kTextEncodingISOLatin3},
-	{"ISOLatin4", kTextEncodingISOLatin4},
-	{"ISOLatinCyrillic", kTextEncodingISOLatinCyrillic},
-	{"ISOLatinArabic", kTextEncodingISOLatinArabic},
-	{"ISOLatinGreek", kTextEncodingISOLatinGreek},
-	{"ISOLatinHebrew", kTextEncodingISOLatinHebrew},
-	{"ISOLatin5", kTextEncodingISOLatin5},
-	{"ISOLatin6", kTextEncodingISOLatin6},
-	{"ISOLatin7", kTextEncodingISOLatin7},
-	{"ISOLatin8", kTextEncodingISOLatin8},
-	{"ISOLatin9", kTextEncodingISOLatin9},
-	{"DOSLatinUS", kTextEncodingDOSLatinUS},
-	{"DOSGreek", kTextEncodingDOSGreek},
-	{"DOSBalticRim", kTextEncodingDOSBalticRim},
-	{"DOSLatin1", kTextEncodingDOSLatin1},
-	{"DOSGreek1", kTextEncodingDOSGreek1},
-	{"DOSLatin2", kTextEncodingDOSLatin2},
-	{"DOSCyrillic", kTextEncodingDOSCyrillic},
-	{"DOSTurkish", kTextEncodingDOSTurkish},
-	{"DOSPortuguese", kTextEncodingDOSPortuguese},
-	{"DOSIcelandic", kTextEncodingDOSIcelandic},
-	{"DOSHebrew", kTextEncodingDOSHebrew},
-	{"DOSCanadianFrench", kTextEncodingDOSCanadianFrench},
-	{"DOSArabic", kTextEncodingDOSArabic},
-	{"DOSNordic", kTextEncodingDOSNordic},
-	{"DOSRussian", kTextEncodingDOSRussian},
-	{"DOSGreek2", kTextEncodingDOSGreek2},
-	{"DOSThai", kTextEncodingDOSThai},
-	{"DOSJapanese", kTextEncodingDOSJapanese},
-	{"DOSChineseSimplif", kTextEncodingDOSChineseSimplif},
-	{"DOSKorean", kTextEncodingDOSKorean},
-	{"DOSChineseTrad", kTextEncodingDOSChineseTrad},
-	{"WindowsLatin1", kTextEncodingWindowsLatin1},
-	{"WindowsANSI", kTextEncodingWindowsANSI},
-	{"WindowsLatin2", kTextEncodingWindowsLatin2},
-	{"WindowsCyrillic", kTextEncodingWindowsCyrillic},
-	{"WindowsGreek", kTextEncodingWindowsGreek},
-	{"WindowsLatin5", kTextEncodingWindowsLatin5},
-	{"WindowsHebrew", kTextEncodingWindowsHebrew},
-	{"WindowsArabic", kTextEncodingWindowsArabic},
-	{"WindowsBalticRim", kTextEncodingWindowsBalticRim},
-	{"WindowsVietnamese", kTextEncodingWindowsVietnamese},
-	{"WindowsKoreanJohab", kTextEncodingWindowsKoreanJohab},
-	{"US_ASCII", kTextEncodingUS_ASCII},
-	{"JIS_X0201_76", kTextEncodingJIS_X0201_76},
-	{"JIS_X0208_83", kTextEncodingJIS_X0208_83},
-	{"JIS_X0208_90", kTextEncodingJIS_X0208_90},
-	{"JIS_X0212_90", kTextEncodingJIS_X0212_90},
-	{"JIS_C6226_78", kTextEncodingJIS_C6226_78},
-	{"ShiftJIS_X0213_00", kTextEncodingShiftJIS_X0213_00},
-	{"GB_2312_80", kTextEncodingGB_2312_80},
-	{"GBK_95", kTextEncodingGBK_95},
-	{"GB_18030_2000", kTextEncodingGB_18030_2000},
-	{"KSC_5601_87", kTextEncodingKSC_5601_87},
-	{"KSC_5601_92_Johab", kTextEncodingKSC_5601_92_Johab},
-	{"CNS_11643_92_P1", kTextEncodingCNS_11643_92_P1},
-	{"CNS_11643_92_P2", kTextEncodingCNS_11643_92_P2},
-	{"CNS_11643_92_P3", kTextEncodingCNS_11643_92_P3},
-	{"ISO_2022_JP", kTextEncodingISO_2022_JP},
-	{"ISO_2022_JP_2", kTextEncodingISO_2022_JP_2},
-	{"ISO_2022_JP_1", kTextEncodingISO_2022_JP_1},
-	{"ISO_2022_JP_3", kTextEncodingISO_2022_JP_3},
-	{"ISO_2022_CN", kTextEncodingISO_2022_CN},
-	{"ISO_2022_CN_EXT", kTextEncodingISO_2022_CN_EXT},
-	{"ISO_2022_KR", kTextEncodingISO_2022_KR},
-	{"EUC_JP", kTextEncodingEUC_JP},
-	{"EUC_CN", kTextEncodingEUC_CN},
-	{"EUC_TW", kTextEncodingEUC_TW},
-	{"EUC_KR", kTextEncodingEUC_KR},
-	{"ShiftJIS", kTextEncodingShiftJIS},
-	{"KOI8_R", kTextEncodingKOI8_R},
-	{"Big5", kTextEncodingBig5},
-	{"MacRomanLatin1", kTextEncodingMacRomanLatin1},
-	{"HZ_GB_2312", kTextEncodingHZ_GB_2312},
-	{"Big5_HKSCS_1999", kTextEncodingBig5_HKSCS_1999},
-	{"NextStepLatin", kTextEncodingNextStepLatin},
-	{"EBCDIC_US", kTextEncodingEBCDIC_US},
-	{"EBCDIC_CP037", kTextEncodingEBCDIC_CP037},
-	{"MultiRun", kTextEncodingMultiRun},
-
-	/* Terminator */
-	{NULL, -1},
-    };
-    int i;
-
-    i = 0;
-    for (i = 0; encodetable[i].name != NULL; ++i)
-    {
-	if (STRICMP(encodename, encodetable[i].name) == 0)
-	    break;
-    }
-    return encodetable[i].encode;
-}
-
-/*
- * iconv interfaces
- */
-
-    iconv_t
-iconv_open(const char* tocode, const char* fromcode)
-{
-    TextEncoding toEnc, fromEnc;
-    iconv_t cd = NULL;
-    OSStatus st;
-
-    /* Verify to/from encoding name */
-    toEnc = get_textencoding(tocode);
-    fromEnc = get_textencoding(fromcode);
-    if (toEnc < 0 || fromEnc < 0)
-	goto ICONV_OPEN_ERR;
-
-    /* Allocate memory to object */
-    cd = (iconv_t)alloc(sizeof(struct _iconv_t));
-    if (!cd)
-	goto ICONV_OPEN_ERR;
-    vim_memset(cd, 0, sizeof(struct _iconv_t));
-
-    /* Create converter */
-    if (fromEnc != toEnc)
-    {
-	TRACE("*** fromEnc=%d toEnc=%d\n", (int)fromEnc, (int)toEnc);
-	st = TECCreateConverter(&cd->tec, fromEnc, toEnc);
-	if (st != 0)
-	{
-	    TRACE("*** TECCreateConverter()=%d\n", (int)st);
-	    goto ICONV_OPEN_ERR;
-	}
-	/* Create reverse converter */
-	st = TECCreateConverter(&cd->tecReverse, toEnc, fromEnc);
-	if (st != 0)
-	{
-	    TRACE("*** TECCreateConverter()=%d (reverse)\n", (int)st);
-	    goto ICONV_OPEN_ERR;
-	}
-	/* Create Sniffer */
-	st = TECCreateSniffer(&cd->sniff, &fromEnc, 1);
-	if (st != 0)
-	{
-	    TRACE("*** TECCreateSniffer()=%d\n", (int)st);
-	    goto ICONV_OPEN_ERR;
-	}
-    }
-
-    cd->from = fromEnc;
-    cd->to = toEnc;
-    last_errno = 0;
-    return cd;
-
-ICONV_OPEN_ERR:
-    if (cd)
-	iconv_close(cd);
-    last_errno = EINVAL;
-    return (iconv_t)-1;
-}
-
-/*
- * Used when there are same value in 'from encoding' and 'to encoding'.
- * TEC doesn't support conversion between same encodings, and
- * TECCreateConverter() failed.
- */
-    static size_t
-null_conv(iconv_t cd, const char **inbuf, size_t *inbytesleft,
-	char **outbuf, size_t *outbytesleft)
-{
-    const char* buf_in = inbuf && *inbuf ? *inbuf : NULL;
-    char* buf_out = outbuf && *outbuf ? *outbuf : NULL;
-
-    if (buf_in)
-    {
-	int in_len = inbytesleft ? *inbytesleft : 0;
-	int out_len = outbytesleft ? *outbytesleft : 0;
-
-	if (!buf_out || out_len <= 0)
-	{
-	    last_errno = E2BIG;
-	    return -1;
-	}
-	else if (in_len > 0)
-	{
-	    int len = in_len < out_len ? in_len : out_len;
-
-	    memcpy (buf_out, buf_in, len);
-	    *inbuf += len;
-	    *outbuf += len;
-	    *inbytesleft -= len;
-	    *outbytesleft -= len;
-	    if (*outbytesleft <= 0)
-	    {
-		last_errno = E2BIG;
-		return -1;
-	    }
-	}
-    }
-    last_errno = 0;
-    return 0;
-}
-
-    size_t
-iconv(iconv_t cd, const char **inbuf, size_t *inbytesleft,
-	char **outbuf, size_t *outbytesleft)
-{
-    ConstTextPtr    buf_in;
-    TextPtr	    buf_out;
-    ByteCount	    out_len, out_true;
-    ByteCount	    in_len, in_true;
-    OSStatus	    st;
-
-    if (!cd)
-    {
-	last_errno = ENOENT; /* TODO: Another error code should be set */
-	return -1;
-    }
-    if (cd->from == cd->to)
-	return null_conv(cd, inbuf, inbytesleft, outbuf, outbytesleft) ;
-
-    buf_in = (TextPtr) inbuf ;
-    buf_out = (TextPtr) outbuf ;
-    out_len = out_true = -1;
-    in_len = in_true = -1;
-
-    if (buf_in && buf_out)
-    {
-	ItemCount error, feature;
-
-	/* Normal convert mode */
-	if (!inbytesleft || !outbytesleft)
-	{
-	    last_errno = EFAULT;
-	    return -1;
-	}
-	in_len = *inbytesleft;
-	out_len = *outbytesleft;
-
-	/* Check stream is form in expected encoding or not */
-	st = TECSniffTextEncoding(cd->sniff, (TextPtr)buf_in, in_len,
-		&cd->from, 1, &error, 1, &feature, 1);
-	TRACE("TECSniffTextEncoding()=%d error=%d feature=%d\n",
-		(int)st, (int)error, (int)feature);
-	if ((error != 0 || feature == 0)
-		&& !(error == 0xffffffff && feature == 0xffffffff))
-	    /* Not expected encoding */
-	    st = kTECUnmappableElementErr;
-	else
-	{
-	    /* Do convert */
-	    st = TECConvertText(cd->tec,
-		    buf_in, in_len, &in_true,
-		    buf_out, out_len, &out_true);
-	    /* Verify converted text.  Compare original text with reverse
-	     * converted text.  If not match, there is some problem on
-	     * converting. */
-	    if (st == 0 && in_true > 0)
-	    {
-		ByteCount rev_in, rev_out;
-		TextPtr buf_rev = (TextPtr)alloc(in_true);
-
-		if (buf_rev)
-		{
-		    st = TECConvertText(cd->tecReverse,
-			    buf_out, out_true, &rev_in,
-			    buf_rev, in_true, &rev_out);
-		    if (st != 0 || rev_in != out_true || rev_out != in_true
-			    || memcmp(buf_rev, buf_in, rev_out) != 0)
-		    {
-#ifdef ICONVOSX_DEBUG
-			fprintf(stderr, "  reverse conversion failed.\n");
-#endif
-			st = kTECUnmappableElementErr;
-		    }
-		    vim_free(buf_rev);
-		}
-		else
-		    st = kTECUnmappableElementErr;
-	    }
-	}
-    }
-    else if (!buf_in && buf_out)
-    {
-	/* Flush all buffered strings to buffer, and reset status */
-	if (!outbytesleft)
-	{
-	    last_errno = EFAULT;
-	    return -1;
-	}
-	out_len = *outbytesleft;
-	st = TECFlushText(cd->tec,
-		buf_out, out_len, &out_true);
-    }
-    else if (!buf_in && !buf_out)
-    {
-	/* Reset cd's status and cancel buffered strings */
-	unsigned char tmp_out[256];
-
-	buf_out = tmp_out;
-	out_len = sizeof(tmp_out);
-	st = TECFlushText(cd->tec,
-		buf_out, out_len, &out_true);
-    }
-    else
-    {
-	last_errno = EFAULT;
-	return -1;
-    }
-    TRACE("st=%d, buf_in=%p, in_len=%d, in_true=%d\n"
-	    "  buf_out=%p, out_len=%d, out_true=%d\n", (int)st,
-	    buf_in, (int)in_len, (int)in_true,
-	    buf_out, (int)out_len, (int)out_true);
-
-    switch (st)
-    {
-	case 0:
-	    /* No error */
-	    if (inbytesleft)
-		*inbytesleft -= in_true;
-	    if (outbytesleft)
-		*outbytesleft -= out_true;
-	    if (inbuf && *inbuf)
-		*inbuf += in_true;
-	    if (outbuf && *outbuf)
-		*outbuf += out_true;
-	    last_errno = 0;
-	    return 0; /* No error */
-	case kTECUnmappableElementErr:
-	    last_errno = EILSEQ;
-	case kTECIncompleteElementErr:
-	    last_errno = EINVAL;
-	case kTECOutputBufferFullStatus:
-	    last_errno = E2BIG;
-	    return -1;
-	default:
-	    TRACE("iconv(%p, %p, %p, %p, %p) failed. (%d)\n",
-		    cd, inbuf, inbytesleft, outbuf, outbytesleft, (int)st);
-	    last_errno = EFAULT;
-	    return -1;
-    }
-}
-
-    int
-iconv_close(iconv_t cd)
-{
-    if (cd)
-    {
-	/* Free all elements of iconv_t */
-	if (cd->tec)
-	    TECDisposeConverter(cd->tec);
-	if (cd->tecReverse)
-	    TECDisposeConverter(cd->tecReverse);
-	if (cd->sniff)
-	    TECDisposeSniffer(cd->sniff);
-	vim_free(cd);
-	last_errno = 0;
-	return 0;
-    }
-    else
-    {
-	last_errno = EINVAL;
-	return -1;
-    }
-}
-
-    int *
-iconv_errno()
-{
-    return &last_errno;
-}
-#endif /* MACOS_X_ICONVEMU */
-
 #ifdef FEAT_CLIPBOARD
 
+/* Used to identify clipboard data copied from Vim. */
+
+NSString *VimPboardType = @"VimPboardType";
+
     void
 clip_mch_lose_selection(VimClipboard *cbd)
 {
