whitespace control for comments
diff --git a/include/inja/config.hpp b/include/inja/config.hpp
index 35ea2a5..01bfa6d 100644
--- a/include/inja/config.hpp
+++ b/include/inja/config.hpp
@@ -25,7 +25,9 @@
   std::string expression_close {"}}"};
   std::string expression_close_force_rstrip {"-}}"};
   std::string comment_open {"{#"};
+  std::string comment_open_force_lstrip {"{#-"};
   std::string comment_close {"#}"};
+  std::string comment_close_force_rstrip {"-#}"};
   std::string open_chars {"#{"};
 
   bool trim_blocks {false};
@@ -54,6 +56,9 @@
     if (open_chars.find(comment_open[0]) == std::string::npos) {
       open_chars += comment_open[0];
     }
+    if (open_chars.find(comment_open_force_lstrip[0]) == std::string::npos) {
+      open_chars += comment_open_force_lstrip[0];
+    }
   }
 };
 
diff --git a/include/inja/environment.hpp b/include/inja/environment.hpp
index ea21efe..2b6248b 100644
--- a/include/inja/environment.hpp
+++ b/include/inja/environment.hpp
@@ -73,7 +73,9 @@
   /// Sets the opener and closer for template comments
   void set_comment(const std::string &open, const std::string &close) {
     lexer_config.comment_open = open;
+    lexer_config.comment_open_force_lstrip = open + "-";
     lexer_config.comment_close = close;
+    lexer_config.comment_close_force_rstrip = "-" + close;
     lexer_config.update_open_chars();
   }
 
diff --git a/include/inja/lexer.hpp b/include/inja/lexer.hpp
index 3be56fa..158f8b2 100644
--- a/include/inja/lexer.hpp
+++ b/include/inja/lexer.hpp
@@ -28,6 +28,7 @@
     StatementStartForceLstrip,
     StatementBody,
     CommentStart,
+    CommentStartForceLstrip,
     CommentBody,
   };
 
@@ -243,7 +244,7 @@
     }
 
     if (pos < m_in.size()) {
-      char ch = m_in[pos];
+      const char ch = m_in[pos];
       if (ch == '\n') {
         pos += 1;
       } else if (ch == '\r') {
@@ -258,7 +259,7 @@
   static nonstd::string_view clear_final_line_if_whitespace(nonstd::string_view text) {
     nonstd::string_view result = text;
     while (!result.empty()) {
-      char ch = result.back();
+      const char ch = result.back();
       if (ch == ' ' || ch == '\t') {
         result.remove_suffix(1);
       } else if (ch == '\n' || ch == '\r') {
@@ -331,8 +332,13 @@
           must_lstrip = config.lstrip_blocks;
         }
       } else if (inja::string_view::starts_with(open_str, config.comment_open)) {
-        state = State::CommentStart;
-        must_lstrip = config.lstrip_blocks;
+        if (inja::string_view::starts_with(open_str, config.comment_open_force_lstrip)) {
+          state = State::CommentStartForceLstrip;
+          must_lstrip = true;
+        } else {
+          state = State::CommentStart;
+          must_lstrip = config.lstrip_blocks;
+        }
       } else if ((pos == 0 || m_in[pos - 1] == '\n') && inja::string_view::starts_with(open_str, config.line_statement)) {
         state = State::LineStart;
       } else {
@@ -385,6 +391,11 @@
       pos += config.comment_open.size();
       return make_token(Token::Kind::CommentOpen);
     }
+    case State::CommentStartForceLstrip: {
+      state = State::CommentBody;
+      pos += config.comment_open_force_lstrip.size();
+      return make_token(Token::Kind::CommentOpen);
+    }
     case State::ExpressionBody:
       return scan_body(config.expression_close, Token::Kind::ExpressionClose, config.expression_close_force_rstrip);
     case State::LineBody:
@@ -393,16 +404,21 @@
       return scan_body(config.statement_close, Token::Kind::StatementClose, config.statement_close_force_rstrip, config.trim_blocks);
     case State::CommentBody: {
       // fast-scan to comment close
-      size_t end = m_in.substr(pos).find(config.comment_close);
+      const size_t end = m_in.substr(pos).find(config.comment_close);
       if (end == nonstd::string_view::npos) {
         pos = m_in.size();
         return make_token(Token::Kind::Eof);
       }
+
+      // Check for trim pattern
+      const bool must_rstrip = inja::string_view::starts_with(m_in.substr(pos + end - 1), config.comment_close_force_rstrip);
+
       // return the entire comment in the close token
       state = State::Text;
       pos += end + config.comment_close.size();
       Token tok = make_token(Token::Kind::CommentClose);
-      if (config.trim_blocks) {
+
+      if (must_rstrip || config.trim_blocks) {
         skip_whitespaces_and_first_newline();
       }
       return tok;
diff --git a/test/test-renderer.cpp b/test/test-renderer.cpp
index 213722c..db6c00c 100644
--- a/test/test-renderer.cpp
+++ b/test/test-renderer.cpp
@@ -214,23 +214,29 @@
     CHECK(env.render("   {{- name -}}   \n   ", data) == "Peter");
     CHECK(env.render("Test\n   {{- name }}   ", data) == "Test\nPeter   ");
     CHECK(env.render("   {{ name }}\n ", data) == "   Peter\n ");
+    CHECK(env.render("{{ name }}{# name -#}    !", data) == "Peter!");
+    CHECK(env.render("   {#- name -#}    !", data) == "!");
 
     // Nothing will be stripped if there are other characters before the start of the block.
     CHECK(env.render(".  {%- if is_happy %}{{ name }}{% endif -%}\n", data) == ".  Peter");
+    CHECK(env.render(".  {#- comment -#}\n.", data) == ".  .");
 
     env.set_lstrip_blocks(true);
+    CHECK(env.render("Hello {{ name }}!", data) == "Hello Peter!");
     CHECK(env.render("   {% if is_happy %}{{ name }}{% endif %}", data) == "Peter");
     CHECK(env.render("   {% if is_happy %}{{ name }}{% endif %}   ", data) == "Peter   ");
     CHECK(env.render("   {% if is_happy %}{{ name }}{% endif -%}   ", data) == "Peter");
     CHECK(env.render("   {%+ if is_happy %}{{ name }}{% endif %}", data) == "   Peter");
     CHECK(env.render("\n   {%+ if is_happy %}{{ name }}{% endif -%}   ", data) == "\n   Peter");
     CHECK(env.render("{% if is_happy %}{{ name }}{% endif %}\n", data) == "Peter\n");
+    CHECK(env.render("   {# comment #}", data) == "");
 
     env.set_trim_blocks(true);
     CHECK(env.render("{% if is_happy %}{{ name }}{% endif %}", data) == "Peter");
     CHECK(env.render("{% if is_happy %}{{ name }}{% endif %}\n", data) == "Peter");
     CHECK(env.render("{% if is_happy %}{{ name }}{% endif %}   \n.", data) == "Peter.");
     CHECK(env.render("{%- if is_happy %}{{ name }}{% endif -%}   \n.", data) == "Peter.");
+    CHECK(env.render("   {# comment #}   \n.", data) == ".");
   }
 }