129

Is there a way to force Xcode to trim trailing whitespaces when I save file?

I'm using version 3.1.3 if that matters.

Keith Smiley
  • 61,481
  • 12
  • 97
  • 110
Alexander Gladysh
  • 39,865
  • 32
  • 103
  • 160

9 Answers9

293

Starting from Xcode 4.4 whitespaces will be trimmed automatically by default, unless the line is all whitespace. You can also activate Including whitespace-only lines to fix this, which is not active by default.

Go to Xcode > Preferences > Text Editing > While editing

Xcode preferences screenshot

Thanh Nguyen
  • 5,174
  • 11
  • 43
  • 74
Martin Stolz
  • 5,176
  • 3
  • 21
  • 19
  • 21
    This setting only trims a line's trailing whitespace after the cursor has left that line. So, it still allows you to save a file with one line of trailing whitespace, if the cursor is on that line upon save. – ma11hew28 Jul 14 '13 at 22:38
  • 8
    Why on earth is this not the default? If you have an existing file with trailing whitespace, just mark all, cut, save, paste, save. – friederbluemle Aug 05 '14 at 18:02
  • This needs to override the hacky script solution on this answer. – Urda Mar 21 '15 at 23:12
  • 8
    Using this + `ctrl-i` on all existing files takes care of trailing whitespaces – Alexis C. Dec 18 '15 at 10:50
  • The feature is still listed in 13.3 but it does not work, or at least does not work reliably. It's common to find trailing whitespace throughout files after editing. –  Mar 20 '22 at 18:31
25

I'm using the Google Toolbox For Mac Xcode Plugin, it adds a "Correct whitespace on save" parameter that trim trailing whitespace on save. I missed that a lot from emacs.

Maxime
  • 2,048
  • 1
  • 27
  • 38
  • 1
    I'm using this plugin as well. It does what it says. – Nathan Sep 08 '10 at 02:57
  • Would be perfect, unfortunately it does not work on Xcode 4 at the moment :( – deepwell Sep 13 '11 at 17:31
  • 6
    We now have some basic Xcode 4 support. See our [new plugin](http://code.google.com/p/google-toolbox-for-mac/downloads/detail?name=GTMXcode4Plugin.4_0_0.zip) – dmaclach Nov 13 '11 at 05:48
  • 1
    Where can I find the "Correct whitespace on save" parameter? – jhasse Apr 02 '12 at 10:19
  • I finally managed to get GTM working on Xcode 4.3.2, but the installation instructions from the GTM wiki seemed to be invalid. Instead of placing the .xcplugin in `~/Library/Application Support/Developer/Shared/Xcode/Plug-ins` (as per Google's instructions) I had to put it in `/Applications/Xcode.app/Contents/PlugIns` and restart Xcode. – Kristofer Sommestad May 16 '12 at 09:56
  • @KristoferSommestad Followed your instructions for the same Xcode version (build 4E2002), but couldn't find "Correct whitespace on save" anywhere in the preferences despite of the fact that "About GTM Xcode Plugin" does appear under "Xcode" in the main menu.. – Desmond Hume May 24 '12 at 12:40
  • No, me neither Desmond. But there's an option to strip all ws in the Edit menu, iirc. And a short command for it too. – Kristofer Sommestad May 24 '12 at 19:58
  • @DesmondHume unfortunately the "Correct whitespace on save" preference is only available in GTMXcodePlugin for XCode 3.x. Since XCode 4, I'm using a custom script (called by my Makefile) to remove trailing whitespaces – Maxime May 26 '12 at 13:09
  • I installed the plugin as per the instructions on the GTM site, and it worked as soon as I restarted Xcode, using Xcode 4.3.3 on Mac OS X 10.7. – Michael Baltaks Jul 03 '12 at 15:03
24

You can create a script and bind it to a keyboard shortcut:

  • Select Scripts Menu > Edit User Scripts...
  • Press the + button and select New Shell Script
  • Give it a name like "Strip Trailing Spaces", and give it a shortcut like ⌃⇧R.
  • Set Input to "Selection" and Output to "Replace Selection"

Then enter the following script:

#!/usr/bin/perl

while (<>) {
    s/\s+$//;
    print "$_\n";
}
Darren
  • 25,520
  • 5
  • 61
  • 71
  • 10
    Ah, yes, so simple... Thanks. Is there any way to associate this with file save? – Alexander Gladysh Sep 08 '09 at 07:21
  • To work on an entire file (which is probably what you would want to do), set Input to "Entire Document" and Output to "Replace Document Contents." However, this leaves the cursor at the bottom of the file. – SMBiggs Aug 30 '12 at 06:10
  • 9
    This answer is obsolete as of Xcode 4.4. See the answer by Martin Stolz. – Basil Bourque Nov 15 '12 at 03:07
9

I find using the new Automatically trim trailing whitespace -> Including whitespace-only lines as suggested by @MartinStolz works well while editing but I sometimes need to do Cmd + a -> Ctrl + i and save the file multiple times with the file in focus when I'm not editing.

In case you want to clean a whole project (excluding .md files) without using scripts, you can also do a Find & Replace -> Regular Expression. Since this technique removes trailing space and tabs for documentation/comments as well, you can also try a negative lookahead for blacklisted characters to filter out single-line comments.

Find all trailing whitespace:

[\t ]+$

Find trailing whitespace without touching single-line comments:

^(?!.*\\\\)[\t ]+$

Replace:

<nothing>

So linting can also be done without swiftlint autocorrect or similar third party solutions.

Pranav Kasetti
  • 8,770
  • 2
  • 50
  • 71
3

For Xcode 8, I installed the swimat Xcode plug-in, for formatting Swift code, which removed all trailing spaces and whitespace-only lines.

Installation Methods

  1. Install via homebrew-cask:

    brew cask install swimat
    
  2. Download the App directly:
    https://github.com/Jintin/Swimat/releases/download/v1.3.5/Swimat.zip

  3. Clone extension branch and archive to Mac App.

Usage

Once installed, you can run Swimat in Xcode via Editor -> Swimat -> Format.

moollaza
  • 480
  • 7
  • 8
1

This is not possible in Xcode 3.2

Edit:

I answered this question so briefly because there's no way to do this properly.

Of course, since it's software, you can do anything: Starting with Input Manager hacks or other ways of code injection to system wide keyboard interception, you can alter your local system to do anything anytime. You could set up an Applescript folder action (arrgh) or use a launch demon and the FSEvents facility to watch your source code files.

You can also add a couple of scripts to Xcode (user scripts in the menu, script phases in targets, custom Actions in the organizer, there's even the very unknown possibility a startup script), but all these solutions are flawed, since it involves the user or custom setup on the user's machine.

I'm not aware of a solution which simply works after checking out a project from SCM. I believe that there's need for this and similar customization scripts, so I filed a bug (radar 7203835, "Feature: more user script triggers in Xcode workflow"). I did not receive any feedback yet.

Here's the full text of the radar entry:

It would be useful to have more places to run scripts in Xcode.

Examples:

  1. Pre build scripts
    Pre build scripts could be used to build prerequisites like *.xcconfig files or config.h headers. This is not possible with a "Run Script Build phases", since dependency tracking takes place before any build phase is triggered.

  2. Post build scripts
    Similar to above, but running after the build finished (including code signing etc). Useful for additional packaging, validity checking etc.

  3. Pre/Post SCM Commit scripts.
    To check project integrity.

  4. Pre/Post File Save Script.
    To check/alter a file before saving. E.g. run cody beautifiers

  5. Custom project actions.
    I'm aware of the organizer's ability to define arbitrary actions. But this is a per user feature (not part of the project). I'd like to define actions like build or clean that show up in the build menu and that are part of a project.

Nikolai Ruhe
  • 81,520
  • 17
  • 180
  • 200
1

See here for Xcode4: http://www.wezm.net/technical/2011/08/strip-trailing-whitespace-xcode-4/

Cool, Google toolbox for Mac now adds a "trim whitespace" option for Xcode4.

http://code.google.com/p/google-toolbox-for-mac/downloads/list

Thanks you, Google!

gregschlom
  • 4,825
  • 4
  • 28
  • 23
0

The best and easy way without using scripts, hacks and much more. Just go to Find And Replace and press alt/option + space and press space button in the replace bar and then click on replace all. It will replace the whitespaces with normal spaces and the warning/ error will be gone !!

iminiki
  • 2,549
  • 12
  • 35
  • 45
h2zee
  • 1
  • 1
0

One way not perfect but it's working is to use Find and Replace. Find double space and replace with nothing. And after that Command+A and Control+I.

As I said is not perfect maybe you need to fix something, but for me worked.

zdravko zdravkin
  • 2,090
  • 19
  • 21