Использование VIM для исправления плохо отформатированного кода - PullRequest
2 голосов
/ 25 августа 2011

У меня есть этот фрагмент кода, который мне нужен для «форматирования / отступа». Можете ли вы предложить исправление?

import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class PrimeSearcher extends HttpServlet implements Runnable { long lastprime = 0; // last prime found Date lastprimeModified = new Date(); // when it was found Thread searcher; // background search thread public void init(ServletConfig config) throws ServletException { super.init(config); // always! searcher = new Thread(this); searcher.setPriority(Thread.MIN_PRIORITY); // be a good citizen searcher.start(); } public void run() { // QTTTBBBMMMTTTOOO long candidate = 1000000000000001L; // one quadrillion and one // Begin loop searching for primes while (true) { // search forever if (isPrime(candidate)) { lastprime = candidate; // new prime lastprimeModified = new Date(); // new "prime time" } candidate += 2; // evens aren't prime // Between candidates take a 0.2 second break. // Another way to be a good citizen with system resources. try { searcher.sleep(200); } catch (InterruptedException ignored) { } } } private static boolean isPrime(long candidate) { // Try dividing the number by all odd numbers between 3 and its sqrt double sqrt = Math.sqrt(candidate); for (long i = 3; i <= sqrt; i += 2) { if (candidate % i == 0) return false; // found a factor } // Wasn't evenly divisible, so it's prime return true; } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/plain"); PrintWriter out = res.getWriter(); if (lastprime == 0) { out.println("Still searching for first prime..."); } else { out.println("The last prime discovered was " + lastprime); out.println(" at " + lastprimeModified); } } public void destroy() { searcher.stop(); } }

Ответы [ 4 ]

7 голосов
/ 25 августа 2011

Разрыв строки в скобках:

:%s/[{}]/\r&\r/g

Разрыв строки после точки с запятой:

:%s/;/&\r/g

Удалить пустые строки:

:g/^\s*$/d

Отступ:

:set ft=java
gg=G

После этого вам нужно немного подправить код, чтобы разделить комментарии.


import java.io.;
import java.util.;
import javax.servlet.;
import javax.servlet.http.;
public class PrimeSearcher extends HttpServlet implements Runnable 
{
    long lastprime = 0;
    // last prime found Date lastprimeModified = new Date();
    // when it was found Thread searcher;
    // background search thread public void init(ServletConfig config) throws ServletException 
    {
        super.init(config);
        // always! searcher = new Thread(this);
        searcher.setPriority(Thread.MIN_PRIORITY);
        // be a good citizen searcher.start();
    }
    public void run() 
    {
        // QTTTBBBMMMTTTOOO long candidate = 1000000000000001L;
        // one quadrillion and one // Begin loop searching for primes while (true) 
        {
            // search forever if (isPrime(candidate)) 
            {
                lastprime = candidate;
                // new prime lastprimeModified = new Date();
                // new "prime time" 
            }
            candidate += 2;
            // evens aren't prime // Between candidates take a 0.2 second break. // Another way to be a good citizen with system resources. try 
            {
                searcher.sleep(200);
            }
            catch (InterruptedException ignored) 
            {
            }
        }
    }
    private static boolean isPrime(long candidate) 
    {
        // Try dividing the number by all odd numbers between 3 and its sqrt double sqrt = Math.sqrt(candidate);
        for (long i = 3;
                i <= sqrt;
                i += 2) 
        {
            if (candidate % i == 0) return false;
            // found a factor 
        }
        // Wasn't evenly divisible, so it's prime return true;
    }
    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException 
    {
        res.setContentType("text/plain");
        PrintWriter out = res.getWriter();
        if (lastprime == 0) 
        {
            out.println("Still searching for first prime...");
        }
        else 
        {
            out.println("The last prime discovered was " + lastprime);
            out.println(" at " + lastprimeModified);
        }
    }
    public void destroy() 
    {
        searcher.stop();
    }
}
3 голосов
/ 25 августа 2011

Вы могли бы по крайней мере начать с замены всех ; на ; + line-break:

:%s/;/;\n\r/g

Тогда вы можете заменить все { на { + line-break:

:%s/{/{\n\r/g

Затем замените все } на } + line-break:

:%s/}/}\n\r/g

Это поможет вам начать. Вам все равно придется вычистить все отступы. Жаль, что нет ReSharper для Java (о котором я все равно знаю).

2 голосов
/ 25 августа 2011

Использование:

http://www.prettyprinter.de/

import java.io.;
import java.util.;
import javax.servlet.;
import javax.servlet.http.;
public class PrimeSearcher extends HttpServlet implements Runnable {
    long lastprime = 0;
    // last prime found Date lastprimeModified = new Date();
    // when it was found Thread searcher;
    // background search thread public void init(ServletConfig config) throws                 ServletException {
    super.init(config);
    // always! searcher = new Thread(this);
    searcher.setPriority(Thread.MIN_PRIORITY);
    // be a good citizen searcher.start();

}
public void run() {
    // QTTTBBBMMMTTTOOO long candidate = 1000000000000001L;
    // one quadrillion and one // Begin loop searching for primes while (true) {
        // search forever if (isPrime(candidate)) {
            lastprime = candidate;
            // new prime lastprimeModified = new Date();
            // new "prime time"
        }
        candidate += 2;
        // evens aren't prime // Between candidates take a 0.2 second break. // Another way to be a good citizen with system resources. try {
            searcher.sleep(200);

        }
        catch (InterruptedException ignored) {

        }

    }

}
private static boolean isPrime(long candidate) {
    // Try dividing the number by all odd numbers between 3 and its sqrt double sqrt = Math.sqrt(candidate);
    for (long i = 3;
    i &lt;
    = sqrt;
    i += 2) {
        if (candidate % i == 0) return false;
        // found a factor
    }
    // Wasn't evenly divisible, so it's prime return true;

}
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
    res.setContentType("text/plain");
    PrintWriter out = res.getWriter();
    if (lastprime == 0) {
        out.println("Still searching for first prime...");

    }
    else {
        out.println("The last prime discovered was " + lastprime);
        out.println(" at " + lastprimeModified);

    }

}
public void destroy() {
    searcher.stop();

}

}

Настройте параметры, чтобы они выглядели так, как вы хотите.

0 голосов
/ 25 августа 2011

Вероятно, вам лучше поступить следующим образом:

  • Добавить разрывы строк после таких символов, как ;, { и }:

    :s/[;{}]/\0\r/g
    
  • Просмотрите код и исправьте неправильные разрывы строк.Например, строки комментариев, начинающиеся с //, обычно не заканчиваются каким-либо специальным символом и требуют ручного разбиения

  • Исправьте отступ с помощью =.Используйте его с какой-нибудь командой перемещения, например =G, или выберите код в визуальном режиме, а затем нажмите =, чтобы сделать отступ.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...