diff --git a/pyls/plugins/pycodestyle_lint.py b/pyls/plugins/pycodestyle_lint.py
index 668096d..2a5baab 100644
--- a/pyls/plugins/pycodestyle_lint.py
+++ b/pyls/plugins/pycodestyle_lint.py
@@ -21,12 +21,29 @@ def pyls_lint(config, document):
     conf_to_use = pycodestyle_conf if pycodestyle_conf else pep8_conf
 
     conf = {k.replace("-", "_"): v for k, v in conf_to_use.items()}
-    log.debug("Got pycodestyle config: %s", conf)
 
     # Grab the pycodestyle parser and set the defaults based on the config we found
     parser = pycodestyle.get_parser()
     parser.set_defaults(**conf)
-    opts, _args = parser.parse_args([])
+
+    # Override with any options set in the language server config
+    argv = []
+    ls_conf = config.plugin_settings('pycodestyle')
+    if ls_conf.get('exclude') is not None:
+        argv.extend(['--exclude', ','.join(ls_conf['exclude'])])
+    if ls_conf.get('filename') is not None:
+        argv.extend(['--filename', ','.join(ls_conf['filename'])])
+    if ls_conf.get('select') is not None:
+        argv.extend(['--select', ','.join(ls_conf['select'])])
+    if ls_conf.get('ignore') is not None:
+        argv.extend(['--ignore', ','.join(ls_conf['ignore'])])
+    if ls_conf.get('maxLineLength') is not None:
+        argv.extend(['--max-line-length', str(ls_conf['maxLineLength'])])
+    if ls_conf.get('hangClosing'):
+        argv.extend(['--hang-closing'])
+
+    opts, _args = parser.parse_args(argv)
+    log.debug("Got pycodestyle config: %s", opts)
     styleguide = pycodestyle.StyleGuide(vars(opts))
 
     c = pycodestyle.Checker(
diff --git a/vscode-client/package.json b/vscode-client/package.json
index b75ce25..5c8b285 100644
--- a/vscode-client/package.json
+++ b/vscode-client/package.json
@@ -70,6 +70,52 @@
                     "default": true,
                     "description": "Enable or disable the plugin."
                 },
+                "pyls.plugins.pycodestyle.exclude": {
+                    "type": "array",
+                    "default": null,
+                    "items": {
+                        "type": "string"
+                    },
+                    "uniqueItems": true,
+                    "description": "Exclude files or directories which match these patterns."
+                },
+                "pyls.plugins.pycodestyle.filename": {
+                    "type": "array",
+                    "default": null,
+                    "items": {
+                        "type": "string"
+                    },
+                    "uniqueItems": true,
+                    "description": "When parsing directories, only check filenames matching these patterns."
+                },
+                "pyls.plugins.pycodestyle.select": {
+                    "type": "array",
+                    "default": null,
+                    "items": {
+                        "type": "string"
+                    },
+                    "uniqueItems": true,
+                    "description": "Select errors and warnings"
+                },
+                "pyls.plugins.pycodestyle.ignore": {
+                    "type": "array",
+                    "default": null,
+                    "items": {
+                        "type": "string"
+                    },
+                    "uniqueItems": true,
+                    "description": "Ignore errors and warnings"
+                },
+                "pyls.plugins.pycodestyle.hangClosing": {
+                    "type": "boolean",
+                    "default": null,
+                    "description": "Hang closing bracket instead of matching indentation of opening bracket's line."
+                },
+                "pyls.plugins.pycodestyle.maxLineLength": {
+                    "type": "number",
+                    "default": null,
+                    "description": "Set maximum allowed line length."
+                },
                 "pyls.plugins.pydocstyle.enabled": {
                     "type": "boolean",
                     "default": false,

Custom pycodestyle configuration via xcode/Atom settings
It would be really great to configure the ignored error codes and the maximum line length of `pycodestyle` via the settings if no configuration file is found on the system.

This is the most requested issue on the Atom package for `pyls`: https://github.com/lgeiger/ide-python/issues/9
diff --git a/test/plugins/test_lint.py b/test/plugins/test_lint.py
index a760c68..a02d992 100644
--- a/test/plugins/test_lint.py
+++ b/test/plugins/test_lint.py
@@ -96,6 +96,12 @@ def test_pycodestyle_config(workspace):
 
         os.unlink(os.path.join(workspace.root_path, conf_file))
 
+    # Make sure we can ignore via the PYLS config as well
+    config.update({'plugins': {'pycodestyle': {'ignore': ['W191']}}})
+    # And make sure we don't get any warnings
+    diags = pycodestyle_lint.pyls_lint(config, doc)
+    assert not [d for d in diags if d['code'] == 'W191']
+
 
 def test_pydocstyle():
     doc = Document(DOC_URI, DOC)

pip install -e .[test]
parse_log_pytest
requirements.txt
pytest pytest-cov coverage
3.9
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
cachetools==5.5.2
chardet==5.2.0
colorama==0.4.6
configparser==7.2.0
coverage==7.8.0
distlib==0.3.9
exceptiongroup==1.2.2
filelock==3.18.0
future==1.0.0
iniconfig==2.1.0
jedi==0.19.2
json-rpc==1.15.0
mccabe==0.7.0
packaging==24.2
parso==0.8.4
platformdirs==4.3.7
pluggy==1.5.0
pycodestyle==2.13.0
pydocstyle==6.3.0
pyflakes==3.3.1
pyproject-api==1.9.0
pytest==8.3.5
pytest-cov==6.0.0
-e git+https://github.com/palantir/python-language-server.git@a1bbd401621f8fc3083f4341b7912b491e82bf68#egg=python_language_server
snowballstemmer==2.2.0
tomli==2.2.1
tox==4.25.0
typing_extensions==4.13.0
versioneer==0.29
virtualenv==20.29.3
yapf==0.43.0

name: python-language-server
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - cachetools==5.5.2
      - chardet==5.2.0
      - colorama==0.4.6
      - configparser==7.2.0
      - coverage==7.8.0
      - distlib==0.3.9
      - exceptiongroup==1.2.2
      - filelock==3.18.0
      - future==1.0.0
      - iniconfig==2.1.0
      - jedi==0.19.2
      - json-rpc==1.15.0
      - mccabe==0.7.0
      - packaging==24.2
      - parso==0.8.4
      - platformdirs==4.3.7
      - pluggy==1.5.0
      - pycodestyle==2.13.0
      - pydocstyle==6.3.0
      - pyflakes==3.3.1
      - pyproject-api==1.9.0
      - pytest==8.3.5
      - pytest-cov==6.0.0
      - snowballstemmer==2.2.0
      - tomli==2.2.1
      - tox==4.25.0
      - typing-extensions==4.13.0
      - versioneer==0.29
      - virtualenv==20.29.3
      - yapf==0.43.0
prefix: /opt/conda/envs/python-language-server

test/plugins/test_lint.py::test_pycodestyle_config
test/plugins/test_lint.py::test_pydocstyle
test/plugins/test_lint.py::test_mccabe test/plugins/test_lint.py::test_pycodestyle test/plugins/test_lint.py::test_pyflakes test/plugins/test_lint.py::test_syntax_error_pyflakes
pyls/plugins/pycodestyle_lint.py vscode-client/package.json
pyls/plugins/pycodestyle_lint.py vscode-client/package.json